[備忘録]2D&3Dスマホゲーム入門　part3 開発ステップ

##ゲームの設計
①画面上のOBをすべて書き出す
②OBを動かすためのコントローラースクリプトを決める
③OBを自動生成するためのジェネレータースクリプトを決める
④UIを更新するための監督スクリプトを用意する
⑤スクリプトを作る流れを考える

＜詳細＞
①：ゲームに出てくるオブジェクトを羅列する。
②：①のなかから動くオブジェクトを探す。動くOBにはコントローラースクリプトが必要。
③：ゲームプレイ時に生成されるOBを探す。プレイヤの移動や時間経過によって出現するものがこれに当てはまる。
④：ゲームのユーザーインターフェイスを操作したり進行状況を判断したりするために、ゲーム全体を見渡せるスクリプトが必要。
⑤：②→③→④の順。

```csharp:UnityOfficial
Transform.Rotate
public void Rotate (Vector3 eulerAngles, Space relativeTo= Space.Self);
パラメーター
eulerAngles	適用する回転
relativeTo	回転はオブジェクトに対してローカルか、ワールド

説明

Z 軸で eulerAngles.z 度回転、X 軸で eulerAngles.x 度回転、Y 軸で eulerAngles.y 度回転します (順番は説明した順)

If relativeTo is not specified or set to Space.Self the rotation is applied around the transform's local axes. If relativeTo is set to Space.World the rotation is applied around the world x, y, z axes.

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        // Rotate the object around its local X axis at 1 degree per second
        transform.Rotate(Vector3.right * Time.deltaTime);

        // ...also rotate around the World's Y axis
        transform.Rotate(Vector3.up * Time.deltaTime, Space.World);
    }
}
```
※引数に渡すx,y,zは、それぞれx軸、ｙ軸、ｚ軸を示す。つまり、x軸指定はバイクのハンドルを回すときの方向、ｙ軸は右ねじの法則の親指が上のときに動かす方向、ｚ軸は２Dならば左回転になる。

```:UnityOfficial
Input.GetMouseButton
public static bool GetMouseButton (int button);
説明
マウスボタンが押されているかどうかを返します

ボタンの値は左ボタンは 0、右ボタンは 1、中ボタンは 2 になります

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        if (Input.GetMouseButton(0))
            Debug.Log("Pressed left click.");
        
        if (Input.GetMouseButton(1))
            Debug.Log("Pressed right click.");
        
        if (Input.GetMouseButton(2))
            Debug.Log("Pressed middle click.");
        
    }
}
```
※ちなみにGetMouseButtonUpはクリックを離した瞬間で、GetMouseButtonなら押している間、GetMouseButtonDownはクリックした瞬間にtrueを返す。

あるスピードで回転してるものを少しずつ減算していくだけだと、一定の速さで減速するので不自然にみえてしまう。そのため、フレームごとにスピードに**減衰係数（例えば0.96）**を掛けてみると良い。この場合、線形でなく指数関数的に減速するので、自然に減速しているように見える。

```csharp:ルーレット
public class RouletteController : MonoBehaviour {

    float rotSpeed = 0; //回転速度
    
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        //マウスが押されたら回転速度を設定する
        if (Input.GetMouseButtonDown(0))
        {
            this.rotSpeed = 5;
        }

        //回転速度分ルーレットを回転する
        transform.Rotate(0, 0, this.rotSpeed);

        //ルーレットを減速させる
        this.rotSpeed *= 0.96f;
	}
}
```

OBを指定の位置まで移動させたい場合
transform.Translate(x,y,z)を使用する。引数に指定した値は、その場所に移動するのではなく、**現在地からの移動ベクトルを表す**。

```csharp:サンプル
public class CarSwipe : MonoBehaviour {

    float speed = 0; //車のスピード

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButton(0))
        {
            //マウスがクリックされたら初期速度0.2f
            this.speed = 0.2f;  
        }

        transform.Translate(this.speed, 0, 0); //移動
        this.speed *= 0.98f; //徐々に減速
	}
}
```

**難しいスクリプトでも、最初は簡単な動きから初めて徐々に機能を追加していくこと！**

UIとは、ゲームの状態や進行状況を表示するもの。UnityではuGUIというUI部品のライブラリが提供されているので、簡単に作ることができる。

**UIの作り方**
①UIの部品をシーンビューに配置する。
②UIに書き換える監督スクリプトを作成する。
③監督スクリプトを作り、作成したスクリプトをアタッチする。

Uiを使うときは頭に「using UnityEngine.UI; 」が必要だから忘れないように！

GOの座標は「GO名.transform.position」で取得できる。

ToString関数を使ってある２点間の距離を小数点第２位まで表示できる。数値を文字列に変換する関数。引数には数値を表示するときのフォーマットを指定することができる。

```:ToStringで使う書式指定子
整数型 D[桁数] 整数を表示する場合に使える。指定した桁数に満たない場合は、左側に０が挿入される。　
【例】(456).ToString("D5") →　00456

固定小数点型　F[桁数]　小数を表示する場合の小数点以下の桁数を指定する。
【例】 (12.3456).ToString("F3") →　12.345
```

**自分以外のOBの持つコンポーネントにアクセスする方法**
①Find関数でOBを探し出す。
②GetComponent関数でOBのもつコンポーネントを取得する。
③コンポーネントの持つデータにアクセスする。


効果音再生
Obにコンポーネントを追加してクリップに再生したい音源をアタッチ。
スクリプトに

```csharp
 //効果音再生
            GetComponent<AudioSource>().Play();
```
Play()関数を呼び出して完成。