昨日に引き続き、ヒエラルキー上でBulletに、オブジェクトプールのあるBullet Managerをアタッチしておいたのに、BulletをPrefabフォルダに入れてPrefab化したタイミングで、このアタッチが外れてしまう問題の対策。
昨日見つけた記事にある、メソッドの引数を利用する。から考えてみた。
工程は以下の2つ。
1. Bulletのスクリプトに初期設定用のメソッドで、Bullet Managerへの参照をセットできるように作っておく。
2. Bulletを生成する時に、このメソッドを呼び出し、引数でBullet Managerへの参照を渡す。
まずは、Bulletのスクリプト
11行目のpublic BulletManager bulletManager;
元々、Bullet Managerをアタッチさせる予定だった変数bulletManager。
これはこのまま利用できる。
初期設定用のメソッドSettingsatstartupを作成し、スクリプト”Bullet Manager”への参照の変数としてb Managerを引数で受け取り、これを先ほどのbulletManagerに代入している。
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class BossEnemyBullet : MonoBehaviour
- {
- float dx;
- float dy;
- private float Bulletspeed = GameManager.Instance.EnemyBulletSpeed * GameManager.Instance.GameLevel;
- public BulletManager bulletManager;
- public void Settingsatstartup(BulletManager bManager)
- {
- bulletManager = bManager;
- }
これで1. は完成。 次は、Bulletを生成する時に、このメソッドを呼び出し、引数でBulletManagerを渡してやれば良いはず。 オブジェクトプールでオブジェクトを生成するタイミングでBulletManagerを渡してやれば、あとはオブジェクトプールの機能で 参照が張り付いた弾が使いまわされるはず。
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Pool;
- public class BulletManager : MonoBehaviour
- {
- public GameObject BossbulletPrefab;
- ObjectPool<GameObject> BossBulletPool;
- private void Start()
- {
- BossBulletPool = new ObjectPool<GameObject>(
- CreateBossBulletPoolObject,
- TakeFromPool,
- ReturnedToPool,
- DestroyPoolObject,
- false,
- 2,
- 30);
- }
- //Bossの弾のオブジェクトプール
- GameObject CreateBossBulletPoolObject()
- {
- GameObject o = Instantiate(BossbulletPrefab);
- BossEnemyBullet bossEnemyBullet = o.GetComponent<BossEnemyBullet>();
- bossEnemyBullet.Settingsatstartup(this);
- o.transform.parent = this.transform;
- return o;
- }
Bulletはオブジェクトとして生成されているので、まずはGetComponentでBulletのスクリプトを取得し、 先ほど作成したSettingsatstartupメソッドに引数として自分自身(=this)を渡してやる。
結果は、大成功。 これで、Prefab化してアタッチが外れても、同じ方法でセットさせる事ができるだろう。