ゲーム制作勉強中!あこがれだったプログラマーに今からなろう!

昔、あこがれていたプログラマー。今からでも勉強してみようと思い立ち、チャレンジ開始! 勉強メモや、悪戦苦闘な日々の記録です。

Prefabのアタッチが外れる(2)

昨日に引き続き、ヒエラルキー上で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に代入している。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class BossEnemyBullet : MonoBehaviour
  6. {
  7.  
  8.     float dx;
  9.     float dy;
  10.     private float Bulletspeed = GameManager.Instance.EnemyBulletSpeed * GameManager.Instance.GameLevel;
  11.     public BulletManager bulletManager;
  12.  
  13.     public void Settingsatstartup(BulletManager bManager)
  14.     {
  15.  
  16.         bulletManager = bManager;
  17.  
  18.     }
  19.  

これで1. は完成。 次は、Bulletを生成する時に、このメソッドを呼び出し、引数でBulletManagerを渡してやれば良いはず。 オブジェクトプールでオブジェクトを生成するタイミングでBulletManagerを渡してやれば、あとはオブジェクトプールの機能で 参照が張り付いた弾が使いまわされるはず。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Pool;
  5.  
  6.  
  7. public class BulletManager : MonoBehaviour
  8. {
  9.     public GameObject BossbulletPrefab;
  10.  
  11.     ObjectPool<GameObject> BossBulletPool;
  12.  
  13.     private void Start()
  14.     {
  15.         BossBulletPool = new ObjectPool<GameObject>(
  16.                 CreateBossBulletPoolObject,
  17.                 TakeFromPool,
  18.                 ReturnedToPool,
  19.                 DestroyPoolObject,
  20.                 false,
  21.                 2,
  22.                 30);
  23.  
  24.     }
  25.  
  26.    //Bossの弾のオブジェクトプール
  27.     GameObject CreateBossBulletPoolObject()
  28.     {
  29.         GameObject o = Instantiate(BossbulletPrefab);
  30.         BossEnemyBullet bossEnemyBullet = o.GetComponent<BossEnemyBullet>();
  31.         bossEnemyBullet.Settingsatstartup(this);
  32.         o.transform.parent = this.transform;
  33.         return o;
  34.     }
  35.  

Bulletはオブジェクトとして生成されているので、まずはGetComponentでBulletのスクリプトを取得し、 先ほど作成したSettingsatstartupメソッドに引数として自分自身(=this)を渡してやる。

結果は、大成功。 これで、Prefab化してアタッチが外れても、同じ方法でセットさせる事ができるだろう。