【问题标题】:Unity list item not added未添加 Unity 列表项
【发布时间】:2018-07-10 04:28:54
【问题描述】:

所以基本上我有 2 个用作对象池的静态列表和 3 个与这些列表交互的函数。我一直在存储附加到游戏对象的脚本,因为这是我想做的所有工作。

将对象添加到列表中

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);
}

One 获取一个死实例,如果没有死实例,则创建一个新实例。

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 是存放静态列表的地方

【问题讨论】:

    标签: c# list unity3d


    【解决方案1】:

    从表面上看,解决方案是一个两步过程。首先,拥有它,这样您的闪电就不会在OnEnable() 期间添加到池中。创建 Lightning 时,调用其他方法,例如 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&lt;Lightning&gt; 集合,如果您只是选择第一个,并在完成后将其添加到列表的末尾?看起来每 0.2 秒,您就会停用闪电并重新使用旧的。两个List&lt;Lightning&gt; 集合可能会增加比问题保证更多的复杂性..?

    【讨论】:

    • 这是问题,非常感谢。在 OnEnable 中添加它只是为了帮助我尝试解决它。也确实听起来像队列会更简单,再次感谢。
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多