【Unity3D】オリジナルゲーム「逆回転」

# はじめに
こんにちは。
今回はUnityで作ったゲームに関する記事です。
私はあまり、3Dゲームは作らないのですが、この「逆回転」というゲームは回転することに重点を置いた3Dゲームになります。


完成するとこんな感じに動きます！
![逆回転.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/31384a1f-5f4c-703e-1469-ca595fe2d4e3.gif)


15個のCubeが回転しているのですが、ランダムで1つだけ他とは異なる回転をしているCubeがあります。
そのCubeをクリックで選択していき、正解すると得点が1上がり、不正解だと得点が1下がるようになっています。
5点取得するとゲーム終了です。
左下にタイマーがあるのですが、なるべく早く5点取得し、時間で競うゲームとなっています。


# 環境

- Windows 10 home
- Unity 2018.2.15f1




# 「逆回転」の制作

一からすべて解説するわけではないので、あくまでも一例として参考にしてみてください。

## 1.Hierarchy

<img width="202" alt="素材1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/6ef06044-6b31-43d1-efb0-d7d847e8a88d.png">


まず、完成版のHierarchyは上図のような状態になっています。

## 2.Cubeのprefab化

<img width="273" alt="素材2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/3ad22037-d653-ef3a-0d03-b48a277c1cdd.png">

Cubeを１つ作ったら、プレハブ化します。
プレハブ化したCube1にAdd ComponentでEvent Triggerを追加すると、Inspectorは上図のようになるはずです。

そしてこれを15個作っている感じです。
先ほどのEvent TriggerにはPointer Clickを追加して、後ほど説明する、処理が書かれているスクリプトがついているGameControllerというオブジェクトを選び、各それぞれ、対応するメソッドを選択すれば大丈夫です。

このEvent Triggerのクリックについてですが、うまくいかない場合は、こちらを参考にしてみてください。
→[【Unity】マウスクリックで3Dオブジェクトを消すまで苦労した話](https://qiita.com/michimichix521/items/75997373cebf9c113847)


## 3.GameControlleroオブジェクト

空のオブジェクトを作り、GameController.csというスクリプトを追加します。


<img width="275" alt="素材3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/3f26b927-8955-6297-6435-63b675f76e01.png">

GameControllerオブジェクトのInspectorを上図のようになっています。
スクリプト内でpublic変数で宣言してあげたものの、対応する各それぞれをここに突っ込んであげてる感じですね。

スクリプトの内容は以下の通りです。

```GameController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameController : MonoBehaviour{

	public GameObject[] cube;
	public Text scoreText;
	public Text timeText;
	public Text gamaClearText;
	public Button resetButton;

	private int rdnum;
	private int score=0;
	private float time;
	private bool gameflag;

	// Use this for initialization
	void Start () {
		gamaClearText.gameObject.SetActive (false);
		resetButton.gameObject.SetActive (false);

		rdnum = Random.Range (0, cube.Length);
		scoreText.text = "得 点 : ";
		gameflag = true;
	}

	
	// Update is called once per frame
	void Update () {

		if(gameflag){
			for(int i=0;i<cube.Length;i++){
				if (i != rdnum) {
					cube [i].gameObject.transform.Rotate (3, 0, 3);
				} else {
					cube [i].gameObject.transform.Rotate (-3, 0, -3);
				}
			}

			time += Time.deltaTime;
			timeText.text = time.ToString("f2");
			scoreText.text = "得 点 : " + score;

			if(score == 5){
				gameflag = false;
				gamaClearText.gameObject.SetActive (true);
				resetButton.gameObject.SetActive (true);
			}
		}
	}

	private void CorrectAnswer(){
		Debug.Log ("正解！！");
		rdnum = Random.Range (0, cube.Length);
		score++;
	}

	private void WrongAnswer(){
		Debug.Log ("残念！！");
		score--;
	}

	public void ResetButtonClick(){
		SceneManager.LoadScene ("main");
	}

	public void OnClickCube1(){
		if (rdnum == 0) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube2(){
		if (rdnum == 1) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube3(){
		if (rdnum == 2) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube4(){
		if (rdnum == 3) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube5(){
		if (rdnum == 4) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube6(){
		if (rdnum == 5) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube7(){
		if (rdnum == 6) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube8(){
		if (rdnum == 7) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube9(){
		if (rdnum == 8) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube10(){
		if (rdnum == 9) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube11(){
		if (rdnum == 10) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube12(){
		if (rdnum == 11) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube13(){
		if (rdnum == 12) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube14(){
		if (rdnum == 13) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

	public void OnClickCube15(){
		if (rdnum == 14) {
			CorrectAnswer ();
		} else {
			WrongAnswer ();
		}
	}

}
```



## 4.Canvas

<img width="486" alt="素材4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/d2bf24ea-bb9a-d892-e659-8e135fbfcd07.png">


UIに関しては、上図のように配置します。



## 5.その他、注意

シーン切り替え時にシーンが暗くなる問題で、その対処法としては、
Window → Rendering → Lighting Settingsから、Auto Generateのチェックを外し、Generate Lightingをクリックすれば、この問題は解決できるはずです。




# おわりに

このゲームのアルゴリズムに関しては、全く難しくないので、興味があればぜひ作ってみてください。
ここまで読んでいただき、ありがとうございました。