こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「アニメーションの再生をスクリプトから行いたい!」
「遷移されないステートの再生はできないの?」
というお悩みの方に向けた内容となっています。
Unityで作成したアニメーションは、そのままだとオブジェクトがアクティブになったタイミングで再生されることになります。
任意のタイミングでアニメーションを再生する場合は、いくつかの方法がありますが、AnimatorコンポーネントのPlayメソッドを使うことで、アニメーションを好きなタイミングで再生することができます。
また、このPlayメソッドは、AnimatorControllerで遷移されないステートのアニメーションも再生させることができます。
そこで、このページでは、Unityでスクリプトから任意のタイミングでアニメーションを再生できるAnimator.Playメソッドについて、どんなメソッドなのか、使い方までをまとめていきます。
アニメーションを再生できるAnimator.Playメソッド
まずは、AnimatorのPlayメソッドがどんなメソッドなのか、紹介していきます。
Animator.Playメソッドは、指定したステートを再生する処理を行うメソッドです。
ステートとは、AnimatorControllerに設定している以下の項目のことで、個々のアニメーションが設定されている部分です。

通常は、上記のように「Entry」から矢印が繋がっていて、オブジェクトが読み込まれたタイミングでそのステートに遷移することになるので、アニメーションが自動で再生されます。
しかし、AnimatorControllerで遷移されないステートや、一度再生されたステートなどを再生させたい場合に、Animator.Playメソッドを使うことで、そのステートの再生処理を行うことができます。

また、Animator.Playメソッドで指定したステートを再生する際に、再生位置を指定できるというメリットもあります。
Animator.Playメソッドの使い方
ここからは、Animator.Playメソッドの使い方について紹介していきます。
Animator.Playメソッドの記述方法
Animator.Playメソッドは、以下のようにスクリプト内で記述することで、再生処理を行うことができます。
Animator.Play(stateName, layer, normalizedTime);
stateName:ステートの名前(string型)
layer:レイヤー番号(int型)
normalizedTime:再生位置(float型)
第1引数に、再生させたいステートの名前をstring型で指定します。
第2引数には、再生させたいレイヤー番号をint型で指定し、この引数を省略すると「-1」の値が入り、この数字に最も近いレイヤーが選択されます。
デフォルトで設定されているBase Layerは、レイヤー番号が「0」となっているので、Base Layerを使っている場合は、省略する(-1)か「0」を指定してあげます。
第3引数には、アニメーションを再生する位置をfloat型で指定することができ、省略するとアニメーションが最初から再生されることになります。
このアニメーションを再生する位置は、アニメーションの最初の地点を「0」、最後の地点を「1」として、割合で位置を指定していくことになります。

Animator.Playメソッドの使用例
ここでは、Animator.Playメソッドを使った使用例を紹介していきます。
以下のキューブ型のオブジェクトに、「Test1」と「Test2」の2つのアニメーションを作成して、キーボードの「1」を押したら「Test1」が再生されて、「2」を押したら「Test2」が再生されるという処理を作ってみます。


なお、アニメーションの作成については、以下の記事も参考にしてみてください。
自動でアニメーションが再生されないように設定する
まず、デフォルト設定のままだと、オブジェクトが読み込まれたタイミングでアニメーションの再生が自動で行われるため、ここでは自動再生されないように設定していきます。
AnimatorControllerを開いて、何も無いところで右クリックをして、「Create State」の中にある「Empty」を選択します。

新しくステートができますが、これは何もしないステートにしたいので、特に中の設定は変えず「Start」などのような名前にしておきます。

そして、「Entry」のステートを右クリックして、「Set StateMachine Default State」を選択して、矢印を先ほどの「Start」のステートの方に繋げておきます。

以下のように、「Entry」から空の「Start」に遷移させるようにして、「Test1」と「Test2」には遷移しないようにしています。

この時点でゲームを一度実行してみると、アニメーションの再生が行われないのが確認できます。

Animator.Playメソッドでアニメーションの再生処理を行う
キー操作でアニメーションを再生できるように、オブジェクトに以下のスクリプトをアタッチしていきます。
using UnityEngine;
public class Test : MonoBehaviour
{
Animator animator; // Animatorコンポーネントの変数を作成
void Start()
{
animator = GetComponent<Animator>(); // Animatorコンポーネントを取得する
}
void Update()
{
// 1キーを押した場合
if (Input.GetKeyDown(KeyCode.Alpha1))
{
animator.Play("Test1"); // Test1のアニメーションを再生させる
}
// 2キーを押した場合
if (Input.GetKeyDown(KeyCode.Alpha2))
{
animator.Play("Test2"); // Test2のアニメーションを再生させる
}
}
}
まず、9行目でGetComponentメソッドを使って、Animatorコンポーネントの取得を行っています。
そして、「1」キーを押した場合の17行目と、「2」キーを押した場合の23行目で、Animator.Playメソッドを使って、アニメーションを再生させる処理を行っています。
ここでは、どちらのアニメーションも最初から再生させたいので、第2引数と第3引数は指定せずに省略して記述しています。
これでゲームを実行してみると、

上記のように、「1」キーを押すと「Test1」のアニメーションが再生されて、「2」キーを押すと「Test2」のアニメーションが再生されるようになりました。
このように、Animator.Playメソッドを使うことで、遷移されていないアニメーションのステートを再生させることができます。
まとめ
このページでは、Unityのアニメーションをスクリプトから任意のタイミングで再生させるAnimator.Playメソッドについて、まとめていきましたが、いかがでしたでしょうか?
Animator.Playは、引数で指定したステートを再生する処理を行うメソッドで、再生するレイヤーや再生開始位置を決めることもできます。
すでに再生したアニメーションをもう一度再生させたい場合や、遷移しないステートのアニメーションを再生させたい際などに、Animator.Playメソッドを使うことが多いです。
アニメーションを再生させる方法は他にもあるので、自分の作りたい処理によって使い分けていきましょう。
最後までお読みいただきまして、ありがとうございました!
コメント