Unreal Engine(UE)で常にプレイヤーを見続けるNPCを作ってみよう!
戦闘するわけではなく、ただプレイヤーを見続けるだけのモブキャラが欲しいと思ったことはありませんか?
もちろん敵にも応用可能な方法で、実装方法をご紹介します。
※NPCはNon Player Characterの略称で、ゲーム上でプレイヤーが操作しないキャラクターのことです。
動作環境
当記事の動作環境は以下の通りです。
バージョンや環境によっては、正常に動作しない可能性があります。
また、プロジェクトはサードパーソンプロジェクトの使用を前提とします。
【下準備】NPCの作成
まずはNPCを作成していきます。
NPCのブループリントを作成
一般的なキャラクターブループリントで問題ありません。
「Character」を親としたブループリントクラスを作成します。
「メッシュ」欄には対象としたいNPCのキャラクターのメッシュを設定します。
トランスフォームを忘れずに変更しましょう。
NPCをマップに配置
作成したNPCのブループリントをマップに配置しましょう。
ドラッグアンドドロップ(D&D)で配置できます。
アニメーションブループリントの作成
アニメーションブループリントを作成します。
コンテンツブラウザにて、何もない部分を右クリックして、「アニメーション」-「アニメーションブループリント」を選択します。
自作キャラの場合は該当するスケルトンを、特になければ「SK_Mannequin」のスケルトンを選択します。
アニメーションの作成
作成したアニメーションブループリントを開き、次の手順を実行します。
- アセットブラウザから「MM_Idle」をD&D
- 「MM_Idle」を「Output Pose」ノードのResultに接続
- 設定欄の「Loop Animation」にチェックを入れる
作成したアニメクラスをコンパイルして、NPCのブループリントに設定します。
【本題】プレイヤーを見続けるアニメーションの作成
ここからが本題です。
プレイヤーを見続けるアニメーションを作っていきます。
イベントグラフの編集
まずはイベントグラフを編集します。
デフォルトで入っている、「Try Get Pawn Owner」は今回使用しないため、削除しても構いません。
「Event Blueprint Update Animation」ノードからピンを伸ばし、「Cast To BP_ThirdPersonCharacter」を設定します。
「Cast To BP_ThirdPersonCharacter」のobjectからピンを伸ばし、「Get Player Character」を接続します。
「Cast To BP_ThirdPersonCharacter」のAs BP Third Person Characterからピンを伸ばし、「Get Mesh」を接続します。
(Meshで検索すると見つけやすいでしょう)
さらに「Get Mesh」のMeshからピンを伸ばし、「Get Socket Location」を接続します。
「Get Socket Location」のReturn Valueを右クリックして変数へ昇格させます。
するとセットノードが出現します。
「セットノード」と「Cast To BP_ThirdPersonCharacter」ノードを接続します。
アニメグラフの編集
次に、アニメグラフを編集します。
MM_IdleとOutput Poseの間に「Look At」ノードを追加します。
ノードを接続し直すと、Look Atの両側に自動的にノードが追加されます。
「Look At」ノードの詳細にて、以下の通り設定します。
- Bone to Modifyに「head」を設定
- Look at Locationに「ピン」を設定(ピンとして公開を選択)
「Look At」ノードのLook At Location欄に、すでに追加されている変数を設定します。
基礎部分は完成
ここまでで、基礎部分は完成です。
NPCの前にプレイヤーがいる場合は、問題なくプレイヤーを見続けてくれます。
しかし、プレイヤーがNPCの後ろに回ってもNPCはプレイヤーを見続けます。
すると、下図のように頭がおかしな回転をすることになります。
調整
NPCの後ろにプレイヤーが行った場合の挙動を調整します。
アニメグラフのLook At ノードの詳細から、「Look At Clamp」を40~70程度に、「Interpolation Time」を1~5程度にそれぞれ設定します。
この部分は各自で好みに応じて値を調整してください。
まとめ
プレイヤーを追うには「Get Player Character」から始まる処理が重要です。
また、Look Atノードは他のボーンを追従する機能です。
これらを使って実装します。