Unityちゃんを自作したAnimetorで動かしてみよう
Unityちゃんを指定のタイミングで動かそう
こんばんわ。siroです。
昨日Unityちゃんを走らせるところまでやったんですが、
もともとあるAnimetorを使って最初に表示するアニメーションを変更しただけだったので、今回はAnimetorを作ってみようと思います。
いけたら、スクリプトから任意のアニメーションを実行するところまでいけたらと思います。
※前回の記事は以下です
まずはUnityちゃんを走らせよう
まずは、Animetorを作りたいフォルダで右クリックして「Animetor Controller」を選択します。
AnimetorウィンドウをWindowsタブから開いて、右クリックしてEmptyのコンポーネントを置く。
コンポーネントを作ると、最初に実行されるAnimetorとして設定されるので、
名前を変更してアニメーションを指定する。
AnimetorをUnityちゃんにドラッグアンドドロップして走ることを確認!
UnityちゃんがジャンプするAnimetorを用意しよう。
さきほど作成したAnimetorにさらにCreate Emptyしてコンポーネントを置き、名前をJumpに変更。
その後、RunningからJumpに相互で遷移するために、右クリックしてMake Transitionを選択して相互に矢印をしておく。
ここからが本題。スクリプトで実行するための準備をしよう
状態を遷移するための矢印だけはつなぎましたが、条件などなにも指定していない状態なので、条件を設定する必要があります。
具体的には、
①Animetor上にBool値によって状態が遷移するように設定
②スクリプト上で指定の条件のときにBool値をTrueもしくはFalseにする処理実装
この二つが必要です。
①Animetor上にBool値によって状態が遷移するように設定
これは、Parameterタブで設定します。
ここにBool値で変数追加し、状態遷移の矢印を選択して設定していきます。
※ここではRunningからJumpに遷移する条件を、parameterの「jump」がtrueだったとき
としています。同様に逆パターンもparameterが「running」のときとして用意しておく
②スクリプト上で指定の条件のときにBool値をTrueもしくはFalseにする処理実装
とっても簡単です。
animator.SetBool ("jump", true)
これだけ。
あとは、Updateメソッドはフレームごとに毎回実行されちゃうんで、アニメーションが終わるまでアニメーションを継続する必要があるのでそれも書いてます。
// Animetorの状態を取得
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
// Jumpのアニメーションを終了判定し、falseに変更
if( stateInfo.IsName("Base.Jump") && stateInfo.normalizedTime >= 0.4f ) {
Debug.Log("BaseレイヤーのJumpを実行完了");
animator.SetBool("jump", false);
}
こんな感じでいけます。
Baseという名前のJumpが実行中かつ、実行時間が0.4以上の場合のみジャンプ完了
としています。
あとは、横移動と縦移動ができるように処理加えて一旦完了
全文はこんな感じ
---------------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UnityChanAnimetorScript : MonoBehaviour {
private Animator animator;
private float dx;
private float dz;
// Use this for initialization
void Start () {
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
// Animetorの状態を取得
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
// Jumpのアニメーションを終了判定し、falseに変更
if( stateInfo.IsName("Base.Jump") && stateInfo.normalizedTime >= 0.4f ) {
Debug.Log("BaseレイヤーのJumpを実行完了");
animator.SetBool("jump", false);
}
// 矢印キーの値に応じてUnityちゃんを移動
if (Input.GetButton ("Jump")) {
animator.SetBool ("jump", true);
}
else if (Input.GetAxis ("Vertical") != 0 || Input.GetAxis ("Horizontal") != 0) {
dx = Input.GetAxis ("Horizontal");
dz = Input.GetAxis ("Vertical");
transform.Translate (dx * 0.2f, 0, dz * 0.2f);
}
}
}
---------------------------------------------------------------------------------------------------
そして動かしてみたらこんな感じになりましたとさ。
本日学んだこと
- Animetorに遷移の変数、条件を持たすことができる
- Animetorの変数の値はスクリプトから変更可能。これを利用して遷移を行う。
あんまり進まなかったですが、とりあえず動かせたので良しとします。
アニメーションの終了判定とかもっと良い方法ありそうだけど・・・
なんとなく次のアプリが見えてきた
ここまでやってみて、なんとなく次のアプリをどういうものにするか見えてきた。
とりあえず「縦スクロールの障害物回避アプリ」にしようと思います。
そんなところでー!
ではではノシ