未添加Unity列表项

时间:2018-07-10 04:28:54

标签: c# list unity3d

所以基本上,我有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是保存静态列表的地方

1 个答案:

答案 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>集合可能会比问题凭单增加更多的复杂性。