2012年9月11日火曜日

Unity オブジェクトプールの作成 ~その2

前回までオブジェクトのプールを作成するためのコーディングをみてきた。

さらに一歩進んでこれをコーディングでなく、アセットとして解決するのがPool Manager2というアセットだ。他にも多くのアセットがあるのだが、Playmakerと連動するのは本製品のみであるのでコーディングを避けたい人は注目しても良いのではないか。

公式ページの機能紹介を翻訳したい:



http://poolmanager.path-o-logical.com/

2012/09/08

インスタンスをプールする機能

  • インスタンス生成/破棄(Destroy)の代わりに生成/非生成(despawn)を実装。時間のかかるガーベージコレクションを避け、フレームレート低下を回避
    • ランタイム前にインスタンスをプール
      • シーンに配置するオブジェクトもゲーム再生前にプールできる

複雑なセットアップ不要

  • プールマネージャプール生成(PoolManager SpawnPool)コンポーネントをゲームオブジェクトにドラッグ&ドロップしたうえ、コード中のInstantiate(), Destroy()を各々Spawn(),Despawn()に置き換えておく。引数は変更前と同じで良い仕様

初期化およびクリーンアップは自動的に作動しレベルローディングに最適

  • オプションとしてロード時に破棄しないDontDestroyOnLoadを指定することでプール永続に対応。なお当該オプションについてはUnityドキュメントをリンク先で確認のこと
http://unity3d.com/support/documentation/ScriptReference/Object.DontDestroyOnLoad.html

複数プレハブをひとつの論理プールで

  • プールは複数プレハブから派生したインスタンスで作成可能。これによりユーザフレンドリーで論理的なグループ分けにすることが可能。たとえば全ての敵、爆発、発射台、など好みにあわせたグループ分けが可能。グループ名は任意に設定でき、20プールを設定してもオーバーヘッドは1プールと違いがなく、好みにあわせたグループ分けを実現が可能

プレハブごとに上級オプションを定義(オプション)

  • Unityのインスペクタでプレハブをドラッグ&ドロップすることでプールに多くのオプションを設定することが出来る。(同等の機能はスクリプトを通じて実装可能)これはオプションであるためクイックスタートする場合は設定する必要がない
    • インスタンスのプレロード
      • ゲームプレイ時の参照のロードおよびフレームレート悪影響をさけるためインスタンスのプレロードを任意の個数実現することが可能。非常に肝要であり、Unityにてゲームプレイの前にできるかぎりの情報をロードすることが可能
    • インスタンスの”スマート”カリング機能
      • プールサイズが大きくなりすぎた場合に非生成(despawn)し非アクティブとなったインスタンスを破棄(destroy)。重いゲームイベント後のメモリのクリーンアップを制御する際に有効。使用後、この機能はオフになり、特定のトリガー条件が再度のクリーンアップをオンにする。カリングは特定のターゲット数に到達したときにオフ。パラメータをチューニングしてカリング頻度を調整することが可能。
    • 最大インスタンス数の設定
      • ゲームの最大インスタンス数を設定可能。ゲームにとって重要でないアイテムの個数調整に有効で、例えば小さな弾丸の数や、小さな炎などに応用可能。

シーンの自動整理

  • インスタンス名に番号を自動付与しゲームの開発やデバッグを楽にする
    • プール生成オブジェクトをシーンから自由につけはずし可能
      • さらにプールマネージャにより自動的にプールの初期化およびクリーンアップを実現
    • プールのプレハブ生成
      • ローディングを軽減し、ゲームの特定のレベルをまるごとプレハブにできる
    • プール生成オブジェクトの親子関係
      • シーンのどこにでも親子関係をもたせることが可能、オブジェクトを追跡させることも可能。たとえばゲームの進行バーGUIパーツのカメラにつけるなども可能。

全てを内部キャッシュ

  • Spawn()から参照があった場合もオーバーヘッドがない。逆にInstantiate()を使用したときは多くのオーバーヘッドが存在し、インスタンス生成、メモリ領域の確保、GameObjectに型キャストしてTransformが必要な場合はGameObject.transformでGetComponentを外部コールするなどが発生してしまうため有効

デバッグオプション

  • メッセージログによりプールのログが解析できる。デバッグは階層になっているため、して特定のプレハブから派生したインスタンス、あるいはプール生成オブジェクト単位でのみデバッグ表示するようフィルタができる

パーティクルエミッター向けのハンドリング

  • パーティクル破棄時の処理は、Unity標準の自動破棄(destroy)からプールマネージャ独自の非生成(despawn)に置き換えられる。コードではTranformでなくParticleEmitterをSpawn()に渡せば良い。

各々のプールはリストになっている

  • 生成された(アクティブの)インスタンスのみ含まれる。これはインスタンスで作業をする際に静的(static)アクセスが出来るため便利である

その他便利な機能

  • 使用されたプレハブをGetするメソッドしインスタンスを生成するなど、Unityでは標準的に提供されていない機能であり、カスタムエディタで情報が整理され作業効率を向上させる
-----

ひととおりの機能は揃っているようだ。他のアセットで同等の機能があるかどうか比較してみるのが良いのではないかとおもう。

パフォーマンスも意識して開発しようぜ!!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ