###参考動画「Object Pooling」
http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/object-pooling
###参考サイト「ゲームは初心者にやさしく/必見!Unity初心者が学ぶ「未来事象の正しい文法」 」 http://gamesonytablet.blogspot.jp/2012/12/unity.html
using UnityEngine; | |
using System.Collections; | |
/// <summary> | |
/// オブジェクトのクラス | |
/// </summary> | |
public class BaseObject : MonoBehaviour { | |
/// <summary> | |
/// privateな変数をインスペクターから設定できるようにする | |
/// </summary> | |
[SerializeField] | |
/// <summary> | |
/// 生存時間 | |
/// </summary> | |
private float activeTime = 2.0f; | |
/// <summary> | |
/// オブジェクトが有効化されたときに呼び出される。 | |
/// </summary> | |
void OnEnable(){ | |
// 関数名を遅延秒数後に実行する | |
// Invoke("関数名",遅延秒数) | |
Invoke("NonActive", activeTime); | |
} | |
/// <summary> | |
/// 無効化する | |
/// </summary> | |
void NonActive(){ | |
gameObject.SetActive(false); | |
} | |
/// <summary> | |
/// オブジェクトが無効化されたときに呼び出される。 | |
/// </summary> | |
void OnDisable(){ | |
// キャンセル | |
CancelInvoke(); | |
} | |
} |
using UnityEngine; | |
using System.Collections; | |
using System.Collections.Generic; | |
/// <summary> | |
/// returnされたActiveでないオブジェクトを使い回すマネージャー | |
/// </summary> | |
public class ObjectActiveManager : MonoBehaviour { | |
/// <summary> | |
/// 生成する間隔 | |
/// </summary> | |
private float createInterval = 2.0f; | |
/// <summary> | |
/// 初期化 | |
/// </summary> | |
void Start(){ | |
// 関数名を遅延秒数後に実行する | |
// InvokeRepeating("関数名",初回呼出までの遅延秒数,次回呼出までの遅延秒数) | |
InvokeRepeating("Create", createInterval, createInterval); | |
} | |
/// <summary> | |
/// 使い回わせるオブジェクトがあれば使い回す処理 | |
/// </summary> | |
void Create(){ | |
// 使い回せるobjectを代入 | |
GameObject activeObject = ObjectPoolManager.current.GetPooledObject(); | |
// 使い回せないならreturn | |
if(activeObject == null) return; | |
// 使い回す | |
activeObject.transform.position = transform.position; | |
activeObject.transform.rotation = transform.rotation; | |
activeObject.SetActive(true); | |
} | |
} |
using UnityEngine; | |
using System.Collections; | |
using System.Collections.Generic; | |
/// <summary> | |
/// オブジェクトプールを作り、Activeでないオブジェクトをreturnするマネージャー | |
/// </summary> | |
public class ObjectPoolManager : MonoBehaviour { | |
/// <summary> | |
/// スクリプトコンポーネント | |
/// </summary> | |
public static ObjectPoolManager current; | |
/// <summary> | |
/// privateな変数をインスペクターから設定できるようにする | |
/// </summary> | |
[SerializeField] | |
/// <summary> | |
/// プレハブ | |
/// </summary> | |
private GameObject prefab; | |
/// <summary> | |
/// 最大で貯めれる値 | |
/// </summary> | |
[SerializeField] | |
private int maxPooledValue = 10; | |
/// <summary> | |
/// List | |
/// </summary> | |
List<GameObject> pooledObjects; | |
/// <summary> | |
/// シーン中にmaxPooledValueを増やしても対応できるようにするフラグ | |
/// </summary> | |
private bool willGrow = true; | |
/// <summary> | |
/// 初期化 | |
/// </summary> | |
void Awake(){ | |
current = this; | |
} | |
/// <summary> | |
/// 初期化 | |
/// </summary> | |
void Start(){ | |
// インスタンス生成 | |
pooledObjects = new List<GameObject>(); | |
// Poolする | |
for(int i = 0; i < maxPooledValue; i++){ | |
// インスタンス生成 | |
GameObject poolObject = Instantiate(prefab, Vector3.zero, Quaternion.identity) as GameObject; | |
// 無効化する | |
poolObject.SetActive(false); | |
// 配列に追加 | |
pooledObjects.Add(poolObject); | |
} | |
} | |
/// <summary> | |
/// ActiveなObjectを返す関数 | |
/// </summary> | |
/// <returns>ActiveなGameObject</returns> | |
public GameObject GetPooledObject(){ | |
// 全てのオブジェクトに対して。 | |
for(int i = 0; i < pooledObjects.Count; i++){ | |
// もしもゲームオブジェクトがシーンで有効でなければ。 | |
if(!pooledObjects[i].activeInHierarchy){ | |
// 使い回わせるobjectをreturnする | |
return pooledObjects[i]; | |
} | |
} | |
// もしもシーン中にmaxPooledValueを増やすならば | |
if(willGrow){ | |
// インスタンス生成 | |
GameObject poolObject = Instantiate(prefab, Vector3.zero, Quaternion.identity) as GameObject; | |
// 配列に追加 | |
pooledObjects.Add(poolObject); | |
// 新しいobjectをreturnする | |
return poolObject; | |
} | |
// 使い回すことが出来ない。 | |
return null; | |
} | |
} |
###参考動画「Object Pooling」
http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/object-pooling
###参考サイト「ゲームは初心者にやさしく/必見!Unity初心者が学ぶ「未来事象の正しい文法」 」 http://gamesonytablet.blogspot.jp/2012/12/unity.html