Unreal Engineトップへ戻る

目次

  1. 用語一覧
  2. ナビゲーションとAIコントローラ
  3. 初めての配列
  4. 一歩進んだ配列アクセス
  5. ゲームへの組み込み

用語一覧

ナビゲーションとAIコントローラ

テストマップの準備

  1. 新しいレベルを[Default]テンプレートで作成し、[コンテンツ>Maps>Test]のパスに「Test_Enemy_Navigation」という名前で保存。
  2. 中央に置く障害物の邪魔になるため、マップ中央にある[PlayerStart]を「X=-350,Y=0,Z=112」の位置まで移動させる。
  3. [モード]パネルから、[BSP]>[ボックス]をワールド原点(X=0,Y=0,Z=100)に配置。 大きさはデフォルトのまま。
  4. 続いて、[ボリューム]>[Nav Mesh Bounds Volume]をワールド原点(X=0,Y=0,Z=0)の位置へ追加し、 こちらは[Brush Setting(ブラシ設定)]の[X]と[Y]を「1000」、[Z]を「200」に設定して、マップ全体を包み込むようにする。
  5. ツールバーの[ビルド]ボタンの横にある[▼]ボタンをクリックし、サブメニューから[パスをビルド]を選択する。これにより、実際のナビメッシュが生成される。
  6. ナビメッシュの可視/不可視を切り替えて、うまくナビメッシュが可視化されているか確認。 ナビメッシュの可視/不可視は、ビューポートの[表示]ボタンをクリックし、サブメニューから[Navigation]を選択するか、キーボードショートカットの[P]キーで切り替えることができる。
  7. [モード]パネルから[全てのクラス]>[ターゲットポイント]を「X=350,Y=-350,Z=20」のあたりに配置し、名前を「TP1」に変更する。ナビメッシュは壁や谷底に対しては一定の距離を置いて生成されるため、あまりぎりぎりに置くとナビメッシュから外れてしまう。
  8. コンテンツブラウザから、[コンテンツ>Blueprints]フォルダにある[PNPawn_Rabbit]を、[TP1]の対角にあたる「X=-350,Y=350,Z=64」のあたりに配置する。

ポーンとコントローラの関係の復習

AIコントローラを作る

  1. [コンテンツ]の直下に、「AI」という名前の新しいフォルダを作成。
  2. [コンテンツ>AI]に新しいクラスブループリントを作成し、[親クラスを選択]ダイアログで、[全てのクラス]のツリーの先にある[Object]>[Actor]>[Controller]>[AIControoler]を選択して、[選択]ボタンを押す。作成したAIコントローラに「PNAIController」と名付ける。
  3. [PNPawn_Rabbit]のブループリントエディタを開く。すでに1体マップに配置しているので、ここから直接ブループリントエディタを開く。マップ上の[PNPawn_Rabbit]を選択し、k[詳細]パネルの[ブループリントを編集]ボタンを押して、サブメニューから[ブループリントエディタを開く]を選択する。
  4. [コンポーネント]パネルで一番上の[PNPawn_Rabbit(セルフ)]を選択し、[詳細]パネルで[Pawn]>[AI Controller Class]プロパティに[PNAIController]を割り当てる。
  5. [コンパイル]を行う。

AI MoveToで目的地へ移動させる

  1. レベルブループリントからマップ上の[PNRabbit_Pawn]を参照することになるので、先にマップ上で[PNRabbit_Pawn]を選択しておき、ツールバーからレベルブループリントを開く。
  2. 設置済みの[Begin Play]イベントノードの実行出力ピンからワイヤーを伸ばし、[AI]>[AI MoveTo]を選んでノードを設置する。
  3. [AI MoveTo]ノードの左下あたりの空きスペースを右クリックし、アクションリストから[PNPawn_Rabbitへのリファレンスを作成]を選択して参照ノードを置き、この出力ピンを[AI MoveTo]ノードの[Pawn]入力ピンに接続する。
  4. レベルエディタ側で[TP1]を選択しておき、レベルブループリント上にリファレンス(参照)ノードを設置(右クリックして、[TP1のリファレンスを作成]を選択)して、それを[AI MoveTo]の[Target Actor]ノードに接続する。
  5. [コンパイル]する。

レベルエディタに戻り、[シミュレート]でテストプレイ。
キャラがマップを斜めに横断して移動を開始すれば成功。

初めての配列

変数を配列化し、値をセットする

  1. レベルブループリントを開いて、不要になる[AI MoveTo]ノードを削除。
  2. [PNPawn_Rabbit]のブループリントを開く。
  3. [マイブループリント]パネルから変数を追加する。[名前]に「PatrolPoints」と入力し、[変数の種類]を[Actor]に設定する。
  4. [変数の種類]の右横にある青いボタン(以下、配列化ボタン)を押す。これにより、この変数は「配列変数」と呼ばれる特殊な変数になる。
  5. [編集可能]にチェックを入れ、レベルエディタでこの変数に値を指定できるようにする。[カテゴリ]に「AI」と入力。
  6. [コンパイル]する。
  7. レベルエディタに戻り、マップ上にある[TP1]を[Alt]キーを押しながらドラッグする「複製移動」で、「TP2」を「X=-350,Y=-350,Z=20」に配置する。同様にして、4隅にターゲットポイントを配置する。(TP3「X=-350,Y=350,Z=20」、TP4「X=350,Y=350,Z=20」)
  8. 巡回ポイント[TP1]~[TP4]の順番で[PNRabbit_Pawn]の配列にセットしていく。
    まずは、マップ上の[PNPawn_Rabbit]をクリックし、[詳細]パネルの[AI]>[Patrol Points]プロパティを探す。
  9. デフォルトでは[Patrol Points]のサイズはゼロになっているため、何も設定できないが、横にある[+]アイコンをクリックすると、入力スロットが1つ増える。
    4回押して、入力欄を4つに増やす。
  10. [AI]>[Patrol Points]>[0]の入力スロットの横にあるスポイトアイコンをクリックしてスポイトモードにすると、マップ上のアクタをクリックで指定できるようになる。
    マップ上の[TP1]にスポイトカーソルを当ててクリックする。[TCPawn_Rabbit]とターゲットポイントが異なるレベルに存在しているとセットできないので、うまくいかないときはこれまでの操作を見直す。
  11. 同じ要領で、[1]~[3]に[TP2]~[TP4]を割り当てる。

配列のコピー

  1. AI側にも配列を用意する。[コンテンツ>AI]フォルダにある[PNAIController]のブループリントを開き、[マイブループリント]パネルから変数を追加し、「AI_PatrolPoints」と名付ける。[変数の種類]を[Actor]に設定し、配列アイコンを押して、配列にする。
  2. [Begin Play]ノード近くの空きスペースを右クリックして、[Pawn」>[Get Controller Pawn]を設置する。
  3. [PNPawn_Rabbit]固有の変数にアクセスするためには、キャスティングが必要。[Get Controlled Pawn]ノードの出力ピンからワイヤーを伸ばして、[ユーティリティ]>[キャスティング]>[PNPawn_Rabbitへキャスト]を選択し、設置されたノードの実行入力ピンを[Begin Play]ノードの実行出力ピンへつなぐ。
  4. キャストノードの[As PNPawn Rabbit]出力ピンからワイヤーを伸ばし、[変数]>[AI]>[Get Patrol Points]を選択する。
  5. [PNRabbit_Pawn]側の配列は取得できるようになったので、これを[PNAIController]側の配列にセットする。[マイブループリント]パネルから[変数]>[AI_PatrolPoints]を、キーボードの[Alt]キーを押しながらグラフ上にドラッグ&ドロップして[SET]ノードを設置。
  6. [SET]ノードの実行入力ピンと[PNPawn_Rabbitへキャスト]ノードの実行出力ピンを繋ぐ。[Get Patrol Points]ノードの出力ピンと[SET]ノードの[AI Patrol Points]入力ピンを繋ぐ。
  7. [コンパイル]する。

初めての配列アクセス

  1. [PNAIController]のブループリント作業を続ける。
  2. [Event Graph]の空きスペースに、新しいカスタムイベント「GoToPatrol」を作り、その出力ピンからワイヤーを伸ばして、[AI]>[AI MoveTo]の[Pawn]入力ピンにつなぐ。
  3. 手順3で設置したノードの左下に[マイブループリント]パネルから[変数]>[AI_PatrolPoints]の取得ノードを設置。
  4. [AI_PatrolPoints]ノードの出力ピンからワイヤーを伸ばし、[Utilities]>[Array]>[Get]を選択。
  5. [Get]ノードのインデックス番号を設定する。2番目の値にアクセスしたいので、「1」と設定。
  6. [Get]ノードの出力ピンを[AI MoveTo]ノードの[TargetActor]入力ピンに接続。
  7. [Begin Play]ノードのネットワークに戻り、[マイブループリント]パネルから、[グラフ]>[GoToPatrol]を、終点の[Set]ノードの右側にドラッグ&ドロップし、実行ピンを接続します。
  8. [コンパイル]する。

レベルエディタに戻り、ゲームをテストプレイしてみる。敵キャラが[TP2]に向けて移動すれば成功。

一歩進んだ配列アクセス

配列のインデックスを変数化する

  1. [PNAIController]のブループリントエディタで続きの作業に入る。
  2. [GoToPatrol]ノードのネットワークに組み込まれた[Get]ノードの整数入力ピンからワイヤーを左に伸ばし、アクションリストから[変数へ昇格]を選択。
  3. 追加された[New Var]ノードを選択し、[詳細]パネルで[名前]を「Patrol Index」に変更して、[コンパイル]を行う。
  4. 一度コンパイルすると、デフォルト値が設定できるようになるため、これを「0」に設定する。
  5. 位置の情報でやり取りを行う形に変えるため、[Get]ノードの出力ピンからワイヤーを伸ばし、[Utilities]>[Transformation]>[Get Actor Location]を選択し、追加したノードの出力ピンを[AIMoveTo]ノードの[Destination]入力ピンにつなぐ。さらに、元々つながっていた[Get]ノードと[TargetActor]入力ピンの間のワイヤーを切断しておく。
  6. [コンパイル]を行い、レベルエディタに戻り、テストプレイをする。[TP1]へ敵キャラが移動するようになっている。
  7. [PNAIController]のブループリントエディタに戻り、関数化を行う。[AIPatrol Points][Patrol Index][Get][Get Actor Location]の、4つのノードを選択し、右クリックして[関数に折りたたむ]を選択。
  8. [マイブループリント]パネルから、[関数]>[New Function 0]を選択し、[F2]キーかサブメニューを使って、名前を「GetPatrolLocation」に変更し、[詳細]パネルで[純粋]にチェックを入れる。
  9. [コンパイル]する。

レベルエディタに戻り、ゲームをテストプレイする。手順6のテストプレイと同様に、敵キャラが[TP1]へ向かって移動するはず。

剰余のテクニック―インデックスを反復させる

  1. [PNAIController]のブループリントエディタに戻り、[マイブループリント]パネルから新しい関数を追加し、「PopPatrolLocation」と名付ける。この関数をダブルクリックし、関数のグラフを開く。
  2. 関数の開始ノードである[Pop Patrol Location]ノードの近くに、[マイブループリント]パネルから[変数]>[Patrol Index]をドラッグ&ドロップして、取得(Get)ノードと設定(Set)ノードをそれぞれ配置。
  3. [Patrol Index]取得ノードからワイヤーを伸ばし、[Math]>[Integer]>[Integer + Integer]を選択し、「1」を加算するように下側の入力ピン([B]ピン)に設定。
  4. [+]ノードの出力ピンからワイヤーを伸ばし、[Math]>[Integer]>[%(Integer)]を選択。
  5. [マイブループリント]パネルから[変数]>[AI_PatrolPoints]を、[Patrol Index]ノードの下あたりに[Ctrl]キーを押しながらドラッグ&ドロップして、取得ノードを設置。
  6. [AI_PatrolPoints]ノードの出力ピンからワイヤーを伸ばし、[Utilities]>[Array]>[Length]を選択して、追加したノードの出力ピンを[%]ノードの[B]ピンに接続。
  7. [%]ノードの出力ピンを、手順2で設置した[Set]ノードにつなげて、この[Set]ノードの実行入力ピンを、[Pop Patrol Location]の実行出力ピンと接続。
  8. [Event Graph]タブをクリックして、イベントグラフに切り替える。
  9. [AI MoveTo]ノードの[OnSuccess]実行出力ピンからワイヤーを伸ばし、[関数呼び出し]>[Pop Patrol Location]を選択。これにより、移動が完了すると、[Pop Patrol Location]を使ってインデックスを1つ先へ進めるようになる。
  10. 少し待機時間をおいた後、次のパトロールに出かけるようにタイマーを仕込む。[Pop Patrol Location]ノードの実行出力ピンからワイヤーを伸ばし、[Utilities]>[Timer]>[Set Timer by function name]を選択。
  11. 設置された[Set Timer]ノードの[Function Name]ピンに「GoToPatrol」と入力し、[Time]ピンに「1.0」を指定。
  12. [コンパイル]する。

レベルエディタに戻り、テストプレイを行う。ぐるぐると、4か所のパトロールポイントを巡回するようになれば、敵の巡回行動の仕込みは成功。

ゲームへの組み込み

ステージ1を巡回させる

  1. [コンテンツ>Maps>Stage01]フォルダの[PNStage01_Top]マップを読み込んで、「ステージ1」に切り替える。まだ保存していないマップやアセットがある場合はすべて保存しておく。
  2. ビューポートまたは[ワールドアウトライナー]パネルで、[NavMeshBoundsVolume]を選択し、[レベル]パネルの[パーシスタントレベル]上で右クリックして、[選択アクタをこのレベルへ移動]を選択する。
  3. [レベル]パネルで[PNStage01_GB]をダブルクリックして、[現在のレベル]に変更。
  4. [モード]パネルから[全てのクラス]>[ターゲットポイント]をマップの2階にドラッグ&ドロップして「TP1」と名付け、「X=240,Y=0,Z=210」のあたりへ移動させる。
  5. 「TP1」を「X=240,Y=-210,Z=210」あたりへ複製移動。
  6. 「TP3」を「X=-110,Y=-210,Z=210」、「TP4」を「X=-110,Y=0,Z=210」に配置。
  7. コンテンツブラウザで[コンテンツ >Blueprints]から[PNPawn_Rabbit]を2階部分のどこかにドラッグ&ドロップで配置。
  8. 配置した[PNPawn_Rabbit]の[AI]>[Patrol Points]の配列サイズを4つに変更し、先頭から[TP1]~[TP4]を指定する。

設定が終わったら、ゲームをテストプレイしてみる。敵キャラが4点を巡回していたらうまくいっている。しかし、敵キャラの速度をまったく調整していないので、非常に速い。

キャラクターのスペック

  1. [PNPawn_Rabbit]のブループリントエディタを開き、[Ebent Graph]タブをクリックしてイベントグラフに切り替える。
  2. [マイブループリント]パネルから新しい変数を追加し、「WalkGroundSpeed」と名付け、[変数の種類]を[Float]に指定。[カテゴリ]に[Chara Spec]を指定。
  3. 2つ目の変数は複製して作る。[マイブループリント]パネルの[変数]>[Chara Spec]>[Walk Ground Speed]を選択し、[Ctrl]+[W]キーで複製して、「SprintGroundSpeed」と名付ける。
  4. ここで一度[コンパイル]を行う、[Walk Ground Speed]のデフォルト値を「100」、[SprintGroundSpeed]のデフォルト値を「220」に設定。
  5. [コンポーネント]パネルから[Character Movement]を、[Begin Play]ノードの近くにドラッグ&ドロップで配置する。
  6. [Character Movement]ノードの出力ピンからワイヤーを伸ばし、[変数]>[Character Mobvement]>[Set Max Walk Speed]を選択し、設置されたノードと[Begin Play]ノードの実行ピンをつなぐ。
  7. [マイブループリント]パネルから、[変数]>[Chara Spec]>[Walk Ground Speed]変数を[Ctrl]キーを押しながらドラッグ&ドロップし、設置されたノードを[Set]ノードの[Max Walk Speed]入力ピンにつなぐ。
  8. [コンポーネント]パネルの[Character Movement]コンポーネントを選択し、[詳細]パネルで[キャラクター動作(基本設定)]>[Max Acceleration]を「150」に設定する。
  9. [コンパイル]する。

レベルエディタに戻り、ゲームをテストプレイしてみる。ウサギの速度が落ち着いて、少しはマップを攻略しやすくなったはず。

スプリント制御

  1. [PNPawn_Rabbit]のブループリントエディタに戻る。
  2. [マイブループリント]パネルに新しいBooleanタイプの変数「IsSprint」を追加する。
  3. [マイブループリント]パネルから新しい関数「BeginSprint」を追加し、関数のグラフを開く。
  4. 前節でやったように、[Character Movement]コンポーネントの[MaxWalkSpeed]を[SprintGroundSpeed]変数の値で書き換える。
  5. [マイブループリント]パネルから、[IsSprin]変数を[Alt]キーを押しながらドラッグ&ドロップし、[Set Max Walk Speed]ノードの実行出力ピンとつなぐ。[IsSprint]入力ピンにチェックを入れる。
  6. 関数も複製できる[マイブループリント]パネルで[関数]>[BeginSprint]を選択し、右クリックして[複製]を選ぶか、[Ctlr]+[W]キーで複製し、「EndSprint」と名付ける。
  7. [EndSprint]関数をダブルクリックしてグラフを開き、[SprintGroundSpeed]ノードを削除し、代わりに[Walk Ground Speed]変数をつなげる。こちらでは[Is Sprint]をオフにしておく。
  8. [コンパイル]する。

ここまでの作業でプレイヤーコントローラとポーンの切り分けをきちんと作っていないため、動作確認は先送りとなる。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-05 (金) 16:09:31 (660d)