【ハルシオンブログ】Unityでオブジェクトプールって使ったりしてますか?私は使ってませんが、こういうこと?
今日は10月だというのに、気温が30度もあるとかって話ですね。
週末には20度まで下がるとのことですが・・・・
温度差で風邪ひかないようにしてくださいな。
坂内っす。
オブジェクトプール使ってますか?
私は使ってません。
これどういう時に使うといいんでしょうかね。
数百個のオブジェクトをInstantiateするときとかなんでしょうか。
シューティングゲームの弾みたいな?
敵もいっぱい同じのが出るなら使えそうですよね。
結局オブジェクトをInstantiateするときに、GCが走るので、「多大なオブジェクトをInstantiateやDestroyをすると重くなる」というものの対応でオブジェクトプールがあるんだとは思ってます。
なかなかポケットガールみたいなシミュレーションゲームでは使う機会なさそうなんですよね・・・
ちなみに簡単なオブジェクトプール
[Blog20211011.cs]
例えば、ボタンを押したときにCubeを100個生成する処理がこのようにあった場合、100回GCが走ってしまいます。
(このコードだけだとボタンを押すたびに100個を超えて増えてしまいますが)
オブジェクトプールを使うとこんな感じになります(たぶん
[Blog20211011.cs]
はじめにオブジェクトを作成し、プールしておきます。
実際に使う際には、プールされたオブジェクトを表示するといった形で使用します。
また、消す際にもDestroyをしないで、SetActive(false)で消すことができます。
これによって無駄にGCを発生させないようにするのがオブジェクトプールのようです。
本日はオブジェクトプールについてでした。
週末には20度まで下がるとのことですが・・・・
温度差で風邪ひかないようにしてくださいな。
坂内っす。
オブジェクトプール使ってますか?
私は使ってません。
これどういう時に使うといいんでしょうかね。
数百個のオブジェクトをInstantiateするときとかなんでしょうか。
シューティングゲームの弾みたいな?
敵もいっぱい同じのが出るなら使えそうですよね。
結局オブジェクトをInstantiateするときに、GCが走るので、「多大なオブジェクトをInstantiateやDestroyをすると重くなる」というものの対応でオブジェクトプールがあるんだとは思ってます。
なかなかポケットガールみたいなシミュレーションゲームでは使う機会なさそうなんですよね・・・
ちなみに簡単なオブジェクトプール
[Blog20211011.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20211011 : MonoBehaviour
{
[SerializeField] GameObject objPref;
[SerializeField] Button btnCreate;
int count = 100;
void Start()
{
btnCreate.onClick.AddListener(OnClickCreate);
}
void OnClickCreate() {
for (int i = 0; i < count; i++) {
Instantiate(objPref, new Vector3(Random.Range(-10f, 10), Random.Range(-10f, 10f), Random.Range(-10f, 10f)), Quaternion.identity);
}
}
}
例えば、ボタンを押したときにCubeを100個生成する処理がこのようにあった場合、100回GCが走ってしまいます。
(このコードだけだとボタンを押すたびに100個を超えて増えてしまいますが)
オブジェクトプールを使うとこんな感じになります(たぶん
[Blog20211011.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20211011 : MonoBehaviour
{
[SerializeField] GameObject objPref;
[SerializeField] Button btnCreate;
GameObject[] cubes;
int count = 100;
private void Awake() {
cubes = new GameObject[count];
for (int i = 0; i < count; i++) {
GameObject obj = Instantiate(objPref, new Vector3(Random.Range(-10f, 10), Random.Range(-10f, 10f), Random.Range(-10f, 10f)), Quaternion.identity);
cubes[i] = obj;
cubes[i].SetActive(false);
}
}
void Start()
{
btnCreate.onClick.AddListener(OnClickCreate);
}
void OnClickCreate() {
foreach (GameObject obj in cubes) {
obj.SetActive(true);
}
}
}
はじめにオブジェクトを作成し、プールしておきます。
実際に使う際には、プールされたオブジェクトを表示するといった形で使用します。
また、消す際にもDestroyをしないで、SetActive(false)で消すことができます。
これによって無駄にGCを発生させないようにするのがオブジェクトプールのようです。
本日はオブジェクトプールについてでした。
Category: 開発日記(Unity)
« 【ハルシオンブログ】独自の#ifディレクティブを使用したいとき | 【ハルシオンブログ】スプラッシュスクリーンより前に何か処理したいとき »
コメント
| h o m e |