【UE4】建物にNPC(人物)をランダムに徘徊させる~ぶつかりそうになったら止まって指定アニメーションする編~

Pocket
LinkedIn にシェア
LINEで送る

っっっj

動画版

やってみよう

これまで『NPC』と呼ばれるゲームでいう『徘回する街人』を作ってきました
建築で言うと建物や都市をランダムにウロウロする人物です
今のままだとNPC同士がガツガツとぶつかるので
「ぶつかりそうになったら立ち止まる」ようにして、さらに
「特定のアニメーションを再生する」という考慮を加えたいと思います
NPCのブループリントは前回のものを再利用します
この動画を初めて見る方は過去の動画を見ながら
NPCブループリントをご準備ください
今回の編集対象は3つです
① キャラクター
② ビヘイビアツリー
③ アニメーションブループリント
まず接近の識別には、トリガーボックスを用いて、キャラクターに配置
Overlapしたかどうかで判別します
キャラクターのBeginOverlapとEndOverlapのイベントグラフでは、
次の2つだけを行えることとします。直接的な変更はNGとします
これが一般的な手法か不明ですが
自分の中ではとりあえず明確に役割分担できているので、
バグの原因は特定しやすいと判断してます
ビヘイビアツリーでは、[WalkTo]が中断された(=ぶつかりそうになった)
場合に立ち止まる考慮を追加します
アニメーションBPでは、ぶつかるフラグを追加して
フラグによって歩く・特定アニメーションの再生を振り分けます
口でいうと大きく3点の編集を加えればよいだけですが、
アニメーション実装経験が殆どない私には大仕事ですけど、
UE4ならいい感じに簡単化されていると信じで突っ走ってみます
まずばキャラクターからやりたいのですが、
まずはアニメーションブループリントにフラグを作っておきます
bool型のIsOverlap変数を作ります。初期値はfalse
関数にSetOverlapを追加します
Inputにbool型でParamを追加。これで関数の引数を追加できました
呼ばれたら引数の値をそのままIsOverlapにセットする関数が完成
簡単簡単。1つ1つやれば怖くない
お次はキャラクター(NPC4Character)を開いて、
[コンポーネントを追加]を押して「BoxCollision」を選択
名称も変えておきましょうか
「近い!」と判断する領域をお好きに決めてください
いわゆる「パーソナルディスタンス」です
もうちょっと前に出しましょうか。Borisくんは体が大きいので
コンポーネントはBoxCollisionを選択したままで、イベントを追加します
[Begin Overlap]と[End Overlap]イベントを追加
誰かが近づいたら(=Begin Overlap)
アニメーションブループリントのIsOverlapをtrueにします
離れたらfalseをセットするように作りましょう
[Get Anim Instance]関数でgetしてから、
任意のアニメーションブループリントのクラスでCastします
Castするのはさっきフラグを作った
アニメーションブループリントの名前です
SetOverlapがあるので接続
別にSetOverlap関数は作らなくてもよかったんですね
これでOK
おっと、失礼
デバッグ用に文字を出してみましょうか
グーだね
さてアニメーションブループリントを開きます
今回は新しく「State(ステート)」を活用していきます
Stateは、状態遷移みたいなことです
止まる、歩く、コケるなど、大まかにどんな状態かを決めます
状態を決めるだけなので、
ステートの並び替え自体はアニメーションの知識がなくても作れます
今回はシンプルに2通りだけ設定してみます
①止まる・歩く (Idle-Walk)
②座り込む (Down)
Idle-_WalkとDownを接続すると、円マークが出てきます
ここに遷移条件を書きます
なんとなくわかってきたでしょうか
ここで近づいたかを判定する[IsOverlap]を参照します
[IsOverlap]がtrueだったら[Down]のStateになってください
という意味です
[NOT]をくっつけます
[IsOverlap]がfalseだったらIdle__Walkに戻ってください。という意味です
2通りのアニメーションに切り替えたいだけだったらこれで終わりです
で、あとは、Stateごとにやりたいアニメーションをセットします
Stateをダブルクリックすると、
「このStateでどんなアニメーションをさせたいのか」を決めます
この画面の[アセットブラウザ]から選ぶことになります
単純に特定のアニメーションを再生すればいいのであれば、
アセットブラウザからドラッグして、ノードを接続するだけです
Borisくんの「Death」というアニメーションをしたいだけなので
これで終わりなのです
[アニメーションプレビュ]に変数があるので、
ON/OFFを切り替えて状態遷移のデバッグができます
テストPlayしてみましょうか
早くぶつかって!

なんか、小学生の時にカブトムシvsクワガタをやらせたときのような緊張感
おー、きたきた!
威嚇しあってます!
まだ1点問題が残っていますね。
「びっくりしながら移動してしまっている」と
じゃあOverlapしたら移動を中断しましょう
ビヘイビアツリーを開きます
私の過去の動画をまんま真似してくださった方は、3つ接続された状態ですね
①NPC2Wonder:目的地を検索する
②Move To:移動する
③Wait:止まる
考慮をつけ足すのは、②目的地へ移動中に中断した場合の箇所です
新しく[Selector]を使ってみます
Selectorは、
「下にぶらさがっているもののうち、左から処理していって、
1つでも処理が成功すれば抜ける」という特性があります
つまり、[Move To]が成功すれば、
右側の[NPC4Stop]の処理はしません
[MoveTo]が失敗(=中断された)ときに右のSequenceを処理します

じゃあ中断されたときに何するのかというと(NPC4Stop)、
止まってほしいので、現在位置を目的地に変更してしまいます
説明が前後してしまいましたが
[NPC4Stop]は予め作っておいています
[NPC4Wonder]をコピーしてBPを編集すればいいかなと
現在位置(=GetActorLocation)を目的地にSetする、と
目的地を差し替えたら明示的に目的地へ向かわせます
一瞬で到着するけど
まだ終わっていません。[MoveTo]の中断指示を設定をします
キャラクターブループリントを開いてください
[Get AI Controller]を呼んで、[Stop Movement]を接続
これで全部できました
最初に目標としていた依存関係も守れたので、悪くなさそうです
ネットで調べている限りだと、中断すると移動も止まる(?)みたいですが
上手くいかなくて、こういう形にしました
テストPlay!
うまくいきましたね
なんか2回連続でびっくりすると、
びっくりしながら動いてしまう現象が起こっていますが、
アニメーションブループリント側はOverlap=trueのままなのに、
ビヘイビアツリーはWaitを終えて次の目的地を探してしまうためです
ビヘイビアツリーを表示しながら何が起こっているか見てみましょう
ちなみに右上の数字は処理順序です。親切
ここいらで息抜き。見物してみましょうか
ちなみにアニメーションブループリントのDownのStateを
Borisくん固有のポージングのアニメーションにしてみました
ペタッと座り込みます
5秒に1体Spawnしていますが、
当然ながら時間が経つにつれてぶつかりやすくなるので
最終的には座ってばかりになります
なんかホッコリ
一升瓶のプロップが出てくるように改造すれば
ただのオッサンの花見の光景みたいになりますね
これで終わり――ってのも面白くないのと、
なんかノっているときに色々覚えてしまいたいので
2種類のキャラクターが交互に登場するようにしてみます
NPC4Spawnブループリントクラスに[FlipFlop]を接続するだけですけど
この女性はParagonのShinbiというキャラクターです
こちらはアニメーションBPのStateの設定を少し変えてみました
ぶつかりそうになったときのアニメーションをループしないで、
1回だけ再生するようにしました
ちょっと! 女の子なんだからこっちに向けてお股は開かないで・・・
やり始めたときから気になっていたんですが、
「アニメーションを1回再生して、
次のStateに無条件で遷移するにはどうするんだろう?」と
やってみましょう
①Collision:ぶっ飛んで倒れる
②Standup:起き上がるけど回復を待つ
③Idle-Walk:通常状態に戻る
例えば、Collisionでぶっ飛んで倒れるアニメーションを1回再生し終えたら、
無条件で気絶の回復のアニメーションをしてほしい場合です
ひとまずStateにアニメーションを設定しておきます
Stateの遷移には必ず条件が必要ですが「条件は要らん」ってときは
円印の条件をクリックして、詳細の[Automatic Rule Based on Sequence]
をONにすればよいみたいです
MannequinやParagonのStateでこうやっているので間違いないとは思います
また状態遷移時のブレンドの秒数も[継続時間]で決めることが出来ます
ネットだと
「StateがよくわかんないからキャラクターBPのイベントグラフで
[PlayAnimation]を駆使してゴリゴリやっている」
例が多かったのですが、
「この条件のときに、そのアニメを1回再生して、
次にあのアニメを再生して、…」
というのをStateだけで設定するのが、私は直感的で作りやすかったです
この20分でたったこれだけのことしか覚えていませんが、
なんか、建築用途のNPCだったらだいたいのことが出来る気がしてきます
今日はここまで!
やばい。無駄なことしてしまった気がする
次はあからさまに効果があるとわかっているメッシュが多く使われていて、
フレームレートが低いプロジェクトを選出して出直すとします
まあアーリーアクセスですし、Epicさんなら早急に対応してくれるでしょう
今日はここまで!

参考サイト

コメントを残す