【制作実習】インスタンスのルーツ

Unityでゲームオブジェクトのインスタンス化には、GameObject.Instantiate(GameObject prefab)という方法が用意されている。

ちょっと厄介なのは、このスタティックメソッドのパラメータにプレハブの参照が必要なことだ。

画面構築時にゲームオブジェクトのヒエラルキを動的に決定したい場合がある。

たとえば、マップデータを読み込んでマップ用のオブジェクトを動的にインスタンス化する場合とかね。

以前は、プレハブ用のオブジェクトをヒエラルキ上のどこかに配置して、スクリプトから見つけられるようにしておいて、そいつをもとにインスタンス化していた。

それでも別に問題なかったんだけれども、インスタンス化するためだけにプレハブをヒエラルキ上に配置するのはなんとも気持ち悪い気がしていた。

そこで、今回はプレハブは全てResourcesフォルダにおいて、Resources.Load(path)で動的に読み込むように変えた。

いったん読み込んだプレハブはキャッシュに退避して再利用する。

たとえば、こういうファクトリクラスを用意した。

public static class Factory {

	public static Dictionary<string, GameObject> prefabCache = new Dictionary<string, GameObject>();

	public static GameObject LoadPrefab(string key) {
		if (!prefabCache.ContainsKey(key)) {
			GameObject prefab = Resources.Load("PREFABS/" + key) as GameObject;
			prefabCache[key] = prefab;
		}
		return prefabCache[key];
	}

	public static GameObject newInstance(string key) {
		return (GameObject) GameObject.Instantiate(LoadPrefab(key));
	}
}

これにより、プレハブのためだけのメンバ変数を持たせたり、Find検索したりしなくてすむようになった。

5年前

コメントを残す

メールアドレスが公開されることはありません。