Unityでゲームオブジェクトのプーリングを行ってゲームオブジェクトを再利用する

今回はゲームオブジェクトのプーリングを行ってゲームオブジェクトを再利用するようにしたいと思います。

プーリングなんて難しい言葉のように聞こえますが、あらかじめ用意しておいたゲームオブジェクトを使うようにするという事です。

あらかじめ弾のインスタンスを生成しておき、数が足りている間はそのゲームオブジェクトを再利用します。

数が足りない場合は新たに弾をインスタンス化しプール数を増やします。

今回の記事は

Unityでカメラのレンズの中心からマウスクリックした位置に弾を飛ばす機能を作成していきます。

で使用した物理的な弾を飛ばす機能を改造して作成していきます。

スポンサーリンク

ShotTestスクリプトの修正

ShotTestスクリプトであらかじめ弾のプレハブをインスタンス化し非アクティブにしてリストに保持しておき、弾を発射した時はそのゲームオブジェクトの位置等を調整しアクティブにすることにします。

ShotTestスクリプトをShotBulletという名前に変更します(特に変えなくてもいいです)。

最初にフィールド部分とStartメソッドです。

リストで弾のプレハブをインスタンス化したものを保持するようにします。

numOfPoolはデフォルトのプーリングをしておく数です。

StartメソッドでnumOfPoolの数分だけ弾をインスタンス化し、非アクティブにし、リストに追加します。

Updateメソッドで弾を登録したリストから非アクティブの弾を探し、位置や角度を変更し、アクティブにします。

リストの中から非アクティブのものが見つからなかったら新たに弾をインスタンス化しリストに追加し、これを利用します。

BulletTestスクリプトの修正

BulletTestスクリプトはBulletに名前を変更します(変更しなくてもいいです)。

AwakeメソッドでRigidbodyを取得します。

OnEnableメソッドでRigidbodyのvelocityをVector3.zeroで初期化します。

これはプーリングを行う場合、ゲームオブジェクトをアクティブ、非アクティブにする事で再利用する為、アクティブになった時に一旦Rigidbodyのvelocityを0にしないと前のRigidbodyのvelocityの値で移動してしまうからです。

プーリングを行う場合はDisableBulletで弾のゲームオブジェクトを非アクティブにします。

OnCollisionEnter内でも弾のゲームオブジェクトを非アクティブにします。

これで弾のインスタンスをプーリングして使用する事が出来ます。

参考サイト

UnityチュートリアルーObject Poolingー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 通りすがり より:

    Bulletの
    FindOfjectOfTypeがとても重い処理です

    • ああ、確かにその通りです。

      変にモード切替をしようとして重い処理にしていました。

      プーリングだけの処理に直しておきます。

      ありがとうございました。