【Unity】UnityとObjectPoolについて~Instantiateを乱用するなかれ~

前つくったゾンビゲーのときにゾンビをゲーム中大量に生成していたときにメンターに言われたことがあります。

 

UnityではInstantiateの処理は重いから処理を意識した場合は避けたほうがいい

 

Instantiateで生成する場合はいろいろ初期化しながら行うからというのが理由らしいです。

つまり同じキャラ(GameObject)を何度もInstantiateで生成して、倒したらDestroyで削除を繰り返すのはよくないということです。

しかし生成は今までInstantiateで行っていたのにどうやって処理を軽くしながら生成をすればいいのってなりますよね、私はそうでした。

 

そこで教わったのがObjectPoolという考え方です。

これはゲームスタート時に大量にオブジェクトをInstantiateで生成しておき、非アクティブ化で格納しておく。生成したいときにアクティブ化させる、消したいときは非アクティブ化させるという手法です。

この手法では重いとされるInstantiateはゲームスタート時のみ行うのであいまあいまでInstanitiateの処理をはさまなくても良くなるわけです。

 

実際のスクリプトなどの作り方は他の方のブログ等を参考にするといいと思います。

私が参考にしたのは

github.com

gametukurikata.com

 

ここらへんを参考にして導入しました。

 

ちなみにこれで出来ます。(たぶん)

public GameObject enemypref;
private int numOfPool = 100;
public List<GameObject> enemyPoolObjects = new List<GameObject>();

 

void Start()

{

GameObject obj;
for (int i = 0; i < numOfPool; i++)
{
obj = GameObject.Instantiate(enemypref);
obj.SetActive(false);
enemyPoolObjects.Add(obj);
}

}

 

私はObjectPoolを敵キャラの生成・死亡で使ったのですが、死亡で非アクティブにしたときにアニメーションとかいろいろ初期状態に戻すのを忘れないようにしましょう、死んだアニメーションの遷移先を作らなかったため、次生成されたとき倒れたままアクティブ化されるという笑っちゃうような現象にみまわれます。

 

あとなんかスクリプトをきれいに貼り付ける方法ないですかね;;