Unityの空のゲームオブジェクトはなぜ必要なのか考えた

Unityの2Dシューティングゲームで岩のオブジェクトを生成するためのスクリプトをに空のゲームオブジェクトにアタッチするという作業が発生した。ここでなぜ空のオブジェクトを作成する必要があったのかわからなかったので少しまとめることにした。
shooting game unity

スポンサーリンク

岩を生成するためのスクリプト

GenRockというメソッドを定義してそれをStart()で呼び出している。ゲームオブジェクトとして岩(RockPrefab)を定義している。あとでPrefabとして使うためだ

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

public class RockGeneratorScript : MonoBehaviour {
	public GameObject RockPrefab;

	// Use this for initialization
	void Start () {
		//nvokeRepeating関数は第一引数の関数を第二引数の秒数ごとに実行してくれる結構便利な関数です。
		InvokeRepeating("GenRock", 1, 1);
	}

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

	}

	void GenRock(){
		Instantiate(RockPrefab, new Vector3(-2.5f + 5 * Random.value, 6, 0), Quaternion.identity);
	}
}
スポンサーリンク

自機のスクリプト

自機のスクリプトは自分が撃つ弾(BulletPrefab)を定義していて、横に移動するための構文と、スペースキーをおしたときに弾を撃てるような構文が書かれている

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

public class RocketScript : MonoBehaviour {
	public GameObject BulletPrefab;

	// Use this for initialization
	void Start () {
	}

	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.LeftArrow)){
			transform.Translate(-0.1f, 0, 0);
		}
		if(Input.GetKey(KeyCode.RightArrow)){
			transform.Translate(0.1f, 0, 0);
		}
		if(Input.GetKey(KeyCode.Space)){
			Instantiate(BulletPrefab, transform.position, Quaternion.identity);
		}
	}
}

なぜ空のゲームオブジェクトが必要なのか

参考にしているサイトで岩のスクリプトは空のゲームオブジェクトにアタッチすると書かれていて、なぜ空のゲームオブジェクトにアタッチするのかいまいち理解できなかった。そのため自機のスクリプトに岩のスクリプトも書いて、自機オブジェクトにアタッチできるようにしてみた。

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

public class RocketScript : MonoBehaviour {
	public GameObject BulletPrefab;
	public GameObject RockPrefab;

	void GenRock(){
		Instantiate(RockPrefab, new Vector3(-2.5f + 5 * Random.value, 6, 0), Quaternion.identity);
	}

	// Use this for initialization
	void Start () {
		InvokeRepeating("GenRock", 1, 1);
	}

	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.LeftArrow)){
			transform.Translate(-0.1f, 0, 0);
		}
		if(Input.GetKey(KeyCode.RightArrow)){
			transform.Translate(0.1f, 0, 0);
		}
		if(Input.GetKey(KeyCode.Space)){
			Instantiate(BulletPrefab, transform.position, Quaternion.identity);
		}
	}
}

コードが完成したので自機オブジェクトに岩本体をアタッチします。
unity attach 岩

デバッグしてみると普通に動いた
unity game debug

結果としてゲームは動いたけど空のオブジェクトは必要

やっていて気付いたが岩のスクリプトと自機のスクリプトを混ぜてしまうと、別々の役割をもったコードが混ざった状態になっていて非常に都合が悪い。たぶんあとあと困ることになるだろうと思われる。当たり前だったかもしれないけど、やはりコードはわけたほうがよい。そのために岩のスクリプトは別のスクリプトにして、それを自機にアタッチするのではなく空のゲームオブジェクトにアタッチするようにする。なので適切なオブジェクトが見つからなかった場合は新たに空のゲームオブジェクトを作成する必要がある。

空のゲームオブジェクトはUnityのhierarkhyからcreateを選んで「crate empty」を選択すると作成することができる

まとめ

特定の機能や役割をもったスクリプトを作成した場合はオブジェクトをわけるために空のゲームオブジェクトを作成する必要がでてくる場合がある。

コメント

タイトルとURLをコピーしました