遊戲效能優化--ObjectPool資源池的建立和使用
阿新 • • 發佈:2019-01-05
/* Object Pool 資源池 * 在遊戲開發中,子彈等的反覆建立和銷燬是非常消耗效能的,所以可以引入資源池技術 * 當想要建立子彈時先看池子裡有沒有子彈,先從池子裡拿,在用完之後又自動的還到池子裡 * 用資源池可以很好的節約遊戲效能。 * */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletPool : MonoBehaviour { public GameObject Bullet;//子彈 private int BulletCount = 30;//池子容量 List<GameObject> bulletlist = new List<GameObject>();//池子 void Start () { Init(); } /// <summary> /// 初始化方法:例項化30個子彈作為子彈池子 /// </summary> private void Init() { for (int i = 0; i <= BulletCount; i++) { GameObject go = GameObject.Instantiate(Bullet); bulletlist.Add(go); go.SetActive(false); go.transform.parent = this.transform; } } /// <summary> /// 獲取子彈方法 /// </summary> /// <returns></returns> public GameObject GetBullet() { foreach (GameObject go in bulletlist) { if (go.activeInHierarchy == false ) { go.SetActive(true); return go; } } return null; } }
/* * 使用資源池例子 */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bulletfire : MonoBehaviour { // public GameObject Bullet; private BulletPool bulletPool; void Start () { bulletPool = this.GetComponent<BulletPool>();//拿到池子 } void Update () { if(Input .GetMouseButtonDown(0)) { GameObject GO = bulletPool.GetBullet();//從池子中拿到子彈 GO.transform.position = transform.position;//設定子彈位置 GO.GetComponent<Rigidbody>().velocity = transform.forward * 50;//設定子彈速度 StartCoroutine(DestroyBullet(GO));//開啟子彈放回池子協程 } } /// <summary> /// 子彈放回池子協程 /// </summary> /// <param name="go"></param> /// <returns></returns> IEnumerator DestroyBullet(GameObject go) { yield return new WaitForSeconds(3); go.SetActive(false); } }