質問: Animatorコンポーネントの動きを他のオブジェクトで同期させたいです。 キャラクターAとBが有ったとし、それぞれAnimatorコンポーネントが付いている場合、それぞれを同期して動かすようなイメージです。 単純に、スクリプトからマウスやキーボード操作を取得しAnimatorに値を流し込むだけでしたらそれぞれのキャラクターA、Bに同じスクリプトを付けてあげるだけで問題有りませんが、どうしても同じスクリプトを取り付けられないケースになってしまい、なんとかAnimatorを同期する処理が無いか探しています。 構造としましては Input処理 ↓ キャラクターAのAnimatorに適応 ↓ キャラクターAのAnimatorの動きをキャラクターBに同期 ちなみに、キャラクターAとBは同じアニメーションcontrollerを持ち、同様のクリップを持っています。 アバターは違います。 そもそもなぜこのような処理が必要かと言いますと キャラクターをAssetStoreで購入し、衣装が1つでは寂しいのでキャラクターに着せ替え機能を付けたく思っておりました。 運よくそのキャラクターのモデル(裸)は同じで衣装のみが違うモデルがダウンロードできたので、そちらで代用しようと思っていた矢先、それぞれのボーン構造は少しづつ違っており、ボーンを再度重み付けするとなると結構な時間がかかってしまいます。しかし、モデルリグは同じHumanoidなので同じアニメーションコントローラでしたら問題なく動作します。 Playerを制御するスクリプトを各衣装毎に設置してしまってはInputされる値が変動してしまいますし、Animatorを複数取り付けるとなると、スクリプトだけでなくプラグインを全体的に修正する必要が有り、あまり利口な方法ではありません。 そこで今回の質問をさせていただいています。 AnimationPlayableOutput等、色々と使えそうな関数はあるのですが、ぴったりの処理が無く困っています。
回答: ``` void Update() { //「0」はレイヤーID、「0.5f」は遷移時間 myAnimator.CrossFade (originalAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0.5f); } ``` 一応こんな感じで直接ステート遷移出来るようなのですが、未検証です。 恐らく1フレーム遅れる、遷移時間との同調が取れるか怪しい、実際に使う際は「現在そのステートに入っていないこと」という条件分岐が必要かもです。 「質問への追記・修正の依頼」を見ましたがやっぱり意味が分かりません。 同じスクリプトを付け、自分のAnimatorへの参照を張っておけば如何なる入力があろうと同じ動きをするはずだからです(入力に対しては)。 ``` public class Test : MonoBehaviour { //自分のアニメーター private Animator myAnimator; // Use this for initialization void Start () { myAnimator = GetComponent (); } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { myAnimator.SetTrigger ("パラメータ名"); } } } ``` 例えば以下のスクリプトを(`SetTrigger ("パラメータ名")`を自分のAnimatorに合致するようにして)2つのキャラクターに付けて動かしてみてください。 ・キャラクターAのオブジェクト:Animator(キャラクターAのAvatarが付いている)+Text.cs ・キャラクターBのオブジェクト:Animator(キャラクターBのAvatarが付いている)+Text.cs (両者のAnimatorについて、AnimationControllerは共通の物をセットする) これでどちらもマウスクリック時に同じ動きをするはずです。 「プラグイン」が何を使っているか知りませんが、大抵は同じような構成で動くはずです。 (「着替え差分」ということは2体が同時に表示される(=操作される)ことは無いと思うので、後は必要なタイミングでオブジェクトを入れ替えればいいだけだと思います)