Unityちゃんをキー操作で走らせる


はじめに
=====

[前回](http://qiita.com/mokemokechicken/items/c7b6e96af3ff9cb6c5af)はUnityちゃんを単に表示しただけでした。
今回は、キー操作でUnityちゃんをモーション付きで動かしてみることにします。

Stepとしては以下のようになります。

* 床を置く
* Animatorを設定する
* 動きを制御するScriptを付ける


床を置く
=======

今回は重力の設定とかはしないので、別に床が無くても良いんですが、雰囲気を出すために一応作っておきます。

メニューから `GameObject` -> `Create Other` -> `Plane` を選びます。

![GameObject_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/11124/b9ad6ebe-75d0-9047-ef74-bade7586e51c.png "GameObject_と_Menubar.png")

するとUnityちゃんの胴体を真っ二つにする位置に表示されるので、位置を変更しておきます。
`position=(0,0,0)` が良いでしょう。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/4dfb6a6f-a625-6290-a8d9-d71fcad12aa8.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

こんな感じになります。

Animatorを設定する
============

次に、キャラクターとMotionを関連付けます。UnityちゃんのPackageには色々Motionが付属しているので簡単に使えるのです。

Animatorというのを使うと、キャラクターの状態(止まっている、走っている、ジャンプしている、ダメージを受けている、等）に応じて、Motionを切り替えることができるようです。
AnimatorはStateMachine（メカニム？）になっていて、状態にMotionを関連付け、各変数の条件によって状態遷移やMotionのBlendなどを定義できるようです。

凝った使い方をしないのであれば、Animatorは簡単なので今回もAnimatorを使って設定しておきます。


Animator作成
----------
まず、Projectの 「Create」から `Animator Contoller`を選択します。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/9cf80c81-8932-3f6b-fb61-7652a7993339.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

すると以下のように `Any State`とだけ書かれた四角が表示されます。
この作ったAnimatorを `UnityChan Demo1` と名づけておきます。


![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/2949884c-7634-fed5-9b35-48a1c87e01f9.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

IdleとRunningの状態を作成
--------------------

`Any State`はあまり気にしないで、何も無いところを右クリックして `Create State` → `Empty`を選択します。
すると、`New State`という四角が現れるので、名前を `Idle`としておきます。
これで `Idle`という状態が作られました。同様に`Running`という状態も作成しておきます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/6f67e652-2b5d-7a68-6f70-ec7b09ab6bba.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/9d38bc07-73b3-5656-903d-6b453dbcacb1.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

状態に対してMotionを設定
------------------

`Idle`状態に割り当てるアニメーションを選択します。今回は `WAIT01`を使うことにします。
`Idle`の状態を選択して、Motionのところをクリックして`WAIT01`を選べばOKです。


![Select_Motion_と_demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png](https://qiita-image-store.s3.amazonaws.com/0/11124/2cdecb92-a46b-2bf9-3343-993f5640c6be.png "Select_Motion_と_demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png")


同様に `Running`状態に対して、Motion `RUN00_F`を割り当てておきます。

![demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png](https://qiita-image-store.s3.amazonaws.com/0/11124/6c52e4a3-e507-0b0c-bb27-43dfbf7aca94.png "demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png")

状態間の遷移を設定
--------------

`Idle`を右クリックして、`Make Transition`を選んで、`Running`に対して矢印を引きます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/f0f51a2b-a98b-16a5-f9a6-4f4c6c3e8495.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/eb79eac1-e42e-2076-9714-7b1c16b7e972.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

左下のParameterの＋をクリックして、`Bool`を選びます。
![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/cab08d97-1608-e836-d35b-a1b6c13ed69a.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

`New Bool`という変数が追加されるので、名前を`is_running`とでもしておきます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/0f995eae-71a3-6278-ca87-6f0720760061.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

矢印をクリックすると、右側のInspectorが変わります。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/e178bb75-63e5-7d4e-6e38-ab826ed2645f.png "demo1_unity_-_RoadRunner_-_Web_Player.png")


`Conditions`で `is_running` -> `true` としておきます。

![demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png](https://qiita-image-store.s3.amazonaws.com/0/11124/4012ba4e-5696-8154-be28-0d1d18385935.png "demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png")


また、逆向きの矢印 `Running` -> `Idle`を作って、同様のConditionを変更し、
`is_running` -> `false` としておきます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/d337a0fe-9356-2423-0900-e29288773039.png "demo1_unity_-_RoadRunner_-_Web_Player.png")


UnityちゃんにAnimatorを設定
--------------------

Hierarchyの`unitychan`を選択して、Animator → Controller のボタンをクリックして、先ほどの`UnityChan Demo1`を選びます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/9681acd4-808e-b6db-c250-4b47fe3711ef.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

これでUnityちゃんにMotionが関連付けられました。

テスト実行
---------
実行してみると、のんびり伸びをするUnityちゃんが表示されると思います。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/38a615cc-c459-d08f-909b-bc3f2b49602e.png "demo1_unity_-_RoadRunner_-_Web_Player.png")


動きを制御するScriptを付ける
============

キー操作でキャラクターを動かすために、ちょっとスクリプトを書きます。
おそらく既存のスクリプトでもできるような気がしますが、練習として自作してみることにします。

C# スクリプトの新規作成
----------------
Project → Create → C# Script を選びます。名前を`UnityChanDemo1`としておきます。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/c66e1f9d-5b9f-4195-438e-d36ede67fab1.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

Unityちゃんにスクリプトを設定
---------------
その作ったファイルを、Hierarchyのunitichanにドラッグアンドドロップします。

![スクリーンショット_2014_04_15_22_59.png](https://qiita-image-store.s3.amazonaws.com/0/11124/b8f4e096-327e-b145-34bf-1e8caa8858f1.png "スクリーンショット_2014_04_15_22_59.png")

UnityちゃんのInspectorを見ると作ったスクリプトがComponentとして増えているのがわかります。

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/f88bd147-c701-75e4-d8d4-4a78ad9ac207.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

スクリプトの編集
--------------

AssetのスクリプトかInspectorのスクリプトをダブルクリックします。

するとMonoDevelopが起動します。メソッドの補完とか完全に効くのでとても便利です。
とりあえず、以下のように書きます。

```c#:UnityChanDemo1.cs
using UnityEngine;
using System.Collections;

public class UnityChanDemo1 : MonoBehaviour {

	private Animator animator;
	// Use this for initialization
	void Start () {
		animator = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKey("up")) {
			transform.position += transform.forward * 0.01f;
			animator.SetBool("is_running", true);
		} else {
			animator.SetBool("is_running", false);
		}
		if (Input.GetKey("right")) {
			transform.Rotate(0, 10, 0);
		}
		if (Input.GetKey ("left")) {
			transform.Rotate(0, -10, 0);
		}
	}
}
```

ポイントは、

```
		animator = GetComponent<Animator>();
```

とすることで、 Unityちゃんに関連付けられている Animatorオブジェクトの参照が取得できるということ。

```
		animator.SetBool("is_running", true);
```
とすることで、Animatorの変数に対して、Set/Getできること。そしてそうすると、Animatorが状態遷移をしてMotionが切り替わります。

以下の様なメソッドで動かすのに必要な処理ができること

```
Input.GetKey("up"); // キー入力判定
transform.position += transform.forward * 0.01f; // 移動
transform.Rotate(0, -10, 0); // 回転
```


という感じでしょうか。


おわりに
====

動きが遅いとか、カメラが追随しないとか、色々ありますが、とりあえず動くようにはなりました。

今回作ったものは以下のURLにPublishしてあります。
https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1b/demo1b.html