【Unity】2Dシューティングゲームで軽い処理で弾を撃つ方法

2018.06.03 自習室 0

シューティングゲームの弾のように大量に同じオブジェクトを使う必要がある場合、「Instantiateで生成してDestroyで破棄」という処理を都度、行なっていると処理がとても重くなる場合があります。

ここでは「オブジェクトプーリング」と呼ばれる方法を使ってオブジェクトを使い回し、処理を軽くする方法を説明しています。

[10個の弾を使い回して弾を撃つ]

この手の記事は「オブジェクトプール unity」とかで検索すると大量に出てくるのですが、スクリプトがペタッと貼ってあるだけの記事が多くて実際に使ってみる時に少し迷ったので、実装手順も含めた記事にしてまとめておきます。

なお、この記事は以下の記事で紹介されているスクリプトを参考にさせていただいています。

【Unity】オブジェクトプーリングでオブジェクト節約術

環境

  • Unity 2017.3.1f1

このページの構成

ポイント
事前準備
オブジェクトプール
関連記事

ポイント

オブジェクトプーリングとは、オブジェクトをプールして(=溜めて)使い回すことで、生成(Instantiate)と破棄(Destroy)のコストを削減する方法
手順としては以下の通り
① 最初にある程度の数を生成しておき、画面外に溜めておく
② Rigidbodyのsimulatedをfalseにしておく(物理演算の停止&未使用かどうかの判定に使用)
③ 必要になったらそこからオブジェクトを持ってきて画面に表示し、Rigidbodyのsimulatedをtrueにする
④ 足りなくなっていたら新しく生成する
⑤ 使い終わったらまた画面外に戻してRigidbodyのsimulatedをfalseにしておく

事前準備

プレイヤーと弾の表示

まず始めに、プレイヤーと弾を用意します。素材がない場合は以下の画像を使用してください。

なお、プレイヤー画像は以下のサイトのものを使用させていただいています。ありがとうございます。

素材が用意できたら、シーンビューにプレイヤーと弾のsprite画像をドラッグ&ドロップして表示させておいてください。位置は適当で大丈夫です。

弾の移動

弾を移動させる処理を追加します。

先ほどシーンビューに表示させた弾を選択して、「Rigidbody2D」と「CapsuleCollider2D」コンポーネントを追加してください。
また、重力は不要なので「Rigidbody2D」の「Gravity Scale」は0 にしておいてください。

次に以下のスクリプトを作成し、弾のコンポーネントに追加してください。ここでは「BurretController」という名前にしています。

ゲームを再生してみてください。
弾が画面外で止まり、「Rigidbody2D」の「simulated」のチェックが外れていればOKです。

ここまで出来ていれば弾の準備は完了です。
弾をprefab化してシーンビューからは削除しておいてください。

弾の発射

次にプレイヤーから弾を発射する処理を追加します。
以下のスクリプトを作成し、プレイヤーのコンポーネントに追加してください。ここでは「PlayerController」という名前にしています。

        

また、inspectorで先ほど作成した弾のプレファブをセットしておいてください。

この状態でゲームを再生してみてください。
弾が連続で発射され、画面外に大量に溜まるようになっていれば現時点ではOKです。

このままだと延々と弾が増えてしまうので、次のセクションで画面外に使われていない弾があればそこから弾を持ってくるように修正します。

オブジェクトプール

プールの作成

オブジェクトの使い回しを管理するスクリプトを作成します。
先ほどは”PlayerController”で弾の生成を行なっていましたが、弾の生成から使い回しまで管理は全てこちらのスクリプトに移して、”PlayerController”は弾を使うだけにしていきます。

まず空のゲームオブジェクトを作成し、以下のスクリプトをアタッチしてください。ここではオブジェクト名を”pool”、スクリプト名を”BurretPool”という名前にしています。

弾の管理方法の変更

弾の管理を全て”BurretPool”で行うように変更していきます。

まず”BurretPool”で弾を生成することができるようにします。
poolのinspectorに弾のプレファブをセットしてください。

次にプレイヤー側の処理を変更していきます。

プレイヤー側では弾の生成は行わず、”BurretPool”から未使用の弾をもらって、プレイヤーの位置に移動させるように”PlayerController”を変更します。
変更後のスクリプトは下記の通りです。修正点はコメントでも書いています(ここ追加①〜③とここ削除①〜②)ので、”PlayerController”を修正してください。

以上で基本的な処理は完成です!ゲームを再生してみてください。
弾のTransform情報を見ると画面外と画面内を行ったり来たりして使い回されていることが確認できると思います。

弾を撃つ間隔を短くしたりして最初に生成した10個の弾では足りなくなると、新しく生成されることも確認できると思います。
最初にどれくらい生成しておくかはゲームにもよると思うので、適宜変えてください。

関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です