自作ゲームリメイク中-モーションシステム修正編-(Unity制作)
前回で、移動とモーション再生を連動させる仕組みについて書きました。
自作ゲームリメイク中-モーション編-(Unity制作) - Redhuのゲーム開発Fragments
が、問題点が発生。
今作ってるゲームはメカカスタマイズアクション。つまりパーツを組み替えてそれぞれのパーツが動いてくれなきゃいけないんですが・・・
前回の仕組みだと機体がワンセットでしか機能しない!パーツを組み替えることが出来ないことが判明しました。3Dモデルをfbx出力して読み込んだ時にパーツがセットにされちゃって分離が出来なかったわけです。
なので、Blenderからfbx出力する際に、パーツは一つ一つ選択してfbx化します。
fbxバージョンは6.1ASCIIで「選択したオブジェクト」にチェックを入れて、「アニメーション」のチェックははずす(アニメーションクリップは使いまわせるため)
一括でいいんじゃね?とかいう慢心は赦されなかった
さて、個別にパーツを用意してこれまでのPlayerオブジェクトの子とし、それにAnimatorと連動用スクリプトのPlayerAnimをセットするわけですが、修正が必要でした。
PlayerAnimはGetComponentして他のコンポーネントの情報を読み取り、Animatorパラメータを連動させていたわけですが、GetComponentは同じオブジェクトのコンポーネントしか探してくれません。
なのでthis.GetComponentInParentにして、親が持つコンポーネントからいままで参照していたコンポーネントを探してきます。
パーツは子になっているので、これで今までどおりの場所からコンポーネントを探してこれるようになりました。
さて、もう一つ問題。
これまではCharacterMotorのSendMassageによるOnLandやOnJumpなどの通知を使って着地やジャンプタイミングを読み取り、アニメーションを連動させていました。
しかしSendMassageは、同じオブジェクト内にしか通知が行きません。
子となっているパーツのPlayerAnimに関数を仕込んでいても、通知が届かないわけです。
なのでSendMassageだったCharacterMotorの記述をBroadcastMessageに変更します。
BroadcastMessageはSendMassageに加え、自分の子にも通知を渡します。
これで子パーツのPlayerAnimに仕込んだ関数が起動できます。
親子関係はこんなんなりました。
次こそカメラ機能やりますよーやるやる
*追記
パーツを揃えて動作チェックをしていた際に、パーツごとに微妙にアニメーションの連動タイミングにズレが生じていました。
おそらくこれは、スクリプトの処理順にあるのではないかと思い、以下のように対策してみました。
Edit > Project Setting > Script Exection Orderから
とりあえずスクリプトの処理優先順位を付けました。
入力→ステ変動→キャラ移動→カメラ追従→アニメーション連動
って感じです。
優先順位付ける前はアニメ連動が、その参照しているキャラの状態より先に更新されて、実際の状態と連動するのに一周遅れになってたりしてズレたんではないかと。
アニメ連動ズレはリメイク前のMCCでも起きたことがあり、この方法で解決したのでやってみた。
結果今んとこズレは確認されなくなりました☆
次回