Menu
CoddyTech

オブジェクトをプールする理由

CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 37/50。

1分間に毎秒10発の弾を発射する銃は、Instantiateを600回、Destroyを600回呼び出します。各Instantiateは、すべてのコンポーネントを含むプレハブをコピーし、それらのAwake、OnEnable、Startを実行します。各DestroyはOnDisableとOnDestroyを実行し、オブジェクトのメモリをガベージとして残します。C#のガベージコレクターは後でそのメモリを解放します。その処理は、あるフレームでは発生し、別のフレームでは発生しないため、カクつきとして現れます。遅いスマートフォンでは特に顕著です。

プールは、オブジェクトを破棄せずに保持します。使い終わった弾はSetActive(false)で無効化してプールに戻します。次の発射時にはプールから1つ取り出して有効化し、プールが空の場合にのみInstantiateが実行されます。射撃を始めて数秒経つと、発射によって新しいものが作られることはなくなり、ガベージも残りません。再利用時にAwakeとStartは再実行されません。オブジェクトが作られたときに一度だけ実行されるからです。タイマー、体力、速度など、使うたびに初期化が必要なものは、OnEnableか、オブジェクトをプールから取り出すコードでリセットします。

プーリングは、頻繁に作られて破棄されるオブジェクトに効果があります。弾、火花、ダメージ数値、ウェーブ形式のゲームの敵などです。一度だけ登場するボスや、ときどき開くメニューには効果がありません。プールは無効状態のオブジェクトのメモリを常に保持するため、適切な数を維持し、余分なものは解放します。

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityにおけるゲームアーキテクチャのすべてのレッスン