png
Unity
Unity #2Day 25

[Unity] UnityのAnimatorを理解してみる

はじめに

この記事はUnity #2 Advent Calendar25日目の記事です。
UnityのAnimatorを触ってみます。
以前触った時に少し分かりにくい部分があったのでまとめてみました。
また、ノードベースのステートマシンでアニメーションを制御する機能を持つため、複雑になればなるほどスパゲティの状態になり易く後々修正をかける事が大変になってくるので、その辺も良い方法が見つかればと思います。

目標

今回、pngの連番素材を使ってAnimatorから動画再生、停止をコントロールしたいと思います。
複雑になってもシンプルかつ分かりやすい仕組みをつくる事が理想。

・まずpng連番素材を読み込み単純に再生させる

01.png
↑pngの連番素材をフォルダ毎読み込んだら、TextureTypeをSprite(2D and UI)に設定する必要があります。Sprite画像とは、Unityで使われる2D画像オブジェクトのことを言います。
Spriteに設定が終えたら、そのままDDでsceneに配置する事ができるかと思います。
  
  
02.png
↑連番の先頭の素材を配置し、AnimationウィンドウからCreateを押すと、新しいアニメーションクリップが作成され↑の状態になります。このまま、Spriteにしたpngの全素材をAnimationウィンドウにDDすると素材が読み込まれ、この状態でPlayModeボタンを押すと、png連番が再生されます。
AnimationウィンドウのSampleからfpsは素材にあった数値に指定しておく必要があります。

・ステートマシンでアニメーションを制御する

ここからが本題です。
デフォルトではループでアニメーションしてしまっているので、アニメーションクリップのインスペクタからLoopTimeのチェックを外してループを解除します。
アニメーターウィンドウにはデフォルトでついてくるEntryノードとExitノードとAnyStateノードがあります。
Entryノードはステートマシン内でのトランジション開始時に使用します。Entryノードは評価され、条件に従い移行先のステートに分岐します。このように、独自パラメータに設定されたステートをステートマシン開始時に評価することによって、Entryノードはステートマシン内で開始されたどんなステートでも制御することができます。
Exitノードはステートマシンを終了させるために使用します。
AnyStateノードは常駐している特殊なステートです。現在どのステートにいるかに影響を受けることなく、特定のステートに遷移したい場合のために存在しています。これは、全ステートに同じ遷移先を追加するのと同じ効果があります。AnyStateは、その特殊な機能によって、ステートの遷移先とすることはできません。
 
03.png
↑まずAnimatorウィンドウのParametersからbool値を選択して名前を付けます。Parametersビューの値はユーザーが定義する変数で、ステートマシンへの入力として使用されます。
  
04.png
↑今のままだとPlayModeボタンを押したと同時にAnimtionステイトに移行してしまってアニメーションが開始されてしまうので、空のステイトを用意します。(ここではWaitStateとしました)
先ほど説明した通り、Entryノードはステートマシン内でのトランジション開始時に使用されるので、開始からの遷移を設定します。ノードを右クリックでMakeTransitionで遷移したいノードへと接続します。
今回はPlay(アプリ実行時)→WaitStateAnimtionWaitStateと移行したいので上記の画像のようになりました。
  
05.png
↑ここで先ほど設定したParametersのboolの出番です。繋いだ線を選択しinspectorのConditionsから設定した変数を選択してあげます。
この状態でPlayするとステイトがWaitStateで止まるかと思います。

・スクリプトからステートマシンを制御する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Animationcon : MonoBehaviour {

    Animator test;//アニメーターを定義

    // Use this for initialization
    void Start () {

        test = GetComponent<Animator>();//testにアニメーターをセット
        test.Play("Animation");//Animationステイトアニメーションを再生

    }

    // Update is called once per frame
    void Update () {

    }
}

↑上記スクリプトでステートマシンのステイトを叩くことができます。
アニメーション終了時にWaitStateに動的に戻りたい時は、Conditionsから設定した変数を変えれば良い訳です。

ちなみに

基本的な事はこんな感じなので、あとは触ればわかるかと思います。
この方法で数のある遷移をするとそれなりに大変な事になると思うので、
右クリックでSub-StateMachineをつくってまとめるとか
【Unity】さよならステートマシン。旧AnimationっぽいAPIでアニメーションを再生する SimpleAnimation
【Unity】Playable APIで幾つかの小技
オススメです。

最後に

Unity #2 Advent Calendar 2017お疲れ様でした!
良いお年を!
  
  
足りない点あればご指摘お願いします!