プロジェクト作成

1.新規プロジェクトを名前をJoytas20で作成する(3Dモード)

ステージの作成

2.Create->3DObject->Cubeを作成しFloorとリネーム後インスペクターを以下のように調整する。

3.Create->3DObject->Cubeを作成しLeftWallとリネーム後インスペクターを以下のように調整する。

4.LeftWallを複製しRightWallを作成。position,xを-10から10に変更する。
5.Create->3DObject->Cubeを作成しBackWallとリネーム後インスペクターを以下のように調整する。

Pusherの作成

6.Create->3DObject->Cubeを作成しPusherとリネーム後インスペクターを以下のように調整する。

7.ProjectのCreateからmaterialを選択し、Pusherとリネーム。色を設定する(B7DC54FF)。

8.materialができたらD&DでヒエラルキーにあるPusherにアタッチする。
9.ヒエラルキーでPusherを選択後インスペクター下部にあるaddComponentボタンからPhysics->Rigidbodyを付与する。
10.RigidbodyコンポーネントのisKinematicのチェックをオンにする。このチェックを入れることでスクリプトによってのみ動き、外部からの物理的影響をうけなくなる。(与えることはできる)
11.プロジェクトからC#スクリプトを選択し、Pusherにリネーム。以下のように記述する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pusher : MonoBehaviour {
	public float speed;
	public float moveLength;
	Vector3 pos;

	void Start () {
		pos = transform.position;
	}

	void Update () {
		float z = Mathf.Sin (Time.time * speed);
		pos.z = pos.z+z*moveLength*Time.deltaTime;
		transform.position = pos;
	}
}

12.スクリプトをPusherにアタッチし、インスペクターからspeedを1.5,moveLengthを2に設定する。

カメラの設定

13.mainCameraを選択し、インスペクターから以下のように調整する。
Field of view を画面の横幅いっぱいになるように調整すること。

14.実行してみよう。Pusherがスムーズに前後していれば成功だ。

照明の調整

15.影が気になるのでDirectinalRightを以下のように調整しよう。

Cubeの作成

16.Create->3DObject->Cubeを作成し、インスペクターを以下のように調整し、適当にマテリアル(表面材質)を付与する。作例では色が(547FFDFF)Materialを作成し付与した。

5.CubeにAddComponentからRigidbodyを付与する。実行し、Pusherに押されることを確認する。
17.スクリプトから扱いやすいようにタグを設定しよう。インスペクターのタグのプルダウンを選択しAdd Tagを選択する。
18.+を押し以下のようにCubeというタグを作成する。

19.ヒエラルキーでCubeを選択し、先ほど作成したCubeタグを付与する。

20.ヒエラルキーにあるCubeをD&DでAssetsに移動する。こうすることによってプレファブができる。
21.ヒエラルキーにあるCubeは不要なので削除してしまおう。

キューブジェネレーターの作成

22.Create->Create EmptyからEmptyオブジェクトを作成しCubeGeneratorとリネーム後、インスペクターのトランスフォームを以下のように設定する。

22.新規C#スクリプトをCubeGeneratorという名前で作成し、以下のように記述する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeGenerator : MonoBehaviour {
	public GameObject prefab;
	public float baseWidth;
	Vector2 startPos;


	void Start () {
		GenerateCube (500);

	}
	public void GenerateCube(int num){
		StartCoroutine (Generate (num));
	}

	IEnumerator Generate(int num){
		for (int i = 0; i < num; i++) {
			Instantiate (
				prefab,
				new Vector3(Random.Range(-8.0f,8.0f),Random.Range(10.0f,20.0f),Random.Range(0.0f,5.0f)),
				Quaternion.Euler(new Vector3(Random.Range(-5.0f,5.0f),Random.Range(-5.0f,5.0f),Random.Range(-5.0f,5.0f)))
			);
			yield return new WaitForSeconds (0.03f);

		}
	}
	void Update(){
		if (Input.GetMouseButtonDown (0)) {
			startPos = Input.mousePosition;
		}else if(Input.GetMouseButtonUp(0)){
			Vector2 endPos = Input.mousePosition;
			Vector2 dir = endPos - startPos;
			float spinPower = endPos.x - startPos.x;
			float power = Mathf.Clamp(dir.magnitude,600.0f,900.0f);
			float x = baseWidth * (Input.mousePosition.x / Screen.width) - (baseWidth/ 2);
			GameObject go = (GameObject)Instantiate (prefab,
				transform.position + new Vector3 (x, 0, 0),
				transform.rotation
			);

			Rigidbody rb = go.GetComponent<Rigidbody> ();
			rb.AddForce (new Vector3 (0, power, 500.0f));
			rb.AddTorque (new Vector3 (0, spinPower, 0));
		}
			


	}
}

23.作成したスクリプトをヒエラルキーにあるCubeGeneratorにD&Dでアタッチする。

24.ヒエラルキーでCubeGeneratorを選択し、インスペクターを調整する。baseWidthは15、プレファブにはAssetsにあるCubeプレファブをDDで登録する。

25.実行してみよう。下図のようにゲーム開始後、キューブが降り注げば成功だ。画面をスワイプすることでキューブを発射できる。距離を長くスワイプすると高く飛ばすことができ、横方向にスワイプすることによってキューブを回転させられる。

Score機能の実装

26.Create->UI->textを選択し、TextオブジェクトをScoreとリネームし、インスペクターから以下のように調整する。

DeathZoneの作成

落下したCubeを削除する処理と点数をアップしていく処理を作成する。
26.Create->3DObject->Cubeを作成しDeathZoneとリネームする。インスペクターから以下のように調整する。ここではisTriggerのチェックを入れることによってその範囲をセンサーとして利用できる。

27.ヒエラルキーからDeathZoneをダブルクリック選択し、シーンを上方から見てみよう。センサーとして働くデスゾーンの範囲がわかる。

28.ProjectのCreateからC#スクリプトを選択し、DeathZoneとリネーム後以下のように記述する。
using UnityEngine.UIの記述を忘れないこと。

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

public class DeathZone : MonoBehaviour {
	public CubeGenerator cg;
	public Text scoreText;
	private int score=0;

	void OnTriggerEnter(Collider col){
		if(col.gameObject.tag=="Cube"){
			scoreText.text = ++score+"";
			Destroy (col.gameObject);
			if(score==30 || score % 100 ==0){
				cg.GenerateCube (100);
			}
		}
	}
}


29.スクリプトをヒエラルキーにあるDeathZoneにDDでアタッチして、インスペクターからオブジェクトを以下のように登録する。

30.実行してみよう。落とすことができるとカウントが増えていき、30個(それ以降は100個ごと)にボーナスキューブが落ちてくることが確認できる。

調整

このままでもいいが少し動きがもっさりしている。上部にあるEditメニューからProjectSetteings->Physicsと進み重力加速度を-15くらいに設定しよう。

シーンの保存

以上まで作成したらMainとしてシーンを保存しておく、

参考

Unityのコルーチンの使い方をまとめてみた