塔防炮塔AI调试记录

C# 清空list集合的空元素

做一个炮塔的AI,希望攻击最先接近的怪物,List用来存放怪物接近的顺序

  • 通过炮塔自身的触发器来记录和更新怪物列表LIST

    //进入攻击范围 添加到攻击列表
    private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Enemy")
        {
            enemys.Add(other.gameObject);        
        }
    }
    //离开攻击范围 
    private void OnTriggerExit(Collider other)
    {
        if(other.tag == "Enemy")
        {
            enemys.Remove(other.gameObject);
        }
    }

但是如果在攻击范围内死亡,怪物自身做Destory(),则炮塔当前的攻击目标List【1】就变成了null,这就需要一个方法来让移除List列表的空元素并重新组合,让炮塔重新获得当时第二顺位(此时第一)的目标

public void UpdateEnemyList()
    {
        try
        {
            List<int> emptyList = new List<int>();
            //enemys.RemoveAll(null);
            for (int i = 0; i < enemys.Count; i++)
            {
                if (enemys[i] == null)
                {
                    emptyList.Add(i);
                }
            }
            /*
             *
             *移除list项目会导致索引的移动 所以+i
            */
            for (int i = 0; i < emptyList.Count; i++)
            {
                enemys.RemoveAt(emptyList[i] + i);
            }
            Debug.Log("Null target clear done");
        }
        catch(System.Exception e)
        {
            Debug.Log(e);
        }
    }

以上处理还有一个问题当多个炮塔存在时,如果怪物死亡速度比代码处理速度还要快的时候,某些炮台会持续丢失主目标几帧时间,当执行完清空后会继续攻击,虽然没有影响游戏的进程,但是引擎会报错,还会有点违和感,目前还不知道怎么处理,于是直接捕获异常。

就当无事发生.jpg

你可能感兴趣的:(Unity初学)