オブジェクトプールで最適化【UnityでRTSを作る 16】
昨日公開した記事でオブジェクトプールを紹介しました。
今回はそのオブジェクトプールをCubeKunWarsに適用します。
mackysoft.hatenablog.com
StatusGUIをプーリング
オブジェクトプールを作る前に実装していたDisable関数が役に立ちました。
Disable プーリングシステムを実装したときに使用したい。
HPバーの実装【UnityでRTSを作る 11】 - ヒキニートがゲームを作るブログ
過去の自分、ありがとう。
CKWBehaviour.cs(重要部分を抜粋)
protected virtual void OnDisable () { status.Disable(); } protected virtual void Start () { status = PoolManager.GetPoolSafe(StatusGUI.Prefab.gameObject).Get<StatusGUI>(StatusGUI.Canvas.transform); status.Initialize(this); }
CubeKunをプーリング
DisableではHealthやTargetの初期化初期化を行います。
Weapon周りの初期化はもう少し調整する必要があります。
CubeKun.cs(重要部分を抜粋)
public static CubeKun GetInstance (CubeKun prefab,Vector3 position,Quaternion rotation) { return PoolManager.GetPoolSafe(prefab.gameObject).Get<CubeKun>(position,rotation); } public void Disable () { gameObject.SetActive(false); Health.Value = Health.Max; Target = null; for (int i = 0;Weapons.Length > i;i++) { Weapons[i].ShootStop(); Weapons[i].Replenishment(); } } protected override void Awake () { Health.onDie.AddListener(h => Disable()); }
Bulletをプーリング
最後に弾の再利用が出来るようにします。
これが一番プーリングによる影響が大きいと思います。
TrailRendererのClearをしないとTrailが以前の場所から再スポーンした場所に伸びてひどいことになります。
オブジェクトの初期化は正しく行いましょう。
Bullet.cs(重要部分を抜粋)
private Coroutine disableCoroutine = null; public TrailRenderer Trail { get; private set; } public void Shot (Transform point,CubeKun parent,int power,float speed,float time) { var ins = PoolManager.GetPoolSafe(gameObject).Get<Bullet>(point.position,point.rotation); Parent = parent; ins.gameObject.SetLayer("Bullet_" + parent.Team.ToString()); ins.power = power; ins.speed = speed; ins.Trail.Clear(); ins.DisableStart(time); } private void Awake () { Trail = GetComponent<TrailRenderer>(); } public void Disable () { DisableStop(); gameObject.SetActive(false); } public void DisableStart (float time) { DisableStop(); disableCoroutine = StartCoroutine(DisableCoroutine(time)); } public void DisableStop () { if (disableCoroutine != null) StopCoroutine(disableCoroutine); } private IEnumerator DisableCoroutine (float time) { yield return Timeline.WaitForSeconds(time); Disable(); }
動画
プロファイラーを見てるとなんとなく処理が軽くなった気はします。
Github
今回使用したオブジェクトプールはこちらでダウンロードできます。
github.com