Unity5の教科書　Chapter4を学習してみた!

#**初めに**
[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html "Unity5の教科書")　Chapter4を学習して見ました!

ゲーム作成の基礎が学べる[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html "Unity5の教科書")はとてもおすすめです!!!
回し者ではありません....

#**ゲームの企画を作る**

どういうゲームを作るか考える部分。
Chapter4では「車寸止めゲーム」を作りました。

- スワイプの距離で車の速度を決める。
- 車は徐々に減速する。
- 車を走らせて旗までの距離を表示する。
- 旗を超えるとゲームオーバーと表示される。

#**ゲームの部品を考えてみる**

**画面上で使用するオブジェクトの洗い出しする。**
  地面、車、旗、UI<br><br>
**動くオブジェクトを探す。**
  車<br>
**UIを更新する為の監督スクリプトを用意する。**
  監督スクリプトを用意する

#**スクリプトを作成する流れを考える**
基本の流れは「コントローラスクリプト」　→　「ジェネレータスクリプト」　→ 「監督スクリプト」

今回はジェネレータスクリプトがない為、「コントローラスクリプト」　→　「監督スクリプト」の順に作成していきます。

- コントローラスクリプト<br><br>
  車を動かす処理、音を鳴らす処理等<br><br>
- 監督スクリプト<br><br>
  車と旗の距離をUIに表示することや、ゲームオーバー判定をする処理

#**コントローラスクリプト**

車を動かすスクリプトを作成していきます。


**動作の仕様は下記の様になります。**

- スワイプで車を動かす方法を実装する。<br>
  車の速度は短いスワイプ < 長いスワイプの様にする。
- 車は徐々に減速する。
- 車が動くときに発車音を鳴らす。

**スワイプで車を動かす方法を実装する。**


短いスワイプと長いスワイプの判別方法

クリックをした座標とクリックを離した時の座標の差分を計算する事で、スワイプの長さを求めます。

**[マウスクリックの検出]**
Input.GetMouseButtonDown(0)　左クリックを押すとbool型の値でtrueを取得できます。 
Input.GetMouseButtonUp(0)　　左クリック離すとbool型の値でtrueを取得できます。


**[座標の取得とスワイプの長さの計算]**
Input.mousePosition関数を使用する。

```
if(Input.GetMouseButtonDown(0)){
   this.startPos = Input.mousePosition;
   } else if(Input.GetMouseButtonUp(0)) {
   Vector2 endPos = Input.mousePosition;
   float swipeLength = (endPos.x - this.startPos.x);
```

上記のスクリプトでは、クリック開始座標を「startPos」、クリックを離した時の座標を「endPos」に代入します。

float swipeLength = (endPos.x - this.startPos.x);の行でクリック開始座標とクリックを離した時の座標を計算してswipeLengthに代入しています。

**[スワイプの長さを初速度に設定をする]**

```
this.speed = swipeLength / 500.0f;
```
[500.0]の数値を変える事で初速度を変えることができます。

**[車を動かす処理と減速処理]**

```
transform.Translate(this.speed, 0, 0);
this.speed *= 0.98f;
```
Transform.Tanslate( X値 , Y値 , Z値 )

X軸のthis.speed変数の値を見て車が移動する。
this.speed変数に0.98fをかけて徐々に速度を減速させていく。

**[車が動くときに発車音を鳴らす]**
音を鳴らしたいオブジェクトにAudioSourceコンポーネントをアタッチする。

対象オブジェクトのInspector内のAdd Componentクリック　→　AudioSource選択

Inspector内にAudioSourceが追加され、AudioSource内のAudioClipに音源を設定する。

**[Unityで使える音源形式]**

| 形式| 拡張子|
|:-----------|------------:|:------------:|
| MPEG Layer3     |.mp3|
| Ogg Vorbis | .ogg|
| WAV    | .wav|
| AIFF    | .aiff/.aif|

**[音を鳴らすスクリプト]**

```
 GetComponent<AudioSource>().Play();
```


#**uGUIでUI表示**
UIはゲームの状態や進行状況を表示するものになります。
UnityではuGUIというUI部品のライブラリが提供されています。

```
using UnityEngine.UI;
```
スクリプト内で上記を記述してライブラリのインポートを行う。

**[UIテキストの追加と名前変更]**
Create → UI → Text → 名前変更(Distance)


#**監督スクリプト**
車と旗の距離をUIに表示することや、ゲームオーバー判定をする処理の実装

**「車」と「旗」と「UI」のオブジェクトを監督スクリプトから扱えるようにする。**

```
public class GameDirector : MonoBehaviour
{
    GameObject car;
    GameObject flag;
    GameObject distance;
}
```
GameObject型の変数を用意します。
この段階では箱を作っただけの状態になります。

**[Find関数を利用して変数に値を入れる]**

```
void Start()
{
     this.car = GameObject.Find("car");
     this.flag = GameObject.Find("flag");
     this.distance = GameObject.Find("Distance");
}
```
Find関数はオブジェクト名を引数に取り、引数名と同じ名前の物がゲームシーンにあればそのオブジェクトを返してくれる関数です。

**[ゲームオブジェクトより値の取得とUI表示処理]**

```
void Update(){
    float length = this.flag.transform.position.x -
                   this.car.transform.position.x;
    if (length >= 0){
       this.distance.GetComponent<Text>().text =
       "ゴールまで" + length.ToString("F2") + "m";
    } else {
       this.distance.GetComponent<Text>().text = "ゲームオーバ";
}
```
- float型 length<br>ゲームオブジェクト名.transform.positionでゲームオブジェクトの座標取得。
carとflagの位置を取得して、計算して距離を算出する。<br><br>

- if
lengthの値が0以上の場合は、距離を「ゴールまで〇〇m」で表示する。
ToSrtingsは数値を文字列に変換をする関数。
("F2")は小数点の桁数を指定、この場合小数点は2桁まで表示される。
lengthの値が0以下の場合は、ゲームオーバと表示される。<br>
**[オブジェクトへのアタッチ]**
ヒエラルキービューでオブジェクトを作成と名前変更。
Create → Create Empty → 名前変更(GameDirector)

監督スクリプトをGameDirectorにドラッグ&ドロップする。