Skip to content

Instantly share code, notes, and snippets.

@Buravo46 Buravo46/BaseObject.cs
Last active Aug 29, 2015

Embed
What would you like to do?
【Unity】オブジェクトをプールして使い回す方法V2。returnされたnonActiveなオブジェクトを使い回すスクリプトと、オブジェクトプールを作りnonActiveなオブジェクトをreturnするスクリプト。
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.