キャラクターの切り替え
第一回
https://qiita.com/KLaboratory/items/ab938c45c2c7106b65f6
第二回
https://qiita.com/KLaboratory/items/fecb657668215e48660d
から続きます。今回はMaria JJ Ong とMaria W/Prop JJの切り替えについて。キャラクターの切り替えについては、以前に作りましたこの記事を参考にしてください。
https://qiita.com/KLaboratory/items/59538687594e2ffe5d2a
https://qiita.com/KLaboratory/items/af3c63d7db4a0ccaaff7
ゲームインスタンス
変数をやり取りするためにゲームインスタンスを作ります。プロジェクト設定のマップ&モードの一番下のゲームインスタンスに登録します。
今回はbool変数を一つだけ登録します。これはキャラクターが通常系か進化系かを判断するものとします。通常系がfalse、進化系をtrueとします。最初は通常系なので初期値はfalseにします。
切り替えコマンドの登録
プロジェクト設定のインプットのActionMappingsにキャラクターを切り替える(進化させる)コマンドを登録します。
コントローラーBP
コントローラーBPに戻ります。先ほど登録した進化コマンドを呼び出します。現在のキャラクターの位置を取得して、Destroyします。ゲームインスタンスについては次に出てきます。
ゲームインスタンスの変数を取得し、trueであれば進化系になっているのでfalseに戻し、falseであれば進化系になるのでtrueにします。
先程取得した位置にキャラクターをspawnさせ、コントローラーをpossessします。
コマンドを入力するたびにMaria JJ Ong とMaria W/Prop JJが入れ替われば成功です。
攻撃コマンド
プロジェクト設定のインプットに攻撃コマンドを追加します。
コントローラーBP
コントローラーBPに戻ります。アタックのコマンドを呼び出します。コマンド実行の間、他の動きを止めます。delayの時間は、アニメーションが再生される時間です。
アニメーションBP
アニメーションBPに移ります。まずイベントグラフにAttack用の処理を追加します。
コントローラーから、Attack変数の状態を受け取り、アニメーションBPの変数にセットします。続いてAnimGraphです。
Attackステートは、歩きながら、あるいはIdleから発せられますが、終わったときは必ずIdleに戻します。AttackのアニメーションはMaria JJ OngのPunchingをわりあてます。
トランジションルールはAttackに行くときはそのまま、Attackから戻るときはNotを割り当てます。
実行すると、パンチをしますがMaria W/Prop JJにチェンジしても剣を持ったままパンチをします。これをMaria JJ Ongのときはパンチ、Maria W/Prop JJになると剣で切ると分けたいと思います。これはとても簡単ですが一つ仕掛けが必要です。
アニメーションの切り替え
イベントグラフに戻ります。イベントグラフにbool変数を一つ加えます。これは今が通常系か進化系かを判断するものです。これをゲームインスタンスから持ってきます。
これで今、通常系か進化系かがわかります。続いてAnimGraphのIdleステートに入ります。Great_sward_Idle1をつなげたいのですが、Output Animation Poseは一つのアニメーションしかつなげません。
そこでBlend Poses by boolを使います。true(進化系)のときはGreat_sward_Idle1になり、falseのときは通常のIdleになります。
Attackステートも同じです。
なお、Blend Poses by boolの詳細で、「Blend Time」のチェックは外しておいてください。
実行すると、IdleとAttackの動きが違っていることがわかります。ただ、Attackの時間が違うので、パンチが4回出たりします。ここはコントローラーBPで調整をしてみるといいと思います。
こうすることで、アニメーションBPを一つにして、手間の節約になりました。またご覧いただきますとわかりますが、コントローラー共通で使えます。そして、キャラクターのBPには何も書いていません。複数キャラクターを使い分けるときはこの方法も悪くないと思います。
今回は剣を装備しただけなので、一つのキャラクターでソケットをつけて、そこで装備したり非装備にしたりとすることもできます。ただ、メッシュ(見た目)まで変わる場合はこの方法の方がやりやすいかと思います。