にゃんたのUnityゲーム開発覚え書き

Unityのゲーム開発についてあれやこれや書いていきます。

Unityちゃんを自作したAnimetorで動かしてみよう

Unityちゃんを指定のタイミングで動かそう

こんばんわ。siroです。

昨日Unityちゃんを走らせるところまでやったんですが、

もともとあるAnimetorを使って最初に表示するアニメーションを変更しただけだったので、今回はAnimetorを作ってみようと思います。

いけたら、スクリプトから任意のアニメーションを実行するところまでいけたらと思います。

※前回の記事は以下です

a-zero.hatenablog.com

 

まずはUnityちゃんを走らせよう

まずは、Animetorを作りたいフォルダで右クリックして「Animetor Controller」を選択します。

f:id:sirosiro346:20170919231520p:plain

 

AnimetorウィンドウをWindowsタブから開いて、右クリックしてEmptyのコンポーネントを置く。

f:id:sirosiro346:20170919231552p:plain

f:id:sirosiro346:20170919231606p:plain

 

コンポーネントを作ると、最初に実行されるAnimetorとして設定されるので、

名前を変更してアニメーションを指定する。

f:id:sirosiro346:20170919231624p:plain

f:id:sirosiro346:20170919231958p:plain

 

AnimetorをUnityちゃんにドラッグアンドドロップして走ることを確認!

f:id:sirosiro346:20170919232043p:plain

 

UnityちゃんがジャンプするAnimetorを用意しよう。

さきほど作成したAnimetorにさらにCreate Emptyしてコンポーネントを置き、名前をJumpに変更。

その後、RunningからJumpに相互で遷移するために、右クリックしてMake Transitionを選択して相互に矢印をしておく。

f:id:sirosiro346:20170919232302p:plain

 

ここからが本題。スクリプトで実行するための準備をしよう

状態を遷移するための矢印だけはつなぎましたが、条件などなにも指定していない状態なので、条件を設定する必要があります。

 

具体的には、

①Animetor上にBool値によって状態が遷移するように設定

スクリプト上で指定の条件のときにBool値をTrueもしくはFalseにする処理実装

この二つが必要です。

 

①Animetor上にBool値によって状態が遷移するように設定

これは、Parameterタブで設定します。

ここにBool値で変数追加し、状態遷移の矢印を選択して設定していきます。

※ここではRunningからJumpに遷移する条件を、parameterの「jump」がtrueだったとき

 としています。同様に逆パターンもparameterが「running」のときとして用意しておく

f:id:sirosiro346:20170919233530p:plain

 

スクリプト上で指定の条件のときに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);
        }

    }
}

---------------------------------------------------------------------------------------------------

 

そして動かしてみたらこんな感じになりましたとさ。

youtu.be

 

本日学んだこと

  1. Animetorに遷移の変数、条件を持たすことができる
  2. Animetorの変数の値はスクリプトから変更可能。これを利用して遷移を行う。

 

あんまり進まなかったですが、とりあえず動かせたので良しとします。

アニメーションの終了判定とかもっと良い方法ありそうだけど・・・

 

 

なんとなく次のアプリが見えてきた

ここまでやってみて、なんとなく次のアプリをどういうものにするか見えてきた。

とりあえず「縦スクロールの障害物回避アプリ」にしようと思います。

 

そんなところでー!

ではではノシ