ゲームオブジェクトの動的生成と削除
動的作成
ゲームオブジェクトの動的確保はInstantiateメソッドを使用しますが
この関数を使用するにはスクリプト上で該当するゲームオブジェクトを指定する必要があります。
スクリプト中でのゲームオブジェクトの取得方法
スクリプト内でゲームオブジェクトを取得する方法は
「GameObjectのFind関数を使用する」「Assetsフォルダから読み込む」
「ゲームオブジェクトをメンバ変数とし、Unity上で設定する」等があります。
今回は「ゲームオブジェクトをメンバ変数とし、Unity上で設定する」やり方の
紹介をしたいと思います。
手順
①.ゲームオブジェクトをPrefab化する
Hierarchy上で「Cube」を作成し、「OriCube」とし、
プロジェクトビューのAssetsフォルダにD&Dする
②.動的作成を行うゲームオブジェクトを作成する
空のゲームオブジェクトを作成し、「CubeFactory」とする
③.スクリプトを作成する
C#でスクリプトを作成し、名前を「CubeFactory」とする
④.ゲームオブジェクトのメンバを追加する
CubeFactoryをエディタで開き、GameObject型のメンバ変数を作成する
※public必須
例:
public GameObject m_CubeBase;
⑤.②で作成したオブジェクトにスクリプトを関連付ける
ゲームオブジェクト「CubeFactory」に
スクリプト「CubeFactory」を関連付ける
⑥.メンバ変数にゲームオブジェクトを関連付ける
CubeFactoryオブジェクトのInspectorの「CubeFactory(Script)」の
ゲームオブジェクトのメンバ変数に①で作成したPrefabを関連付ける
上記の手順でゲーム実行時に「CubeFactory」のメンバ変数には「OriCube」が
設定されているので、このメンバを使用してオブジェクトを動的に作成します。
書式
メソッド名:
Instantiate
戻り値:
成功:第一引数で指定したObject
失敗:NULL
引数:
第一引数:
GameObject:
複製したいGameObject
第二引数:
Vector3:
作成時の座標
※デフォルト引数
デフォルトはVector3.Zero
第三引数:
Quaternion:
作成時の角度
※デフォルト引数
デフォルトは Quaternion.identity
内容:
第一引数で指定したGameObjectの複製を作成する
作成時の座標と回転角度の指定ができるが、
デフォルト引数となっているので、必ず設定する必要はない。
具体例
using UnityEngine;
using System.Collections;
public class CubeFactory : MonoBehaviour {
public GameObject m_CubeBase;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.A)) {
Vector3 pos = new Vector3(Random.Range(-5, 5),
Random.Range(-5, 5),
Random.Range(-5, 5));
// m_CubeBase を元にして新しいm_CubeBaseを作成
Instantiate(m_CubeBase, pos, Quaternion.identity);
}
}
}
削除
Hierarchy上にあるオブジェクトは削除メソッドのDestoryを呼び出すまでシーン内に残り続けます。
削除は基本的に削除されるゲームオブジェクトで行います。
※リストなどの動的配列で管理している場合は管理側に削除することを通知する必要があります。
削除関数書式
メソッド名:
Destroy
戻り値:
なし
引数:
第一引数:
GameObject:
削除するオブジェクトのGameObjectデータ
第二引数:
float:
削除を開始する時間
※デフォルト引数で基本は0.0f
内容:
引数に指定したGameObjectを削除する
具体例
using UnityEngine;
using System.Collections;
public class Cube : MonoBehaviour {
private float m_Timer;
// Use this for initialization
void Start () {
m_Timer = 3.0f;
}
// Update is called once per frame
void Update () {
m_Timer -= Time.deltaTime;
if (m_Timer <= 0.0f) {
// 削除
Destroy (gameObject);
}
}
}