【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！その４【基礎】

## 目次
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！
[その１](http://qiita.com/kuuki_yomenaio/items/07a3214eb518c21a10b1)
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)
[その４](http://qiita.com/kuuki_yomenaio/items/33cc2d234f3394bd0eab)
[その５](http://qiita.com/kuuki_yomenaio/items/95f54a7404d71c80cbaf)
[その６(完結)](http://qiita.com/kuuki_yomenaio/items/03ed5212de0a93f0de13)

## オブジェクトの配置
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)の続きになります。
ついにゲーム画面らしくSceneにモノを追加していく作業になります。
画面上段のSceneタブを押下してAnimator画面からScene画面に戻りましょう。

![スクリーンショット 2014-03-28 14.07.45.png](https://qiita-image-store.s3.amazonaws.com/0/26453/02c6444f-6b7e-2281-539d-452736a94c55.png)

#### 床の追加
床はplaneやterrainツールなどでもいいのですが、
今回はcubeで作ります。
GameObject→Create Other→Cubeを押下し、cubeを作成します。

![スクリーンショット 2014-03-28 14.08.01.png](https://qiita-image-store.s3.amazonaws.com/0/26453/26f9ab4e-fbbe-9fd7-56ad-c95d2855ae03.png)

作成したらInspectorを以下のように調整しておきましょう。
名前：Floor
Position : x 0 y -1 z 0
Scale : x 30 y 1 z 30

#### キャラクターの追加

gontaもすでに追加されているかもしれませんが、
追加されていなければ、D&Dして追加して下さい。
Inspectorの設定は
Position : x 0 y 0 z 0
にしておきましょう。
ここで一旦実行します。

![スクリーンショット 2014-03-28 14.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/26453/bbc39d54-1293-22bc-5a64-a58c315e43f1.png)

暗いですね。
ではライトを追加しましょう。

#### ライトの追加

GameObject→Create Other→Direction Lightを選択して、
ライトを追加します。
Position : x 0 y 10 z -10
Rotation : x 50 y -30 z 0 
辺りでOKです。
実行してみるとライトの恩恵を受けて明るくなりました。

![スクリーンショット 2014-03-28 14.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/26453/97b8e635-d280-621c-119b-db70a287b2ef.png)

## キャラクターを動かそう
ようやくコードが書けます！長かったですね…。
スクリプトを組んでキャラクターを操作出来るようにしていきます。

Create→C# Scriptを選択して、csファイルを生成します。
名前はCharacterSetupとしました。

![スクリーンショット 2014-03-28 14.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/26453/9e2b213c-6184-4042-624b-200c587ac8b6.png)

ダブルクリックし、ファイルを開き以下のように記述してください。

```csharp:CharacterSetup.cs
using UnityEngine;
using System.Collections;

public class CharacterSetup : MonoBehaviour {

	private float speed = 6.0f;
	private Vector3 moveDirection;
	private CharacterController character;
	// Use this for initialization
	void Start () {
		//Componentに登録されているCharacterControllerを取得します。
		character = GetComponent<CharacterController>();
	}

	// Update is called once per frame
	void Update () {
		// 上下キーが押されたら
		if(Input.GetAxis("Vertical") != 0){
			float varticalMove = Input.GetAxis("Vertical");

			moveDirection = new Vector3(0 , 0 , varticalMove);
			moveDirection = transform.TransformDirection(moveDirection);
			moveDirection *= speed;
		}

		// 左右キーが押されたら
		if(Input.GetAxis("Horizontal") != 0){
			transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
		}

		character.Move(moveDirection * Time.deltaTime);
	}
}
```
もし、入力ミスがあった場合は、
コードエラーは以下のようにこじんまりと教えてくれますが、
Consoleタブを開けば詳細に見ることが出来ます。

![スクリーンショット 2014-03-28 14.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/26453/3f9c491d-b2d0-7c1e-1ce4-ee3674186312.png)

入力が出来ましたら、gontaにD&Dしてスクリプトを登録、そして実行！

…

キーボードの左右キーは効くのですが、上下に動きませんね…。
それもそのはず、スクリプトに書いたCharacterControllerが無いからです。
では、CharacterControllerをgontaに追加してあげましょう。
gontaを選択して、Inspectorの一番下にあるAdd Componentを押下。
Physics→Character Controllerを選択。

![スクリーンショット 2014-03-28 22.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/26453/e492640d-6f97-7bc8-91d5-301d88ac5a0f.png)


これでCharacterControllerが追加出来ました。
ちょっと調整します。
Center : x 0 y 1 z 0
radius : 0.6
にします。

![スクリーンショット 2014-03-28 22.47.35.png](https://qiita-image-store.s3.amazonaws.com/0/26453/cf05c6f7-0332-4114-facd-4c7a29f5bf4b.png)

[Character Controller](http://docs-jp.unity3d.com/Documentation/Components/class-CharacterController.html)
上手く説明出来ないので詳しくは公式を見て欲しいですが、キャラクター制御用の判定を行う専用コンポーネント…という感じでしょうか。

![スクリーンショット 2014-03-28 22.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/26453/9de58352-d6a8-c5ca-6cb7-fc285a3dd419.png)

この外枠にあるカプセルコライダー型のものがCharacterControllerになります。

追加が終わったら早速実行します。
おお！上下キーも効くようになりましたね！

![スクリーンショット 2014-03-28 22.50.08.png](https://qiita-image-store.s3.amazonaws.com/0/26453/b5286e50-01eb-8465-f606-b0df8ad8120d.png)


しかし、このままではT字型のポーズで固まったまま移動しています。
というわけで[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)まで作成していたAnimatorもつなぎこみます。

まずAnimatorSetupをgontaにD&Dします.
するとこのようにAnimatorコンポーネントに登録されます。

![スクリーンショット 2014-03-28 22.52.12.png](https://qiita-image-store.s3.amazonaws.com/0/26453/9355f4c6-0f33-930f-52ed-4e60520409ed.png)

そしてCharacterSetup.csを以下のように変更します。


```csharp:CharacterSetup.cs
using UnityEngine;
using System.Collections;

public class CharacterSetup : MonoBehaviour {

	private float speed = 6.0f;
	private Vector3 moveDirection;
	private CharacterController character;
	private Animator animator;

	// Use this for initialization
	void Start () {
		//Componentに登録されているCharacterControllerを取得します。
		character = GetComponent<CharacterController>();
		animator = GetComponent<Animator>();
	}

	// Update is called once per frame
	void Update () {
		// 上下キーが押されたら
		if(Input.GetAxis("Vertical") != 0){
			float varticalMove = Input.GetAxis("Vertical");
			animator.SetFloat("speed" , varticalMove);

			moveDirection = new Vector3(0 , 0 , varticalMove);
			moveDirection = transform.TransformDirection(moveDirection);
			moveDirection *= speed;
		}

		// 左右キーが押されたら
		if(Input.GetAxis("Horizontal") != 0){
			transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
		}

		character.Move(moveDirection * Time.deltaTime);
	}
}
```

たった三行追加するだけですね。

```csharp:CharacterSetup.cs
private Animator animator;
animator = GetComponent<Animator>();
animator.SetFloat("speed" , varticalMove);
```

変更出来たら実行してみましょう！

![shot.png](https://qiita-image-store.s3.amazonaws.com/0/26453/3385fbca-f904-0dee-7444-2a841f6f8c78.png)

走ったー！gontaが走りました！お疲れ様です！

#### 何故走るのか？

```csharp:CharacterSetup.cs
animator.SetFloat("speed" , varticalMove);
```

キモはやはりここになります。
Animatorを作成した時にspeedというパラメータを作成したのを
覚えているでしょうか？
そこに値を渡している、という処理になるのですが、
値を渡すだけでtransitionが働き、自動でIdle→Forwardと状態遷移を行ってくれます。
もちろんIsAttackというフラグを新たに作って攻撃遷移を作ったり、
ジャンプモーションなんか作る場合も、Animatorにパラメータを追加、cs側で値を受け渡すだけでOKです。
別のcsファイルからでも値を渡すだけ、別のゲームにAnimatorを持って行って値を貰えばその状態遷移が出来る、と再利用性の高さが最大のメリットだと思います。

## その５につづく
次はゲームステージの作成と当たり判定などをやります。
今回長かった。分割すれば良かったかな。
多分その６ぐらいまで続きます…。