
感想を述べよ
赤ん坊の写真を見せられても「可愛いですね」の言葉以外思いつかない皆さんこんにちは。ほら、他にもっと何か言葉があるだろう的に何枚も写真を見せつけられても「可愛い」以外の感想は思い浮かばないので勘弁してください。また「その赤ちゃんの写真下さい」という言葉をきっかけに周りの人間すべてに写真を送りつけてくる方もいますが「あ、私も欲しいです」という言葉は長いものに巻かれた社交辞令なので真に受けないでください。
デザインパターン
Unity公式からゲーム開発で使用するデザインパターンを学習するためのサンプルプロジェクトが公開されています。
公式サンプルではディレクトリ別に各デザインパターンに対するサンプルプロジェクトが分けられています。
このブログではこのサンプルプロジェクトに対して、これまで2回解説記事を書いています。
今回取り上げるデザインパターンは数あるデザインパターンの中でもゲーム開発で最も利用されるであろう「7 Object Pool」です。
Object Poolパターン
Object Poolパターンは効率的なリソース運用を目指したデザインパターンで、プロジェクト内で生成するオブジェクトの数を制限し、再利用を繰り返すことで無駄なリソースの使用を防ぎパフォーマンスの向上に繋げようというパターンです。
例えばSTGの銃弾やモブの敵キャラなど、ゲーム内で大量に繰り返し登場するオブジェクトは必要な時に逐一、生成→破棄するよりも事前に大量に生成→保持しておいて必要なときにアクティブ/非アクティブを切り替えて利用した方がCPU負荷が掛からず、処理を最適化(高速化)することができます。もちろん保持しておく分のメモリは消費しますが。
Object Poolパターンの典型的な構成は、オブジェトの大量生成&保持を行うクラス(ObjectPool)と、オブジェクトが使用中か未使用なのか判断するための制御用クラス(Object)、そしてそれを利用するクライアントのクラス(Client)に分かれます。

ClientはObjectPoolに対して借用を依頼し、ObjectPoolはその依頼を受けてStack領域に保持しているObjectをClientに貸し出します。
ClientはObjectに「使用中」の状態を設定して使用し、使い終わったら「未使用」の状態に戻してObjectPoolに返却を行います。
ObjectPoolはObjectが返却されるとそれをStack領域に戻し、次の借用の依頼を待ちます。
サンプルシーンのObject Pool
今回のサンプルシーンを実行するとこんな感じの動作となります。
左クリックするとタレットから銃弾が発射されます。動画内のHierarchyに注意すると分かると思いますが、左クリックにより「=====ObjectPool=====」配下にあるオブジェクトの一部がアクティブ化され、また非アクティブに戻っています。
このシーンでは左クリックの検知がExampleGunクラスで行われ、ObjectPoolクラスに対してPoolObjectの借用を依頼、借用されたPoolObjectはAddForceにより前方に発射されます。
この借用されたPoolObjectは一定時間経過後に自身をObjectPoolへ返却するよう処理が組み込まれている為、発射後一定時間経過するとObjectPoolへ戻されます。

このサンプルシーンのObjectPoolクラスではClient側から借用依頼があった際にStack分を使い切っている場合、新しくObjectを生成してStack領域に設定する処理が行われています。
ここら辺は用途に合わせて、不足分を補うように生成するのか、使用中のオブジェクトが未使用状態になるまで待つのか、エラーとして処理するのか、使い分ける必要があると思います。
もう一つのサンプルシーン
このディレクトにはもう一つサンプルシーンが付属しています。

こちらはObjectPoolクラスをUnity標準のObjectPoolクラスを使用して実装した例となっています。
Unity標準のObjectPoolに関しては私もブログで記事を書いているのでそちらを参照してください。
まとめ
Object Poolパターンとはあらかじめオブジェクトを生成して格納しておき、それを繰り返し再利用するパターンです。
このパターンのメリットはオブジェクトの生成と破棄のコストを減らすことができ、処理速度の改善が狙える、という事で、特にACTやSTGでは有用な手法であるといえます。
デメリットはある程度のメモリ領域を必要とする、という点と、使用中/未使用の状態管理を自身で行う必要がある、という事で、特にこの状態管理がうまく実装できないと無駄にメモリ領域を消費してしまい、かえって処理が遅くなるので注意が必要です。