Unityでのアニメーションは、Animator
コンポーネントを使って制御されます。
通常、次のような手順で設定します。
Animatorコンポーネントの追加
キャラクターやオブジェクトにAnimator
コンポーネントを追加。
AnimationClipの作成
事前に作成したAnimationClip(歩く、走る、ジャンプするなど)を使って、キャラクターに動きを設定。
AnimatorControllerの作成
AnimationClipを管理するためのAnimatorController
を作成し、各アニメーションを遷移させるためのブレンドや条件を設定。
using UnityEngine;
public class CharacterAnimation : MonoBehaviour
{
private Animator animator;
void Start()
{
// Animatorコンポーネントを取得
animator = GetComponent<Animator>();
}
void Update()
{
// Wキーで走るアニメーションを再生
if (Input.GetKey(KeyCode.W))
{
animator.SetBool("isRunning", true);
}
else
{
animator.SetBool("isRunning", false);
}
}
}
このスクリプトでは、W
キーを押すと「走る」アニメーションが再生され、離すと停止します。
Animator
は、状態遷移(StateMachine)を管理するための機能としても利用できます。StateMachineは、オブジェクトやキャラクターの状態を管理し、その状態に応じて異なるアニメーションを再生します。
AnimatorControllerを作成し、ステートを設定 各ステートにはアニメーションを割り当て、ステート間の遷移を条件に基づいて制御。
遷移条件の設定
パラメータ(例えばisRunning
やisJumping
)を使って、アニメーションの切り替えを行います。
using UnityEngine;
public class StateMachineExample : MonoBehaviour
{
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
}
void Update()
{
// 各入力に応じてステートを切り替え
if (Input.GetKey(KeyCode.W))
{
animator.SetTrigger("Walk");
}
else if (Input.GetKey(KeyCode.Space))
{
animator.SetTrigger("Jump");
}
}
}
ここでは、W
キーで「歩き」ステートに遷移し、Space
キーで「ジャンプ」ステートに遷移する例です。AnimatorController
上でこれらのトリガーに対応する遷移を設定します。
Avatar Mask
は、特定のボーンや体の部分にのみアニメーションを適用するために使われます。例えば、下半身は歩きのアニメーションを再生しつつ、上半身で射撃モーションを再生する場合に使用します。
Avatar Maskの作成
UnityエディタでAvatar Mask
を作成し、アニメーションを適用したいボーンを選択。
レイヤーを分けて適用
AnimatorController
でレイヤーを作成し、マスクを適用して特定の部分にのみアニメーションを適用します。
// AnimatorControllerで設定したレイヤーごとにアニメーションを分ける例
Ragdoll
は、物理的にキャラクターが倒れたり、衝突した際に自然な動きをシミュレートするための物理設定です。Unityでは、Ragdoll Wizard
を使って簡単に設定できます。
Ragdoll Wizardを使って設定
キャラクターに対して、必要なボーンやコライダーを設定します。
Ragdollの有効化
スクリプトで物理アニメーションを切り替える際には、アニメーションを無効にしてRigidbodyの物理挙動を有効にします。
using UnityEngine;
public class RagdollController : MonoBehaviour
{
private Animator animator;
private Rigidbody[] rigidbodies;
void Start()
{
animator = GetComponent<Animator>();
rigidbodies = GetComponentsInChildren<Rigidbody>();
// Ragdollを無効にする
SetRagdollActive(false);
}
// Ragdollの有効化/無効化
public void SetRagdollActive(bool active)
{
foreach (var rb in rigidbodies)
{
rb.isKinematic = !active;
}
animator.enabled = !active;
}
void Update()
{
// スペースキーを押すとRagdollモードになる
if (Input.GetKeyDown(KeyCode.Space))
{
SetRagdollActive(true);
}
}
}
このスクリプトでは、スペースキーを押すとRagdollが有効になります。
アニメーションの特定のフレームで関数を呼び出したい場合、Animation Event
を使用します。アニメーションの再生中にタイミングを合わせてスクリプト内の関数を実行できます。
アニメーションウィンドウでイベントを追加
Unityのアニメーションウィンドウで特定のフレームにイベントを設定します。
スクリプト内の関数を呼び出す
using UnityEngine;
public class AnimationEventExample : MonoBehaviour
{
// アニメーションイベントから呼び出される関数
public void OnAttack()
{
Debug.Log("Attack event triggered!");
}
}
このスクリプトでは、アニメーション中のイベントでOnAttack()
という関数が呼ばれます。Unityエディタのアニメーションタイムラインで設定するだけで、指定したフレームに合わせて実行できます。
攻撃アニメーションの間にキャラクターを移動させたり、他の処理を追加することがよくあります。これには、アニメーション中にRoot Motion
や物理演算を使った移動を組み合わせることができます。
using UnityEngine;
public class AttackAnimationController : MonoBehaviour
{
private Animator animator;
private CharacterController characterController;
public float attackMoveSpeed = 2.0f;
void Start()
{
animator = GetComponent<Animator>();
characterController = GetComponent<CharacterController>();
}
void Update()
{
// 攻撃中に前進する
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
{
characterController.Move(transform.forward * attackMoveSpeed * Time.deltaTime);
}
}
}
このスクリプトは、攻撃アニメーション中にキャラクターが前進する動きを追加します。CharacterController
を使用して、アニメーションの進行とともに物理的な移動を実行しています。