public GameObject GetPooledObject(GunEnum Sort) //获取对象池中可以使用的子弹。 { nowbulletType = GetWeaponType(Sort); for (int i = 0; i < nowbulletType.bulletObj.Count; ++i) //把对象池遍历一遍 { //这里简单优化了一下,每一次遍历都是从上一次被使用的子弹的下一个,而不是每次遍历从0开始。 //例如上一次获取了第4个子弹,currentIndex就为5,这里从索引5开始遍历,这是一种贪心算法。 int temI = (nowbulletType.currentIndex + i) % nowbulletType.bulletObj.Count; if (!nowbulletType.bulletObj[temI].activeInHierarchy) //判断该子弹是否在场景中激活。 { nowbulletType.currentIndex = (temI + 1) % nowbulletType.bulletObj.Count; return(nowbulletType.bulletObj[temI]); //找到没有被激活的子弹并返回 } } //如果遍历完一遍子弹库发现没有可以用的,执行下面 if (!lockPoolSize) //如果没有锁定对象池大小,创建子弹并添加到对象池中。 { GameObject obj = Instantiate(nowbulletType.bullet); obj.transform.parent = this.transform; //生成到buttlepool下 nowbulletType.bulletObj.Add(obj); return(obj); } //如果遍历完没有而且锁定了对象池大小,返回空。 return(null); }
void InitBullet(SortOfFire bulletSort) { for (int i = 0; i < pooledAmount; ++i) { GameObject obj = Instantiate(bulletSort.bullet, this.transform); //创建子弹对象 obj.SetActive(false); //设置子弹无效 bulletSort.bulletObj.Add(obj); //把子弹添加到链表(对象池)中 } }