動くブロック

提供: socialakiba wiki
移動: 案内検索

プレイヤーが乗ると動き出し、降りると止まるボックスを作る。

プレイヤーとボックスの当たり判定が必要 → C#スクリプト

二つの状態(止まっていると動いている)が必要 → 「animation clip」 が「状態」。Animator に状態間の遷移関係を記述

ユニティちゃんと床とボックスの準備

Unitychan002.png

床 (plane) とボックス (cube) を作り適当にテクスチャを貼っておく。


Unitychan003.png

とりあえずプレイしてみて、ユニティちゃんがボックスに乗れるかどうか確認しておく。


アニメーションクリップとアニメーターの準備

Unitychan004.png

ボックスを選択した状態で windows → animation


Unitychan005.png

動かす前に Animator と Animation Clip を作ろうぜと言われるので create ボタンを押す。

そうすると animation clip に名前付けて保存してねと言われるので、 適当に名前付けて(デフォルトだと animation clip.anim)適当な場所に保存。


Unitychan006.png

そうするとこんな具合に空のアニメーションクリップができる。

アニメーションクリップには transform (position, rotation, scale) をキーフレームアニメーションで付けられるのだが、 まったく動かさない場合にはキーを打つ必要はない。

一つ目の「止まっている状態」と二つ目の「動いている状態」の、二つの animation clip を作るのだが、 一つ目の clip は何もしなくてよい。


Unitychan009.png

二つ目のクリップを作るには一つ目のクリップ名(new animation)が表示されているメニューを開き、 一番下の create new clip をクリック。

そうするとまたクリップを保存してねと言われるので、適当に名前を付けて(new animation 2 とか)保存。


Unitychan008.png

Animator を開いてみる(Scene、Game、Asset Store の隣に Animator があるからそこをクリック)

clip が一つだけのときに開くとこうなっている。

Entry、Exit、Any State は勝手に作られる。特にいじる必要はない。

Entry から一つ目のクリップ(new animation)に矢印が引いてある。 つまり、new animation はゲームが開始した直後の状態となる。

下の、アセットの中に表示されているクリップ(new animation)を選択した状態で、右下の 3Dビューにボックスをドラッグアンドドロップすれば、 クリップ(の動き)をプレビューすることができる。


アニメーションの作成

Unitychan020.png

一つ目のクリップには何もしないで、二つ目のクリップを作りましたね?

では二つ目のクリップで add property → transform → position の + をクリック

scene を見ながら、ボックスを動かし、 適当なところにキーを打っていく。


Unitychan010.png

dope sheet で適当にキーを打ったら、curve に切り替えて調整するとよい。

動きは適当にプレビューして確かめて、終わったら録画ボタン(赤い丸)を非選択にして終了。

キーが打てるのは0秒から1秒の間だが、 1秒より後にも打ちたいときは、 下のスクロールバーの右端についてる矢印をひたすら押し続ける(しかないらしい?)。 そうすると時間のレンジが広がる。


アニメーターで状態遷移を定義

Unitychan012.png

一つ目のクリップには何もしないで、二つ目のクリップをに動きをつけましたね? では次に状態遷移です。

new animation から new animation 2へ遷る状態遷移(止まっている状態から動いている状態)と、 new animation2 から new animation へ戻る状態遷移を定義します。

new animation から new animation 2 に矢印を引くには、 new animation を選択した状態で右クリックして new transition。 new animation から矢印が伸びるので、new animation 2の上でクリック。 これで new animation から new animation 2 に矢印が引けましたね?


Unitychan013.png

同じように、new animation 2 から new animation へ矢印を引いてください。


アニメーターに Bool を追加

Unitychan015.png

C#スクリプトからアニメーターにパラメーターを渡すことで、アニメーターが状態遷移します。

そのパラメーターをアニメーター側に作ります。

アニメーターの左上、List is Empty になっていて、最初パラメーターは一つもありません。

そのすぐ上の + をクリックして Bool を選択。

Bool パラメーターは true か false の二つの値しかとりません。


Unitychan016.png

パラメーター名はなんでもいいんですが、とりあえず enter にしました。

new animation から new animation 2 に引いた矢印を選択した状態で、 左側の conditions の + をクリックして、enter が true にします。 つまり、enter が true になったときに一つ目のクリップから二つ目のクリップに遷移します。


Unitychan017.png

今度は new animation 2 から new animation に引いた矢印を選択した状態で、 こんどは enter を false にします。


スクリプトを追加

アセットの上で右クリックして create → C# script

名前は何でもいいですがとりあえず collide01.cs としました。

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

public class collide01 : MonoBehaviour {

    private bool isMoving;// 動いているかどうか
    private Animator animator;

    // Use this for initialization
    void Start() {
        isMoving = false;// 最初は動いてない。
        animator = GetComponent<Animator>();
    }
	
	// Update is called once per frame
	void Update () {
    }

    void OnCollisionEnter(Collision col)
    {
        // 止まっているところにプレイヤーが乗った
        if (!isMoving && col.gameObject.CompareTag("Player"))
        {
            isMoving = true;
            animator.SetBool("enter", true);
            Debug.Log("Enter!");
        }
    }

    void OnCollisionExit(Collision col)
    {
        // 動いているときにプレイヤーが降りた
        if (isMoving && col.gameObject.CompareTag("Player"))
        {
            isMoving = false;
            animator.SetBool("enter", false);
            Debug.Log("Exit!");
        }
    }
}

これが、アニメーターの enter パラメータに値をセットするスクリプト。

Unitychan018.png

このスクリプトをボックスの inspector に追加します。

これでだいたい終わりです。


用語解説

animation clip
状態遷移する状態の一つ一つのこと(アセットの一種。つまり Assets フォルダ内に存在するファイルに記述される)。必ずしもキーを打っている必要はない(静止していても良い)が、animation を少なくとも一つ含んでいなくてはならない。
animation
animation clip に記述された動きのこと。しかし、静止していてもよい。animation window で操作できる。
animation controller
状態遷移図のこと(アセットの一種)。animator に一つだけ結び付けられていなくてはならない。
animator
オブジェクトに割り当てられるコンポーネント。そのオブジェクトの動きを animation controller によって制御する。
animation window
オブジェクトを選択した状態では、そのオブジェクトに割り当てられたすべての animation clip をメニュー表示する。animator タブで animation clip を選択した状態では、その clip だけを表示する。
parameters
状態遷移する条件となる数値。bool ならば SetBool() で、int ならば SetInteger() で C# スクリプト側から animator に値を格納する。