Shoot

[作成手順]

床の作成

1.CubeからFloorを作成する。
2.Floorというタグを作成し付与する。
3.transformは下図

カメラの設定

4.transformを下図のように設定

弾丸の作成

5.SphereからBulletを作成する。
6.transformは下図(Floorに埋もれて見えないが気にしなくて良い)

7.表面材質を赤に設定する。
8.Rigidbodyを付与する。すり抜けが発生しないように下図のようにCollision DetectionをContinuous Dynamicに設定する。

9.Bulletというタグを作成し付与する。
10.BulletController.csの作成。以下のようにスクリプトを作成する。画面から見えなくなった時にデストロイする処理を入れている。作成できたらヒエラルキーのBulletに付与する

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

public class BulletController : MonoBehaviour {

	void OnBecameInvisible(){
		Destroy (gameObject);
	}
}

11.プレファブ化する。(ヒエラルキーからは削除する)

Shooterの作成

11.今回はカメラにスクリプト付与する。Shooter.csを以下のように作成しカメラにアタッチする。

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

public class Shooter : MonoBehaviour {
	public GameObject prefab;

	void Update () {
		if (Input.GetMouseButtonDown (0)) {
			//引数一つでInstantiate
			GameObject obj = Instantiate (prefab);
			//親要素設定(今回はカメラ)
			obj.transform.parent = transform;
			//親要素からのオフセットは0
			obj.transform.localPosition = Vector3.zero;
			//メインカメラからマウスクリックした地点にrayを飛ばす
			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			//rayの方向を長さ1にして dirに代入
			Vector3 dir = ray.direction.normalized;
			//生成したObjのrigidbodyを取得し、速度をdir方向に与える
			obj.GetComponent<Rigidbody> ().velocity = dir * 100.0f;
		}
		
	}
}

12.Shooterスクリプトをカメラにアタッチしたら、インスペクターからBulletプレファブを登録する。

13.実行してマウスをクリックしてみよう。クリックした場所に弾丸が飛んでいけば成功だ。

GameManagerの作成

14.GUI関連やscoreなどを一元管理できるようにCreateEmptyからGameManagerを作成しGameManager.csスクリプトを以下のように作成する。

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

public class GameManager : MonoBehaviour {
	public GUIStyle scoreStyle;
	public GUIStyle msgStyle;
	private int score = 0;
	private string msg="";

	void Update(){
		if (msg == "GameOver") {
			//動きを止める
			Time.timeScale = 0f;
		}
	}

	void OnGUI(){
		GUI.Label (new Rect (5, 5, 10, 10), score.ToString(), scoreStyle);
		GUI.Label (new Rect (Screen.width/2-150, Screen.height/2-25, 300, 50), msg, msgStyle);
	}
	public int GetScore(){
		return score;
	}
	public void SetScore(int score){
		this.score = score;
	}
	public string GetMsg(){
		return msg;
	}
	public void SetMsg(string msg){
		this.msg = msg;
	}
}

落下してくるCubeの作成

15.Cubeを作成する。トランスフォームは下図。(Floorに埋もれるが考慮しなくてよい)

16.Rigidbodyを付与し、Collision DetectionをContinuous Dynamicに設定する。
17.青の素材を付与する。

18.CubeController.csを下図のように作成し、アタッチする。プレファブには直接GameManagerの参照を渡せないので修飾子はprivateとし、setterを準備しておく。

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

public class CubeController : MonoBehaviour {
	private GameManager gm;

	void OnCollisionEnter(Collision coll){
		if (coll.gameObject.tag == "Bullet") {
			gm.SetScore (gm.GetScore () + 1);
			Destroy (gameObject, 0.1f);

		}
		if (coll.gameObject.tag == "Floor") {
			gm.SetMsg ("GameOver");

		}

	}
	public void SetGameMananger(GameManager gm){
		this.gm = gm;
	}

}

19.プレファブ化する。

CubeGeneratorの作成

20.CreateEmptyからCubeGeneratorを作成。
21.CubeGeneratorにCubeGenerator.csスクリプトを下図のように作成し付与する。

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

public class CubeGenerator : MonoBehaviour {
	public GameObject prefab;
	public GameManager gm;

	void Start () {
		StartCoroutine (Create ());
	}
	//コルーチンで生成を行う
	IEnumerator Create(){
		//生成間隔の初期値
		float delta = 1.5f;
		while (true) {
			GameObject obj=Instantiate (
				prefab,
				new Vector3(Random.Range(-12.0f,12.0f),Random.Range(8.0f,12.0f),Random.Range(-3.0f,3.0f)),
				Quaternion.identity
			
			);
			//GameMangerをセットする。
			obj.GetComponent<CubeController> ().SetGameMananger(gm);
			//生成間隔時間停止
			yield return new WaitForSeconds (delta);
			//徐々に生成間隔を早める
			if (delta > 0.5f) {
				delta -= 0.05f;
			}
		}
	}
}

22.インスペクターからCubeプレファブとヒエラルキーにあるGameMangerオブジェクトを登録する。

実行

23.実行してみよう。最初の動画のように遊べれば成功だ。

[完成版]
以下から完成版をダウンロードできる。(Unity5.5.4)