アニメーションを作る方法は2パターンあります。1つ目は、「プログラムでアニメーションを制御する方法」です。プレイヤーの入力に合わせてキャラクターを動作させる際によく使われます。2つ目は、「AnimatorController で制御する方法」です。特定の動作を実行させたいときに便利です。例えば、オープニング画面に表示されるゲームタイトルのアニメーションの作成などに適しています。
目次
方法①「プログラムでアニメーションを制御する方法」
概要
手順
STEP1:対象のゲームオブジェクトに「Animator」コンポーネントを追加する
ゲームオブジェクト(下図では「Player」)を選択し、インスペクターにある「コンポーネントを追加」をクリックします。
「Miscellaneous」⇒「Animator」と選択します。
STEP2:「アニメーターコントローラー」をアセットに作成し、ゲームオブジェクトと紐づける
アセット内の「Player」を右クリックし、「作成」⇒「アニメーターコントローラー」を選択します。
名前を「PlayerAnime」とし、プレイヤーのインスペクター「Animator」内のコントローラーにドラッグアンドドロップします。これで、ゲームオブジェクト「Player」とアニメーターコントローラー「PlayerAnime」の紐づけが完了です。
STEP3:アニメーションを作成する
ヒエラルキーから「Player」を選択し、アニメーションビューを表示します。「作成」ボタンが表示されるのでボタンをクリックします。
Idle(アイドル)状態のアニメーションを作成します。ここでは、ファイル名を「Idle.anim」としました。
下図のように、アニメーションで使いたい画像を選択(最初の画像:クリック、最後の画像:Shift + クリック)し、アニメーションビューにドラッグアンドドロップします。
アニメーションは再生することができます。アニメーションビューの中に再生ボタンがあるのでクリックしてみてください。下記のように、アニメーションの動作を確認することができます。
アニメーションの速度が速かったり遅かったりする場合は、「サンプル」の値を変更して調節します。「サンプル」を表示させる手順は、以下の通りです。
STEP4:プログラムでアニメーションを制御する
// ★1 アニメーション用の変数
private Animator animator;
private ANIME_TYPE nowAnime = ANIME_TYPE.Idle;
private ANIME_TYPE oldAnime = ANIME_TYPE.Idle;
// ★2 アニメーション名
private enum ANIME_TYPE
{
Idle,
Run,
Jump,
Fall
}
/// <summary>
/// Start is called before the first frame update
/// シーンに読み込まれたときに1回だけ実行される
/// </summary>
private void Start()
{
rbody2D = GetComponent<Rigidbody2D>();
transform.localScale = new Vector2(Scale, Scale);
// ★3 「Animator」コンポーネントの取得
animator = GetComponent<Animator>();
}
/// <summary>
/// Update is called once per frame
/// 入力系の処理を記述するところ
/// </summary>
private void Update()
{
axisH = Input.GetAxisRaw("Horizontal");
if (axisH < 0.0f) // 左を向く
{
transform.localScale = new Vector2(-1 * Scale, Scale);
}
else if (0.0f < axisH) // 右を向く
{
transform.localScale = new Vector2(Scale, Scale);
}
}
// 一定時間ごとに呼び出されるので、
// 物理演算結果の再現性が保てる
// (物理演算やアニメーションを記述)
private void FixedUpdate()
{
// ★4 アニメーション更新
if (OnGround()) // 地面の上
{
if (axisH == 0.0f)
{
nowAnime = ANIME_TYPE.Idle;
}
else
{
nowAnime = ANIME_TYPE.Run;
}
}
else
{
if (0.0f <= rbody2D.velocity.y)
{
nowAnime = ANIME_TYPE.Jump;
}
else
{
nowAnime = ANIME_TYPE.Fall;
}
}
if (nowAnime != oldAnime)
{
// アニメーションを再生する
oldAnime = nowAnime;
animator.Play(nowAnime.ToString());
}
}
■ 1行目(★1):アニメーション用の変数
■ 6行目(★2):アニメーション名
enum を使用すると、特定の値しかとらないデータを管理することができます(例:曜日、都道府県)。タイプミスを防ぐこともできます。ここでは、アニメーションの名前を enum で管理します。
■ 24行目(★3):「Animator」コンポーネントの取得
■ 50行目(★4):アニメーション更新
プレイヤーの入力に合わせて、アニメーションを再生します。例えば、地面の上にいる場合で、止まっているときは Idle のアニメーション(55行目)、左右に移動しているときは Run のアニメーション(59行目)を設定しています。
nowAnime は現在のアニメーションのことです。oldAnime の内容と異なる場合は、animator.Play(76行目)を実行して現在のアニメーションを再生します。
方法②「AnimatorController でアニメーションを制御する方法」
概要
AnimatorController を利用すれば、GUI 上で(プログラミングすることなく)アニメーションを作成することができます。プレイヤーの入力と関係なく、特定の動作をさせたいときに主に利用します。
手順
STEP1:「アニメーターコントローラー」をアセットに作成し、ゲームオブジェクトと紐づける
アセット内に「アニメーターコントローラー」を作成します。下記の例では、「Opening」という名前にしました。
「Opening」を、プレイヤーのインスペクター「Animator」内のコントローラーにドラッグアンドドロップします。
STEP2:アニメーションを作成する
プログラムを利用せずにアニメーションを作成します。キーフレーム収録モードを使って、「位置」を移動させることもできます。下記の動画を参考に、アニメーションを作成してみてください。
STEP3:AnimatorController でアニメーションを制御する
下記は、アニメーター「Opening」のステート遷移図です。STEP2で作成した「OpeningRun」と「OpeningJump」を、「Entry」から遷移するように設定します。
正しく設定できると、概要の実行結果のようなアニメーションが再生されます。