原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】公式サンプルプロジェクトで学ぶデザインパターン:Object Pool

感想を述べよ

赤ん坊の写真を見せられても「可愛いですね」の言葉以外思いつかない皆さんこんにちは。ほら、他にもっと何か言葉があるだろう的に何枚も写真を見せつけられても「可愛い」以外の感想は思い浮かばないので勘弁してください。また「その赤ちゃんの写真下さい」という言葉をきっかけに周りの人間すべてに写真を送りつけてくる方もいますが「あ、私も欲しいです」という言葉は長いものに巻かれた社交辞令なので真に受けないでください。

 

デザインパターン

Unity公式からゲーム開発で使用するデザインパターンを学習するためのサンプルプロジェクトが公開されています。

github.com

公式サンプルではディレクトリ別に各デザインパターンに対するサンプルプロジェクトが分けられています。

 

このブログではこのサンプルプロジェクトに対して、これまで2回解説記事を書いています。

www.karvan1230.com

www.karvan1230.com

今回取り上げるデザインパターンは数あるデザインパターンの中でもゲーム開発で最も利用されるであろう「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に関しては私もブログで記事を書いているのでそちらを参照してください。

www.karvan1230.com

 

まとめ

Object Poolパターンとはあらかじめオブジェクトを生成して格納しておき、それを繰り返し再利用するパターンです。

このパターンのメリットはオブジェクトの生成と破棄のコストを減らすことができ、処理速度の改善が狙える、という事で、特にACTやSTGでは有用な手法であるといえます。

デメリットはある程度のメモリ領域を必要とする、という点と、使用中/未使用の状態管理を自身で行う必要がある、という事で、特にこの状態管理がうまく実装できないと無駄にメモリ領域を消費してしまい、かえって処理が遅くなるので注意が必要です。

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。