Unity5の教科書 で「避けゲー」に必要な要素を学んだ

[Unity5の教科書 Chapter 3 学習メモ](http://qiita.com/shiimaxx/items/c366084058eff95ccd03) に引き続き、[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html) で学習した内容のまとめです。
今回は、いわゆる「避けゲー」を作るにあたって必要な要素が主な内容です。

なお、本文内に登場するコードはすべて C# です。

## プレイヤーを動かす

まずはゲーム画面に表示されているプレイヤーを動かすための処理を実装します。
通常、プレイヤーを動かすためにユーザが行なう操作は、マウスのボタンをクリック、ゲーム画面に表示されているボタンをタップなどがあります。

ユーザ操作にもとづいてプレイヤーを動かすためには、スクリプトで以下を行なう必要があります。

- ユーザの操作を検出する
- ゲーム画面に表示されているプレイヤーの位置を変更する

### ユーザの操作を検出する

マウスのボタンクリックを検出するには、`Input.GetMouseButton`, `Input.GetMouseButtonDown`, `Input.GetMouseButtonUp` が利用できます。
詳細は以下が参考になるかと思います。

http://qiita.com/shiimaxx/items/c366084058eff95ccd03#%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AB%E5%87%A6%E7%90%86%E3%82%92%E3%81%8A%E3%81%93%E3%81%AA%E3%81%86

また、別の方法としてはゲーム画面にボタンを表示させて、そのボタンがクリックされたりタップされたりするのを検出するという方法もあります。
その場合は uGUI の Button を利用します。具体的には、Button には `On Click` というプロパティがあり Button がクリックされた際に実行するメソッドが登録できます。
事前に定義したプレイヤーの位置を変更するメソッドを `On Click` に登録することで、Button のクリックをトリガーとしてプレイヤーの位置を変更することができます。

- 公式ドキュメント
    - https://docs.unity3d.com/ja/current/Manual/script-Button.html

### ゲーム画面に表示されているプレイヤーの位置を変更する

`Transform.Translate` というオブジェクトの位置を操作するメソッドがありますので、これを利用します。
引数には、Unity 上での 3D 空間でのベクトルと位置を表す `Vector3` 構造体を指定します。

例として、2D ゲームでプレイヤーの位置を右に動かしたい場合は、プレイヤーに紐付くスクリプトに次のようなコードを実装します。

#### マウスのボタンクリックをトリガーにする場合

```C#
void Update () {
    if(Input.GetMouseButtonDown(0)) {
        transform.Translate (5, 0, 0);
    }
}
```

`Input.GetMouseButtonDown(0)` は右ボタンがクリックされたタイミングで `True` が返ってきます。
`Update` メソッド内で `if` 文とプレイヤーの位置を変更する処理(`Transform.Translate`)を組み合わせることで、右ボタンをクリックしたときにプレイヤーを動かす実装ができます。


#### ゲーム画面に表示されているボタンのクリックをトリガーにする場合

```C#
public void ButtonClick(){
    transform.Translate (5, 0, 0);
}
```

`ButtonClick` メソッドを Button の `On Click` に紐付けることで、ゲーム画面上のボタンをクリックしたときにプレイヤーを動かす実装ができます。
ボタンがクリックされたことの検出自体は Button の `On Click` を利用します。`On Click` にはメソッドを登録するので、処理自体もメソッドとして定義する必要があります。

- 公式ドキュメント
    - https://docs.unity3d.com/ja/current/ScriptReference/Transform.Translate.html

## 障害物を動かす

障害物となるオブジェクトを動かす処理の実装です。
基本的にはプレイヤーを動かすときに利用した `Transform.Translate` で同じように実装できるので詳細は省きます。

障害物がプレイヤーと異なる点として、障害物の場合はゲームが進行するのにあわせてゲーム画面上から消えるという点があります。

具体的には障害物がゲーム画面の外に出るというパターンが考えられます。
障害物がゲーム画面の外に出た後そのままにしておくこともできますが、内部的にオブジェクトとして存在したままだと、無駄にシステムリソースを消費することになります。
そのため、障害物には画面上から消えた後にオブジェクト自体を削除する処理を追加します。

### オブジェクトの削除

`Object.Destroy` を利用してオブジェクトを削除できます。
オブジェクトに紐付けているスクリプト内で、次のように削除対象のオブジェクトを引数にして利用します。

```C#
Destroy (this.gameObject);
```

画面上から消えた後にオブジェクトを削除する場合は、オブジェクトの位置情報をもとに `if` 文と組み合わせます。
オブジェクトの位置情報は `Transform.position` で取得できます。オブジェクトの位置がゲーム画面の左側外に出ていった場合にオブジェクトを削除する処理です。

```C#
void Update () {
    if (transform.position.x < -5.0f) {
        Destroy (this.gameObject);
    }
}
```

- 公式ドキュメント
    - https://docs.unity3d.com/jp/current/ScriptReference/Transform-position.html

## 衝突判定をする

`Collider.OnCollisionEnter` のような組み込みのメソッドもあるようですが、オブジェクト同士の位置から衝突判定することもできます。

## 障害物を生成する

障害物は一つではなく、時間経過とともに複数の生成していく必要があります。
オブジェクトを複製して量産することもできますが、その場合、各オブジェクトが独立したプロパティをもってしまうため、あとからプロパティを変更したい場合にオブジェクト毎に変更を適用する必要が出てきてしまいます。

このような場合に利用できる便利な仕組みとして Prefab があります。
簡単に説明すると、Prefab はオブジェクトのテンプレートとして利用できる仕組みで、同じオブジェクトを Prefab で複数生成することができます。
また、Prefab から生成したオブジェクトのプロパティは Prefab 側で一元管理することができます。

Prefab の作成方法については、公式ドキュメントが参考になります。

Prefab を利用してオブジェクトを生成する例は次のとおりです。

```C#
public GameObject obstaclePrefab;

GameObject obstacle = Instantiate (obstaclePrefab);
```

`Object.Instantiate` を利用しています。引数として Prefab (`obstaclePrefab`) を指定することで Prefab からオブジェクトを生成することができます。


- 公式ドキュメント
    - https://docs.unity3d.com/jp/current/Manual/Prefabs.html
    - https://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html

## 参考文献

- [Unity5の教科書](http://www.sbcr.jp/products/4797386790.html)
- https://docs.unity3d.com/ja/current/Manual/script-Button.html
- https://docs.unity3d.com/ja/current/ScriptReference/Transform.Translate.html
- https://docs.unity3d.com/jp/current/ScriptReference/Transform-position.html
- https://docs.unity3d.com/jp/current/Manual/Prefabs.html
- http://qiita.com/shiimaxx/items/c366084058eff95ccd03