7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【UE4】Nav Link Proxy を使ってAIにジャンプをさせる

Last updated at Posted at 2017-03-27

#はじめに
1.png
図のような段差や穴、壁等を登ったりする際には赤線のような望ましい軌道というのがあると思います。今回はこのような弧を描いたジャンプをAIにさせます。

使用するプロジェクトテンプレートは**「Third Person Template」**です。
プロジェクト名は適当でOKです。

#AI CharacterとAI Controllerの作成
キャラクターを継承したC_Jumper
4.png

AI Controllerを継承したAIC_Jumperを作成します。
5.png

※作成したC_JumperのAI ControllerにAIC_Jumperを設定するのを忘れずに6.png

#Nav Link Proxyの作成
Nav Link Proxyを継承して新しくジャンプ用のNav Link Proxyを作成します。
2.png
名前をJumpLinkProxyとします。
3.png

#C_Jumperキャラクターのブループリント
変数
14.png

BeginPlay
7.png

Tick
8.png

BeginPlayとTickの両関数の処理を作成し終わったら、カスタムイベントを追加します。
9.png

Do Jump RequestイベントのインプットにVector型Dest Locを追加するのを忘れないようにしてください。
このイベントがAIにジャンプをさせる一番大事な所ですが、今は書かずに後に回します。

#JumpLinkProxyのブループリント
10.png

Receive Smart Link Reached はAIがNav Linkのいずれかの両端に到達した時に呼ばれるイベントで、到達した側とは反対にあるNav Linkの位置を返します。
11.png

最後にツールバーにあるクラスのデフォルトをクリックしSmart LinkSmart Link Is Relevantのチェックを入れてください。
12.png

#最初のテスト
とりあえずジャンプはしませんが、一通り処理を呼び出すように作成したのでレベル上にテスト用の地形を作り、JumpLinkProxyを配置して動作確認してみます。
自分は以下のように作ってみました。
13.png

配置したC_Jumperをクリックし詳細パネルでターゲットポイントを両方設定します。
15.png

では、実行してAIの様子を見てみます。

#Nav Link Proxyの罠
如何でしょうか?JumpLinkProxyのイベントやC_Jumperのイベントは呼ばれていますか?恐らくイベントは呼ばれずPrint Stringに設定した文字列は画面上に描画されていないと思います。
ただ、JumpLinkProxyを置いただけではReceive Smart Link Reachedイベントは呼ばれません。
JumpLinkProxyをレベル上に配置したとき、位置を調整するためにダイヤ型のワイヤフレームがついているオブジェクトを移動したはずです。
17.png
これを動かした時はJumpLinkProxyのSimple Linkプロパティの値が変化します。
16.png
実はこのSimple LinkというのはJumpLinkProxyでチェックを入れたSmart Link Is RelevantにあるSmart Linkとは別物のリンクです。
イベントReceive Smart Link Reachedの名前にあるとおり通知を受け取るのはSmart Linkに到達した時ですので、Simple Linkをしっかり設定したとしても、Receive Smart Link Reachedが呼ばれることはありません。

#JumpLinkProxyのプロパティを修正して再度実行確認
では、きちんとReceive Smart Link Reachedが呼ばれるようにレベル上に配置したJumpLinkProxyのプロパティを修正します。
18.png
Simple LinkのLeft、Rightの値をSmart LinkのStart、Endにコピーして貼り付けるだけです。

では実行して動作確認してみます。
今度は画面上にきちんとPrint Stringの文字列が描画されたはずです。
JumpLinkProxyのReceive Smart Link Reachedイベントにブレークポイントを置けば、そこで動作が停止してフォーカスされると思います。

これでReceive Smart Link Reachedイベントが呼ばれるようになり、AIにジャンプをさせる用意が出来ました。

#AIにジャンプをさせる
内容はかなり単純で2つの関数を呼び出すだけです。
19.png
Launch Multのデフォルト値には1.25を設定してください。

関数SuggestProjectileVelocity Custom Arcは面白い関数で、Arcと付いているようにStart PosからEnd Posまでを弧で結びます。その結んだ弧をなぞるような加速度を求める関数です。
20.png

その次にある関数Launch Characterはキャラクターを好きな方向に打ち出す関数です。Projectileとは違い、この関数が動作する対象はキャラクターのみのようです。

SuggestProjectileVelocity Custom Arcで求めた加速度をLauch Characterに渡すことで、ジャンプのような動作を実現できます。

実際に動作を確認してみるとしっかりとジャンプをしてくれるはずです。
asdf.gif

#おわりに
SuggestProjectileVelocity Custom ArcとLauch Characterを使ったAIのジャンプは最近MODツールが発表され、UE4で無料で触れるRoboRecallでの処理を参考にしました。
皆様も是非遊べなくともソースを覗いてみると面白い発見があるかもしれません。

以上です。お疲れ様でした。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?