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

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

ついに最終章です！
1章から8章まで学習してみましたが、とても丁寧な説明で自分がレベルアップしていくのが実感できました。
段階的にUnityで必要な知識を習得できるようになっているのも良い点です。

では、最終章で学習したことを振り返っていきます！！

# 3Dの座標上でのオブジェクトの移動

3x3の合計9マスを1マスずつ区切ってオブジェクトを移動させる。

|1|2|3|
|:-:|:-:|:-:|
|4|5|6|
|7|8|9|

1の場所をタップしたら1の場所へオブジェクトが移動
9の場所をタップしたら9の場所へオブジェクトが移動

マスの1辺の長さが3として考えると、タップした座標を以下の様に処理すればオブジェクトの移動が可能。

「-1.5 <= z < -0.5」の時は「z= -1.0」へ移動
「-0.5 <= z < 0.5」の時は「z = 0.0」へ移動
「0.5 <= z < 1.5」の時は「z = 1.0」へ移動

タップした座標の値をを四捨五入させれば、中心座標に値を補正できます。

これをx軸に関しても同じ考え方で実施することで、1マスの真ん中にオブジェクトを配置する事が可能です。

**タップした位置の取得とオブジェクトへの代入**

・カメラ座標からゲームの奥に方向に向かって進む光線(太陽)を求める。
ScreenPointToRayメソッドを使用して光線(太陽)を求めます。

```
if(Input.GetMouseButtonDown(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosituin);
```

[Unity公式ドキュメント]
[Unity マニュアル　Camera.ScreenPointToRay](https://docs.unity3d.com/ja/540/ScriptReference/Camera.ScreenPointToRay.html)


・コライダ判定使って光線(太陽)と地面の衝突を検知させる。
Raycastメソッドを使って光線(太陽)が地面オブジェクトと当たったか調べます。

```
RaycastHit hit;
if(Physics.Raycast(ray, out hit, Mathf.Infinity))
```

[Unity公式ドキュメント]
[Unity マニュアル　Physics.Raycast](https://docs.unity3d.com/jp/540/ScriptReference/Physics.Raycast.html)


・衝突時の座標を四捨五入する。
hit.pointに光線(太陽)と地面が衝突した座標がはいる。
RoundToInt関数で四捨五入して、中心座標へ補正。

```
　float x = Mathf.RoundToInt(hit.point.x);
　float z = Mathf.RoundToInt(hit.point.z);
```

[Unity公式ドキュメント]
[Unity マニュアル　Random.Range](https://docs.unity3d.com/jp/540/ScriptReference/Random.Range.html)

・オブジェクトの座標へ代入

```
　transform.position = new Vector3(x, 0.0f, z)
```

#　衝突判定時のオブジェクト判別
オブジェクトに個別のtagを設定する。

fish  tag=fish
bone  tag=bone

上記の場合、fishとboneと言うtagをそれぞれ作成して、fishオブジェクトとboneオブジェクトにそれぞれ設定をする。

・条件分岐のスクリプト

```
void OnTriggerEnter(Collider other) {
   if(other.gameObject,tag == fish) {
       Debug.Log("fish");
   } else {
       Dbug.Log("bone");
}
```

## オブジェクトのランダム生成
fishとboneがランダムで1秒間隔でランダムで落ちてくるスクリプト。

**1秒間隔での処理**
Time.deltaTimeには、最後のフレームからの経過時間[ms]が格納されている。
前回のUpdate()からの経過時間が取得できる。

60fpsでは1秒で60回Update()が実行される。
1秒でdeltaが1以上になり処理が実行される。

```
float span = 1.0f;
float delta = 0; 

void Update() {

this.delta += Time.deltaTime;
if(this.delta > this.span) {
```

**ランダム関数でオブジェクトをランダムに落とす**
1～10の整数をランダムで代入。
diceの値がが2未満の場合fishが落ちる。
3-10の場合boneが落ちる。

```
int dice = Random.Range(1, 11);　
if (dice <= this.ratio) 
```



**diceの数値によって処理の条件を分岐させる**
diceが2未満の場合fish,3-10の場合catが落ちる。

```
if (dice <= this.ratio)。
    {
      item = Instantiate(fishPrefab) as GameObject;
    } else {
       item = Instantiate(catPrefab) as GameObject;
  }
```

**落ちる座標をランダムで指定**

```
float x = Random.Range(-1, 2);
float z = Random.Range(-1, 2);
```

## 得点管理

**変数の宣言**
pointText変数宣言。
point変数宣言。

```
public class GameDirector : MonoBehaviour {

   GameObject pointText;
   int point = 0;

```

**得点振り分け**
魚をゲットした場合は100ポイント、
骨をゲットした場合は現在の点数が半分になる。

```
   public void Getfish(){
        this.point += 100;
    }

    public void Getbone(){
        this.point /= 2;
    }
```

**pointText変数の実態を代入**
Findメソッドで検索をして代入する。

```
	void Start () {
        this.pointText = GameObject.Find("Point");
	}
```

**ポイントの加算減算**
GetComponentnにてTextUIのpointに現在の値を渡す。

```	
	void Update () {
        this.pointText.GetComponent<Text>().text =
            this.point.ToString() + " point";
}
```
[Unity公式ドキュメント]
[Unity マニュアル　GetComponent](https://docs.unity3d.com/ja/540/Manual/ControllingGameObjectsComponents.html)