Daydream開発入門 その4(簡単なゲーム作成)

今回は敵(Cube)が自分の方へ向かって来るのでそれを倒すゲームを作ってみたいと思います
↓な感じです(ちょっとマウスポインターが邪魔ですね。すみません... )
![daydream-easy-game.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/6b476b6b-02a7-7b8b-7851-72eb304f4e22.gif)

## 前提
[こちらの記事](https://qiita.com/beaa/items/5cb55fd0473acde134a1) の環境構築が済んでいること
(やらなくても実装はできますが、[Instant Previewの設定](https://qiita.com/beaa/items/05b78a60929e2105dbe3) と [Unityエディタ上でシミュレート](https://qiita.com/beaa/items/aea0c6d669cf6c07bd63) も合わせてご覧いただけたらと思います)

## Cubeオブジェクトを敵オブジェクト化する
環境構築時に動作確認用に置いたCubeオブジェクトを敵オブジェクトとして扱うようにします

1. **Hierarchy** のCubeオブジェクトを **Projectビュー** にドラッグ&ドロップしプレハブ化する
2. プレハブ化されたCubeオブジェクトの名前を `Enemy` に変更
3. **Hierarchy** のCubeオブジェクトを削除

## 動的に敵オブジェクトを配置
1. 動的に敵オブジェクトを作成するために、まずは空のオブジェクトを作成
2. 作成したオブジェクトに `EnemyCreator` と名前をつける
    
    ![スクリーンショット 2017-11-04 21.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/112492/c48feee3-90e0-1438-da11-da8606fcea54.png)
3. Add Componentでスクリプト `EnemyCreator` を追加

    ![スクリーンショット 2017-11-04 21.21.38.png](https://qiita-image-store.s3.amazonaws.com/0/112492/f4c56feb-5971-3cbd-59cc-0be2cc215d12.png)
4. Inspector上で敵オブジェクトと敵生成時間を設定出来るようにする

    ```C#:EnemyCreator
    public class EnemyCreator : MonoBehaviour {
	    // 動的に生成する敵
	    public GameObject enemy;
	    // 生成するまでのインターバル
	    public float interval = 3;
    }
    ```
5.  インターバル毎にランダムで敵を配置するコードを作成

    ```C#:EnemyCreator
	// 時間経過をカウント
	private float time;

	void Update () {
		time += Time.deltaTime;
		if (time >= interval) {
			time = 0;

			GameObject newEnemy = Instantiate (enemy);
			newEnemy.transform.position = new Vector3 (
				Random.Range(-10.0f, 10.0f), 
				Random.Range(0.0f, 3.0f),
				Random.Range(-10.0f, 10.0f));
		}
	}
    ```

6. Inspector上でEnemyCreatorスクリプトのEnemy変数に、`Enmyプレハブ`をドラッグ&ドロップし設定

    ![スクリーンショット 2017-11-04 22.20.42.png](https://qiita-image-store.s3.amazonaws.com/0/112492/5f64d236-c1ad-313e-2252-a6db4055b0e2.png)

これで敵オブジェクトのランダム配置は完了です！実行し、以下のようランダムでオブジェクトが生成されればOKです！
![daydream-enemy-create.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/fa465fdd-036a-6a71-4833-d1c027c7db4d.gif)

## 敵オブジェクトをコントローラーのクリックで倒す
1. `Enemyプレハブ`にAdd Componentで `Enemy` スクリプトを追加

    ![スクリーンショット 2017-11-04 22.39.39.png](https://qiita-image-store.s3.amazonaws.com/0/112492/83fc1790-6762-383c-3a88-e18052d86bae.png)
2. コントローラーでクリックされた時に消滅する用のコードを作成

    ```C#:Enemy
	public void Deth() {
		Destroy (this.gameObject);
	}
    ```

3. `Enemyプレハブ`にAdd Componentで `Event　Trigger` を追加

    ![スクリーンショット 2017-11-04 22.29.39.png](https://qiita-image-store.s3.amazonaws.com/0/112492/55634b43-38ec-336c-aec0-8513d981d39d.png)

4. **Add New Event Type** > **PointerClick** を選択しクリック時にイベントを発行するよう設定

    ![スクリーンショット 2017-11-04 22.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/112492/ecfccf82-f191-cedf-69a2-bf08fc5d3d91.png)

5. イベントに反応するオブジェクトとして`Enemyプレハブ`を設定

    ![スクリーンショット 2017-11-04 22.44.09.png](https://qiita-image-store.s3.amazonaws.com/0/112492/3729f3a3-196d-9815-3528-ab86b651862a.png)

6. **No Function** > **Enemy** > **Deth ()** を設定しクリック時に呼ばれるメソッドを指定

    ![スクリーンショット 2017-11-04 22.44.33.png](https://qiita-image-store.s3.amazonaws.com/0/112492/211149e3-3ed1-5f09-7148-d893929a3ce4.png)

これで敵オブジェクトをクリックすると消えるようになりました！
こんな感じで動作していればOKです！
![daydream-enemy-deth.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/3d00392c-8980-2c9a-9c6d-8ff52db33133.gif)

## 敵を自分の方に向かって来させる
その場に止まっているだけだと面白くないので、自分の方に寄って来るようにしたいと思います

1. Enemyスクリプトに敵の移動スピードと自分と敵が衝突するまでの距離を設定する変数を作成

    ```C#:Enemy
	// 敵スピード
	public float speed = 1f;
	// 自分と敵が衝突するまでの距離
	public float stoppingDistance = 2f;
    ```

2. 続けて敵が向かって来るコードを作成

    ```C#:Enemy
	void FixedUpdate() {
		// 自分の位置へ移動させる
		Vector3 moveDirection = Camera.main.transform.position;
		this.transform.LookAt (moveDirection);
		moveDirection = moveDirection - transform.position;
		if (moveDirection.magnitude > stoppingDistance) {
			moveDirection = moveDirection.normalized  * speed;

			transform.Translate (moveDirection * Time.deltaTime, Space.World);
		} else {
			// TODO 自分と衝突した
		}
	}
    ```

これで敵が向かって来るようになりました！
自分と衝突すると敵は止まるようになっています
![daydream-enemy-move.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/de67abcf-229c-3b6a-0e36-e1129d40984b.gif)

<br>
これで完成です！
なんとなくゲームっぽくなったかと思います！

## おまけ
このまま実機で実行してもアプリを終了することができません
アプリを終了するためには [こちらの記事](https://qiita.com/beaa/items/a9858c5737be3bd79c86) をご覧ください

## 最後に
まだまだゲームとして完成させるところは多くあるかと思います
例えば敵との当たり判定やスコア表示、音などの要素を盛り込めばもっと面白くなるはずです！
Daydreamは面白いので、もっとたくさん対応端末が出てくれたらなーと思います