Unityでキャラクターのアニメーションの遷移を管理するのにAnimatorControllerを使用してきました。
Animatorの状態や遷移条件等が同じ複数のキャラクターを扱う場合は同じAnimatorControllerを共有して同じ動作をさせるか、
それぞれ別のAnimatorControllerを作成し取りつけます。
同じ動作をさせる場合はまったく同じアニメーション、遷移条件で遷移するキャラクターしか作成出来ません。
しかし状態と遷移条件が同じ場合はまったく別のAnimatorControllerを作成しアニメーションクリップだけを変更しているだけなので手間が増えます。
そんな時にAnimatorOverrideControllerを使用すると状態と遷移等はそのままにアニメーションクリップだけを別にする事が出来ます。
AnimatorOverrideController
AnimatorOverrideControllerは既存のAnimatorControllerを拡張したアニメーターコントローラーです。
その為、まずは通常のアニメーションを管理するコントローラーを作成します。
通常のAnimatorControllerを作成
Assetsフォルダ内で右クリック→Create→Animator Controllerを選択し、名前をBaseとします。
↑のような状態と遷移を作成します。
アニメーターコントローラーの状態や遷移の作り方については
等をご覧ください。
アニメーションパラメータにはFloat型のSpeed、Bool型のJumpを作成します。
それぞれの状態にはStandardAssetsに入っているIdle、Walk、Jumpのアニメーションクリップを設定しています。
ヒエラルキーに3DモデルのEthanを配置しCharacterControllerの取り付けとAnimatorに今作成したBaseを設定します。
キャラクターを動かすスクリプトを作成し取りつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | using UnityEngine; using System.Collections; public class SimpleMove : MonoBehaviour { private Animator animator; private CharacterController cCon; private float x; private float y; private Vector3 velocity; public float jumpPower; private Vector3 input; // 入力値 void Start () { animator = GetComponent<Animator>(); cCon = GetComponent<CharacterController>(); velocity = Vector3.zero; } void Update () { // キャラクターコライダが接地、またはレイが地面に到達している場合 if(cCon.isGrounded) { // 地面に接地してる時は初期化 velocity = Vector3.zero; // 着地していたらジャンプフラグをfalse animator.SetBool("Jump", false); x = Input.GetAxis("Horizontal"); y = Input.GetAxis("Vertical"); input = new Vector3(x, 0, y); // 方向キーが多少押されている if(input.magnitude > 0.1f) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += transform.forward * 2f; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0); } // ジャンプ if(Input.GetButtonDown("Jump") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Jump") && !animator.IsInTransition(0) // 遷移途中にジャンプさせない条件 ) { animator.SetBool("Jump", true); velocity.y += jumpPower; } } velocity.y += Physics.gravity.y * Time.deltaTime; cCon.Move(velocity * Time.deltaTime); } } |
シンプルなキャラクター移動スクリプトになります。
キャラクター移動スクリプトに関しては
等をご覧ください。
キャラクターの設定が出来たので通常のAnimatorControllerでのキャラクターを見てみましょう。
↑のように通常の動きを確認出来ました。
AnimatorOverrideControllerの作成
次にさきほど作成したBaseアニメーターコントローラーをオーバーライドするAnimatorOverrideControllerを作成します。
Assetsフォルダ内で右クリック→Create→Animator Override Controllerを選択し名前をOverride(名前は適当に付けてください)とします。
↑のように通常のAnimatorControllerのアイコンの左下は矢印ですがAnimatorOverrideControllerの場合は+表記になっています。
作成したOverrideアニメーターオーバーライドコントローラーを選択し、インスペクタを表示します。
OverrideのControllerにBaseアニメーターコントローラーをドラッグ&ドロップします。
↑のようにBaseの状態に設定されているアニメーションクリップが表示される(↑の画像ではすでに変更しています)ので対応するアニメーションクリップを変更してください。
さきほどEthanをCtrl+Dでコピーし、コピーした方のEthanのAnimatorにOverrideを設定します。
↑では左側がBase、右側がOverrideを設定したキャラクターです。
OverrideはBaseアニメーターコントローラーのアニメーションクリップが変わっているだけなので同じ動作をしアニメーションだけが変わっているのがわかると思います。
別のキャラクターにAnimatorControllerを設定する時にアニメーションクリップだけを変更したい時はAnimatorOverrideControllerを使ってみるといいかもしれませんね。