する質問をすることでしか得られない、回答やアドバイスがある。23今作成中のシューティングゲームがInstantiateとDestroyを繰り返し、モバイル端末だと特に動きがカクカクになってきました。何かいい手はないかと思って調べているとオブジェクトプールという手段を知り、3日ほど挑戦していますが、うまくできなかったので質問させていただきます。作成中のシューティングゲームは基本的にUnityの公式のチュートリアルを参考にしています。公式のオブジェクトプールのチュートリアルも試してみたんですが、結構変更している部分があり、公式のようにはなりませんでした。タップして動かし連続して弾を撃つプレイヤーと、生成されると一定のスピードで動き、一定の間隔で弾を撃ってくるエネミーがあります。エネミーには弾を撃つものと撃たないものがあり、撃つものはshotPositionを子要素として持ちます。エネミーは何種類かあり、撃つ弾の種類も、shotPositionの数や位置も変わってきます。origin)を呼び出してエネミーごとに自分の子要素であるshotPositionのtransformを渡して、その位置から弾を撃っています。}}バレットスクリプトでは、生成されると同時にまっすぐ進むだけです。プレイヤーが撃った弾はエネミーにあたるとDestroyされます。ステージの四方をDestroyAreaに囲まれており、敵に当たらなかったプレイヤーの弾やエネミーの弾はDestroyAreaに当たることで、破壊されるようになっています。[http://megumisoft.hatenablog.com/entry/2016/06/25/133033](URL)調べたところ、こちらのサイトが一番わかりやすく、アレンジできそうでしたので試行錯誤しましたができませんでした。サイトの方にあるBulletGeneratorクラスにあることをこちらのSpaceshipに書けば実装できそうな気がしましたが、こちらでのエネミーごとに違うshotPositionから発射するということが障害になっているのか、うまくできませんでした。情報等足りないところや、わかりにくいところ等あれば追記します。回答よろしくお願いします。kaka1102さんの回答を参考にいろいろ変更してみました。プレイヤーはエネミーの弾は管理していなく、プレイヤーとエネミーが共通して持っているスペースシップというスクリプトで弾の撃つ撃たないを管理しています。参考サイト、kaka1102さんが仮に作成したBulletGeneratorを組み合わせて、スペースシップに追加してみました。}}すると、最初の一発は弾を発射するんですが、次からはこのように止まってしまいました。C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:189)という同じエラーが3つ出てきます。Instantiate(bullet).GetComponent<Bullet>();になります。画像中でプレイヤーか弾が出ていませんが、プレイヤーの弾はDestroyAreaにあたると、非表示になった状態で、上へ永遠に飛んで行っていました。DestroyAreaのスクリプトはこちらです。}}以上kaka1102さんの回答を参考に改良した点になります。attachmentクリップ0気になる質問をクリップするクリップした質問は、後からいつでもマイページで確認できます。クリップした質問に回答があった際、通知やメールを受け取ることができます。自分も答えを知りたい質問者以外のユーザにも役立つ評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。質問の評価を上げたことを取り消します低評価-評価を下げられる数の上限に達しました評価を下げることができません1日5回まで評価を下げられます1日に1ユーザに対して2回まで評価を下げられます質問の評価を下げるteratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。コメントをしてください。送信する質問の評価を下げる機能の利用条件この機能を利用するためには、以下の事項を行う必要があります。件sort評価が高い順sort新着順sort古い順linkcheckベストアンサー0Playerがエネミーのショットを管理したりするというところは少し違和感がありますが参照先のような実装をしていればおそらく動くものと思います。うまくいかなかった箇所をもう少し具体的に教えていただければと思います。Bulletの出現箇所が想定していたところと違うところに出た。そもそもBullet自体が動いていない等...それとBulletGeneratorの動作を実装し、うまくいかなかったソースも載せていただけると答えやすいと思います。僕の方でもそれっぽいものは作成ししてみました。実装の詳細は多少違いますが一応載せておきます。BulletGeneratorから、これは子要素にBulletオブジェクトを複数持つオブジェクトです。子要素の中からGetActive()でfalseのものを探し、あればtrueにし弾として動かします。}}プレイヤーがショットを撃つ場合は以下のような感じです。PCでAキーを押したらショットを撃ちます。これでオブジェクトプール(BulletGenerator)にショットを依頼します。同様にエネミーのときもBulletGeneratorにショット依頼をすると弾が打てるようになると思います。)でそのオブジェクトを無効にすれば弾オブジェクトの使いまわしができます。}}一応僕の環境ではうまくいきました。ヒエラルキーの配置はこんな感じです。二発目以降の弾が出ない原因はすみません、わからないです。このエラーは初期化されていない変数を利用しようとしたときに出るものです。Spaceshipのbulletが初期化されていないために発生したものと思われます。念のため弾オブジェクトを新たに生成(Instantiate)しない方法で、あらかじめエネミーの子要素として弾を必要数配置し、プレハブ化すればそのエラーは出ないものと思います。)を入れ、Listに登録するだけで済みます。}に変更し、すでにあるEnemy以下の弾のプールから登録するだけになります。弾の名前がEnemuyBullet(Clone)ではないのはInstantiateしてないためです。)で移動し続けるのも原因はいまいち判然としませんが停止処理を挟めば大丈夫かと思いますなのでDestroyAreaに当たったら別途弾を止める処理を入れる必要があるかと思います。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。03:38回答ありがとうございます。参考に改良させていただきました。正常に動作しなかったので質問内容に追記しました。お気づきの点等ありましたらよろしくお願いします。回答ありがとうございます。参考に改良させていただきました。正常に動作しなかったので質問内容に追記しました。お気づきの点等ありましたらよろしくお願いします。03:14追加ありがとうございます。試行錯誤を重ねていたんですが、やはりうまくいかず、参考サイトの通りのものをもう一度2Dにして作成してみました。すると、スペースを10回連打すれば、思ったように弾が非表示から表示になりうまく発射できたのですが、10発撃ち終わって一度非表示になったものをもう一度発射させようとすると非表示から表示にはなりました。表示されたその場から動かなくなりました。kaka1102さんは参考サイトの通りに作ると、綺麗に動きましたか??追加ありがとうございます。試行錯誤を重ねていたんですが、やはりうまくいかず、参考サイトの通りのものをもう一度2Dにして作成してみました。すると、スペースを10回連打すれば、思ったように弾が非表示から表示になりうまく発射できたのですが、10発撃ち終わって一度非表示になったものをもう一度発射させようとすると非表示から表示にはなりました。表示されたその場から動かなくなりました。20:46遅れました以下のURLにプロジェクトごと配置したのでソースを確認していただけたらと思います。https://github.com/DevelopFRM/TeratailShitsumonResourcesフォルダ内のBulletGeneratorシーンを開くとテストができます。シーンを再生してスペースキーでショットを撃つことができます遅れました以下のURLにプロジェクトごと配置したのでソースを確認していただけたらと思います。Resourcesフォルダ内のBulletGeneratorシーンを開くとテストができます。00:07回答いただいたのに返信が遅くなってしまい、申し訳ありません。他用で忙しく、手を付けられていませんでした。kaka1102さんに作成していただいたプロジェクトですと、綺麗に動作しました。ありがとうございます。私は2Dで作っていますので、そちらでも対応できるようにまた試してみたいと思います。回答いただいたのに返信が遅くなってしまい、申し訳ありません。他用で忙しく、手を付けられていませんでした。kaka1102さんに作成していただいたプロジェクトですと、綺麗に動作しました。ありがとうございます。私は2Dで作っていますので、そちらでも対応できるようにまた試してみたいと思います。頂いたご意見への回答は行っておりません。