所以基本上,我有2个静态列表用作对象池,还有3个函数与这些列表进行交互。我一直在存储附加到gameObject上的脚本,因为这是我要做的所有工作。
将对象添加到列表中的一个
public static void AddLightning(Lightning newLightning)
{
lightningList.Add(newLightning);
}
从活动列表中删除该对象,将其停用并将其移至无效列表的一种方法
public static void RemoveLightning(Lightning oldLightning)
{
lightningList.Remove(oldLightning);
deadLightningList.Add(oldLightning);
Debug.Log("Dead number in list: " + oldLightning.number);
oldLightning.gameObject.SetActive(false);
//Debug.Log("adding dead Lightning" + deadLightningList.Count);
}
一个要获取死实例或在没有死实例的情况下创建一个新实例。
public static Lightning GetLightning()
{
Lightning retLightning;
//Debug.Log(deadLightningList.Count);
if (deadLightningList.Count > 0)
{
//Debug.Log("Using dead Lighting");
retLightning = deadLightningList[0];
deadLightningList.RemoveAt(0);
lightningList.Add(retLightning);
return retLightning;
}
//Debug.Log("Adding New Lighting");
GameObject newObject;
newObject = Instantiate<GameObject>(lightningFab);
retLightning = newObject.GetComponent<Lightning>();
lightningList.Add(retLightning);
retLightning.gameObject.SetActive(true);
return retLightning;
}
这是唯一请求闪电实例的代码
float dmgMult = 1;
float chainDamage = damage;
Lightning lightning;
lightning = GetLightning();
lightning.SetTower(tower);
lightning.SetNumber(lightningNum);
lightningNum++;
lightning.setTargets(chainList);
foreach (mobBase mob in chainList)
{
chainDamage *= dmgMult;
mob.DamageMob(chainDamage);
//Debug.Log("Damage: " + chainDamage);
dmgMult *= 0.8f;
}
将闪电设置为在固定时间后自行杀死并重新添加到死角列表中。
void OnEnable () {
ProjectileBase.AddLightning(this); //Added to see if it would help, it doesnt
lightningLine = GetComponent<LineRenderer>();
timeKill = .2f;
}
// Update is called once per frame
void FixedUpdate () {
setLine(targets);
timeAlive += Time.deltaTime;
if (timeAlive >= timeKill)
{
Debug.Log("Dead number Adding: " + number);
ProjectileBase.RemoveLightning(this);
}
}
闪电熄灭后,它会自动停用。但是列表似乎从未在其中包含对象的多个实例。我添加了lightningNum来查看是否有任何样式,当它制作一个新样式时,它似乎至少重复使用了一次闪电,然后全部忘记了。
ProjectileBase是保存静态列表的地方
答案 0 :(得分:2)
从外观上看,解决方案是一个两步过程。首先,请确保在OnEnable()
期间不会将您的闪电添加到池中。创建闪电时,请调用其他方法,例如Setup()
。原因是,每次重新激活时,闪电都会每次将其自身添加到池中。
void Setup()
{
ProjectileBase.AddLightning(this); //Added to see if it would help, it doesnt
lightningLine = GetComponent<LineRenderer>();
timeKill = .2f;
}
第二步是从死列表中将其实际删除后重新激活它。
public static Lightning GetLightning()
{
Lightning retLightning;
//Debug.Log(deadLightningList.Count);
if (deadLightningList.Count > 0)
{
//Debug.Log("Using dead Lighting");
retLightning = deadLightningList[0];
deadLightningList.RemoveAt(0);
lightningList.Add(retLightning);
retLightning.gameObject.SetActive(true); // <-- Reactivate the object
return retLightning;
}
//Debug.Log("Adding New Lighting");
GameObject newObject;
newObject = Instantiate<GameObject>(lightningFab);
retLightning = newObject.GetComponent<Lightning>();
lightningList.Add(retLightning);
retLightning.gameObject.SetActive(true);
return retLightning;
}
或者,确保获得闪电后重新激活闪电。要么,要么,但是在您提供的代码中,您没有显示我们重新激活它。
现在,尽管您的问题没有问到这个问题,但是您是否考虑过Queue<Lightning>
集合,如果您只是选择第一个集合,并在完成后将其添加到列表的末尾?似乎每隔0.2秒,您就停用了闪电并重新使用了旧的闪电。两个List<Lightning>
集合可能会比问题凭单增加更多的复杂性。