読者です 読者をやめる 読者になる 読者になる

ヒキニートがゲームを作るブログ

Unityでゲームを作る過程を投稿します

オブジェクトプールで最適化【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