昔の懐かしいやつをちょっと真似してみた

# 昔好きだったゲームをちょっと真似して作って行ってみよう。

知ってる人は知っていると思います。
Quintyというゲーム
[quinty wikipedia](https://ja.wikipedia.org/wiki/クインティ)

unityで勉強がてら真似してみようと思います。

クインティを3D化しよう！

**今回の目標**

![quinty.gif](https://qiita-image-store.s3.amazonaws.com/0/98558/5ed73340-184d-8bfa-e33a-80eda639d08b.gif)

- playerを作る
- 3Dで作る。
- playerの位置に応じて床をクルクル回す。


## 壁フィールドを生成する。
3D ObjectのCubeを駆使して力技で配置しただけです。

ただ、床のマスを配置するときのObject名は、
縦何個目、横何個目なのかがわかるようにしておきました。

![スクリーンショット 2016-07-13 22.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/98558/701650c6-2f85-0b2a-bb77-3d40bd3c7b2d.png)

101の場合は、縦１、横１
301の場合は、縦３、横１

## プレイヤーを作る
かなり手抜きですが、精一杯作ってます

![スクリーンショット 2016-07-13 22.15.22.png](https://qiita-image-store.s3.amazonaws.com/0/98558/7d31fc7b-0c98-0c51-bd63-0a4b70ba95fe.png)

playerを作る時は、一番上のレベルにplayerという空のobjectを作成し、
その下に追加するようにしておきます。
⇩こんなイメージ
![スクリーンショット 2016-07-13 22.16.16.png](https://qiita-image-store.s3.amazonaws.com/0/98558/a43a1d13-9e08-c1af-41d1-e05f24fec15f.png)

そうすることで、playerに対して、回転処理などを行った場合
全部のオブジェクトがいい感じに追従して回ってくれます。

### playerにつけるスクリプト
移動スクリプト
walkSpeedなんかは適当に設定しておいてください。
前半は、[.]を押した時に、現在位置と向きから
めくる対象となるオブジェクト位置の計算を行い、
対象オブジェクトに床の回転指示を与える処理です。

後半は、方向に応じて、向きを変えて、その方向に等速で進む処理です。

```js:playerControl.js

function Update () {

	// パネルめくり
	if (Input.GetKeyUp(".")) {
	    // 向きに応じて、めくりパネルを選択
		if( transform.localRotation == Quaternion.Euler(0, 180, 0)){
		    // 縦方向は　四捨五入で整数　１桁目
		    // 横方向は　少数以下切り捨て　で対象オブジェクトになる。　３桁目
		    var x = Mathf.RoundToInt(transform.localPosition.x);
		    var z = Mathf.FloorToInt(transform.localPosition.z);
		    var dic = "Left";
		}
		else if( transform.localRotation == Quaternion.Euler(0, 90, 0)){
		    z = Mathf.RoundToInt(transform.localPosition.z);
		    x = Mathf.FloorToInt(transform.localPosition.x)+1;
		    dic = "Down";
		}
		else if( transform.localRotation == Quaternion.Euler(0, 270, 0)){
		    z = Mathf.RoundToInt(transform.localPosition.z);
		    x = Mathf.FloorToInt(transform.localPosition.x);
		    dic = "Up";
		}
		else if( transform.localRotation == Quaternion.Euler(0, 0, 0)){
		    // 右向きの場合
		    // 縦方向は　四捨五入で整数　１桁目
		    // 横方向は　少数以下切り捨て＋１　で対象オブジェクトになる。　３桁目
		    x = Mathf.RoundToInt(transform.localPosition.x);
		    z = Mathf.FloorToInt(transform.localPosition.z)+1;
		    dic = "Right";

		}
		var objeName = x + "0" + z;

		var obj:GameObject = GameObject.Find("Field/"+objeName);
		if(obj){
		  // 各オブジェクトにsendMessage
		  obj.SendMessage(dic);
		}
	}
	   // 方向転換 移動
	else if (Input.GetKey(KeyCode.LeftArrow)) {
		transform.localPosition.z = transform.localPosition.z - walkSpeed;
		transform.localRotation = Quaternion.Euler(0, 180, 0);
	}
	   else if (Input.GetKey(KeyCode.DownArrow)) {
		transform.localPosition.x = transform.localPosition.x + walkSpeed;
		transform.localRotation = Quaternion.Euler(0, 90, 0);
	}
	else if (Input.GetKey(KeyCode.UpArrow)) {
		transform.localPosition.x = transform.localPosition.x - walkSpeed;
		transform.localRotation = Quaternion.Euler(0, 270, 0);
	}
	else if (Input.GetKey(KeyCode.RightArrow)) {
		transform.localPosition.z = transform.localPosition.z + walkSpeed;
		transform.localRotation = Quaternion.Euler(0, 0, 0);
	}

}
```

##　床オブジェクトのスクリプト

Updateの中で、回転メッセージを受信した時にだけ、
一定速度でcubeを回転させます。
if( transform.rotation  == toRot )の処理で、
対象cubeの回転が完了した時の処理を行います。

今回は、回転角度のオーバーフローが心配だったので、
回転が終了したら、回転角度を0に戻しておきました。

後半のfunctionはplayerControlから受信する
メッセージの受け取り口です。


```js:cubeControl.js


function Update () {
    if(LeftOn){
    	var toRot : Quaternion = Quaternion.Euler(-90, 0, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
		if( transform.rotation  == toRot ){
		    LeftOn = false;
		    transform.localRotation = Quaternion.Euler(0, 0, 0);
		}
	}
	if(DownOn){
    	toRot = Quaternion.Euler(0, 0, -90);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
		if( transform.rotation  == toRot ){
		    DownOn = false;
		    transform.localRotation = Quaternion.Euler(0, 0, 0);
		}
	}
	if(UpOn){
    	toRot = Quaternion.Euler(0, 0, 90);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
		if( transform.rotation  == toRot ){
		    UpOn = false;
		    transform.localRotation = Quaternion.Euler(0, 0, 0);
		}
	}
	if(RightOn){
    	toRot = Quaternion.Euler(90, 0, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
		if( transform.rotation  == toRot ){
		    RightOn = false;
		    transform.localRotation = Quaternion.Euler(0, 0, 0);
		}
	}

}

function Left(){
    Debug.Log("Left");
    if(!DownOn && !UpOn && !RightOn){
        LeftOn = true;
    }
}

function Down(){
    Debug.Log("Down");
    if(!LeftOn && !UpOn && !RightOn){
        DownOn = true;
    }
}

function Up(){
    Debug.Log("Up");
    if(!LeftOn && !DownOn && !RightOn){
        UpOn = true;
    }
}

function Right(){
    Debug.Log("Right");
    if(!LeftOn && !DownOn && !UpOn){
        RightOn = true;
    }
}

```


今日はここまで。


### 予定

- 敵オブジェクト配置
- 敵オブジェクトをplayerを追いかけるようにする。
- 床回転時に飛んでくようにする
- 壁にぶつかったら消滅
- playerと敵の当たり判定