気づけばツール漬け

3D,2Dのツールを色々使ってみた記録を書いていきたいです。

「冂と亠で円」制作メモ 敵について

f:id:mi-zmix:20190413142301p:plain

第11回ぷちコン応募作の「冂と亠で円」(これとこれでえん)の制作メモ、3つ目は敵についてです。

前回の記事はこちらになります。

「冂と亠で円」制作メモ 企画について -

「冂と亠で円」制作メモ プレイヤーについて -

 

 

子BPでバリエーションを作る

まず親となる敵の元を作って、そこからChildBPを作って見た目など個別に作成しました。
倒れたときに落とす物や数が違うので、親BPの方でイベントディスパッチャを発信して、子のBPで受けとって続きを書くようにしました。
ボスのダメージ無効処理もディスパッチャで発信して子で受け取る形にしました。
炎の弾を受けたときは、2倍のダメージが入るようにしました。ボスは2倍になったダメージしかうけないので、体力の値の設定を多めにしました。

f:id:mi-zmix:20190412213228p:plain

f:id:mi-zmix:20190412213149p:plain
ボスは、イベントディスパッチャの先でコライダーの設定を、弾を跳ね返すように変更をしています。また、普通の弾を2回当てたら、案内用のウィジェットを表示しました。

f:id:mi-zmix:20190414202250p:plain

f:id:mi-zmix:20190414202331p:plain
初期化時にダメージを受ける設定にしてあるので、「炎の点」を持ってるなら2倍ダメージの流れにうつります。
ボスの無敵はあとから思いついたものだったのですが、最初は体内に吸い込んでしまうのはどうか?などと考えてみました。しかし、脳裏に不具合の様子が浮かび、その案は採用せず弾を跳ね返すようにしました。
そのとき思った不具合は「レベル上に弾が全く存在せず、手持ちも撃ち尽くした」状況です。高い頻度でありえるのでボツにしました。


倒れたときに、アイテムをばらまくための関数を親で作っておいて、子でオーバーライドしました。結局ボス以外はこの関数だけしか違いはなかったので、ディスパッチャで発信しなくてもよかったかもしれません。とはいえ、別のリアクションもあるかもしれなかったので、分けておく分には良かったと思います。
関数の中身はプレイヤーの時と同じで、スポーンしてからインパルスで飛ばしています。

f:id:mi-zmix:20190412213807p:plain

最初はこの処理のデストロイ寸前で、ナイアガラを呼び出していたのですが、なぜか再生されませんでした。親の方で呼び出すと再生されたので、これもイベントディスパッチャで別にコールして、デストロイまでの時間をDelayで合わせて表示させるようにしました。

ビヘイビアツリーで動かす

敵はビヘイビアツリーで動いています。毎度お世話になっている「ペーパー忍者」の内容を参考にして、攻撃の処理など付け足しました。ターゲットポイントをレベル上に20箇所くらい配置して、敵にはそのうちの4~5箇所設定し、さらにその中からランダムに選ぶようにしています。ターゲットポイントの設定を手作業でやっちゃって面倒だったので、次に同じようなことをやるときは何か自動化したいところです。
ビヘイビアツリーの全体図はこんな感じです。

f:id:mi-zmix:20190412215311p:plain
最初のSequenceで、各種待ち時間の設定をブラックボードに書き込んでます。
プレイヤーを発見するセンサーのサービス内では、半径大きめのスフィアトレースを自分の中心から出して、ぶつかったかどうかで判定しています。念能力の「円」みたいな感じです。プレイヤーを見つけたらそっちに向かって移動します。
IsAtLocationデコレータを使って、範囲内にいれば攻撃するようにしました。
また、プレイヤーが「円ゲート」のバリア内にいるときは、攻撃を出さないよう仕組んだデコレータを作りました。「攻撃しにプレイヤーの方へ向かうけど、攻撃しない」動きになりました。
デコレータは、以下の図のようにタスクに直接つけられるのでやってみました(この記事書くので試しで)。こっちに攻撃しない判定を置いた場合は「少しだけにじり寄ってから、攻撃をしない」という動きになりました(気のせいかもしれませんが)。これだけの違いですが、なんとなく性格が感じられておもしろいです。

f:id:mi-zmix:20190414193715p:plain

AnimBPと攻撃

敵は全員骨格が違うので、AnimBPも全員別になりました。
骨の共通化を考えてみましたが結構違いが多く、かえって複雑になりそうだったのでやめておきました。
1体あたりのアニメーションも多くないので結局個別にしました。
アニメーションの切り替えは、ステートマシンを使いました。移動の遷移は速度で、攻撃とダメージへの遷移はフラグです。戻りは、アニメーションの再生が終わってからに設定しました。
攻撃からの戻りにConduitを挟んで、一呼吸おくようにしました。

f:id:mi-zmix:20190412220640p:plain
アニメーションの種類と切り替えは、全ての敵でほぼ一緒なのだからステートマシンを使わないで共通化できないか考えてみましたが、結局ステートマシンを使ってコピペなどで対処しました。
alweiさんのサイトにある、Enumで切り替える方法も調べてみましたが、まず知ってる方法で動かすことを優先して、そのままというパターンになってしまいました。

unrealengine.hatenablog.com

攻撃アニメーションに切り替えるのは、ビヘイビアツリーのタスクから敵BPを通して、AnimBPのフラグを変えました。
攻撃のアニメーション内に2つノーティファイを設定し、

f:id:mi-zmix:20190412221242p:plain

そのイベントから敵BPのイベントを呼び出して、攻撃判定用のコリジョンを出したり消したりしました。

f:id:mi-zmix:20190412221457p:plain

図の感じのカプセルで、上記のイベントの時間分出し続けてます。敵の攻撃アニメーション(主に距離)に合わせて長さを調整しました。

f:id:mi-zmix:20190414203600p:plain

敵については以上です。

次はミニマップについて書こうと思います。