第11回ぷちコン応募作の「冂と亠で円」(これとこれでえん)の制作メモ、2つ目はプレイヤーについてです。
前回の記事はこちらになります。
スケルタルメッシュの切り替え
「亠」とあわさったとき円にかえるため、まず二種類のスケルタルメッシュを用意しました。
メッシュを切り替えるので、骨の構造は一緒にしました。
ピックアップアイテムを拾った通知から、メッシュを切り替える関数を作って切り替えました。
関数の中は、こんなです。
敵にやられたときは、最初はエフェクトの表示だけにしようかと思っていましたが、敵と合わさって文字になるなら見た目も変わったほうが良いなと思い、大急ぎでスケルトンを使いまわして各種文字メッシュを用意しました。メッシュとスケルトンのバインドは、Akeytsuを使うことによって大きく時間短縮できました。このあたりもモデル編とかで書こうと思います。
倒れたときだけ置き換えるので、移動中や攻撃などの動作は対応しないことにしました。スケルトンが同じなので共通のアニメーションは動きますが、モデルのスキンウェイトの調整をしてないので、かなり不自然になっちゃいます。倒れているときはほぼ動いていないため、その状態で違和感が出ないように調整しました。
ダメージのイベントで敵のタイプを受け取って、セレクトノードで選択してメッシュを変えるようにしました。エネミーのタイプは、やる気まんまんで項目作ってましたが、結局使ったのは4個だけです。
この切替時に、Set Skeletal Meshノードにある、Reinit Poseのチェックをはずしておかないとダメでした。
チェックした状態だと、自分の環境ではエディタがクラッシュしました。現在のポーズはそのままにしてないとやばかったようです。
各アニメーション
アニメーションはステートマシンで管理しました。停止、移動、やられを設定しました。遷移条件は、速度とやられたフラグです。
あと、攻撃はアニムモンタージュを使って、左右の脚を交互に動かしました。
攻撃開始の通知を受け取ってからMontagePlayして、FlipFlopノードで左右用の2つのセクションを切り替えました。
攻撃用アニメーションを頭から再生すると微妙な間があってもっさりしてたので、ボタンをおしたら即反応になるように、アニメーションの再生位置を少しずらしました。
やられて倒れるアニメーションには、メッシュをいれかえるためのノーティファイを仕込みました。
切り替えと戻すタイミングの2個を設定しました。
プレイヤーキャラのBPでイベントを受け取ってメッシュを変えました。
やられたときの文字表示
やられたときに拡大して表示している文字のメッシュは別アクターです。こちらは、StaticMeshです。
スポーンするときに敵の情報をわたして、それにあわせてメッシュを表示してます。
メッシュと敵の種類を対応付けるため、MAP型を使ってみました。キーと値の組み合わせで設定します。MAP型は、FINDノードで見つかったキーに対応する値を取り出すようです。
メッシュを表示したら、タイムラインでマテリアルのオパシティのアニメーションと拡大を再生しています。つねに同じ方向で表示したかったので、ローテーションの値はベタで入れてます。
Add Child Actor Component
ピックアップアイテムをひろってから積み上がっていく仕組みは、Child Actor Compoentを使いました。
頭上にBoxコライダーを置いてOriginとBox Extentで範囲をきめて、Random Point In Bounding Boxでランダムな位置をとり、Random Rotatorで向きを変えてAddしてます。Addした分は、戻り値を配列に格納していきました。
→
→
射撃したときは、積んであるものを減らすため、配列のラストインデックスからリムーブしていきました。
敵にやられたときと、ゲートをくぐったときは全部消す必要があるので、マクロを作ってループで一気に消すようにしました。ゲームクリア時だけは見た目が面白いと思ったので、積んだままにしました。
「亠」アクターの使い分け
「亠」は見た目一緒ですが、3種類つくりました。
プロジェクタイルで飛ばすやつと、ピックアップで拾うやつ、頭に積んでいくやつです。
最初は、プロジェクタイルとピックアップを一緒にして1個のアクターでやろうとしていたのですが、かなり面倒なことになったので2個に分けました。BPを書く場所は増えましたが、考えることはすっきりしました。
コリジョンの管理がとても面倒で、空中にいるときはこうで地面についたらこうなってとか、試行錯誤しつつだったので、分けたほうが整理しやすかったです。
頭に積むやつは、Actorのコンポーネントとして使うので完全にわけました。見た目だけのやつで何もしないので他の処理は要らないですしTickも切りました。積み上がって広がった分だけキャラクターの判定も広がり、横を向いたらゲート通過判定になったりしたのでコリジョンも無効にしました。
プロジェクタイルムーブメントの「停止した」イベントで、ピックアップアイテムへ切り替えました。デストロイの直前に、地面にある状態のメッシュのトランスフォームを受け取って、そのままの形を保つようにピックアップアイテムをスポーンしました。
敵にやられたときは、ピックアップアイテムをばらまいてます。これにはフィジックスの設定をつけて、地面を転がるようにしています。
インパルスで飛ばしていますが、上方向に飛ばすとなんかの拍子にマップの外に行ってしまうので、ほぼ横方向だけにしました。このあたりの設定は、かなりお世話になっている「ペーパー忍者」の方法を参考にしました。
炎の点の処理
「亠」を拾った時と同様に、インターフェイスのメッセージを受け取って加算していきました。
最初の一個を取った時か、ボスに当ててボスからの通知を受け取ったときに、ウィジェットへディスパッチャでコールして、炎のアイコンウィジェットを表示します。
2個め、3個めと取ったあと、4個目の通知のあとで、アイコンをアニメーションするためのディスパッチャをコールしました。
→
→
プレイヤーについては以上です。
次は敵について書こうと思います。