首页 > 解决方案 > Unity Script C#,Array to list,如何以更好的方式优化对象检测?

问题描述

我正在开发 RTS 游戏,需要一种更好的方法让单位互相威慑。

当每个单元都这样做时,大约有 30 个单元,这开始成为非常昂贵的运行方式。

有什么更好的优化方法:

private void Update()
{
 if(target == null) 
        {
            ArrayDetect();
            AttackUnit();
            return;  
        }

[SerializeField] private Collider[] colliderArray;
    [SerializeField] private List<GameObject> enemyColliders;


   
    private void ArrayDetect()
    {
       colliderArray = Physics.OverlapSphere(ownAimAtPoint.position, fireRange, layerMask);
       
       
       foreach (Collider collider in colliderArray)
        {
                Debug.Log("we hit a", collider);                if(!collider.TryGetComponent<Targetable>(out Targetable potentialTarget)) 
                {
                    return;                   
                }    
                if (potentialTarget.hasAuthority)
                    {     
                    return;  
                    }
                
                else
                {
                enemyColliders = enemyColliders.Distinct().ToList();
                enemyColliders.Add(collider.gameObject);
                Debug.Log("Found an enemy", potentialTarget);
                }                
        }
    }

Physics.OverlapSphere 使用 layermask 标签查找范围内的对撞机,然后对它们进行排序并将它们添加到敌人列表中,然后:

private void AttackUnit()
    {
        //if (enemyColliders.Count == 0) { return; }

        foreach (GameObject enemy in enemyColliders)
        {
         Debug.Log("We got confirmed enemy", enemy);
gameObject.GetComponent<Targeter>().CmdSetTarget(enemy);
                //attack the enemy

        }
        
    }

遍历敌人列表并将每个敌人指定为攻击目标。

标签: c#unity3d

解决方案


推荐阅读