c# - 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
}
}
遍历敌人列表并将每个敌人指定为攻击目标。
解决方案
推荐阅读
- vb.net - 如何在 datagridview 中只允许 1 列可编辑
- java - IntelliJ 无法识别 Lombok @Builder
- javascript - 将音频 blob 转换为 wav 文件
- docker - Docker:一个网络中容器之间的请求
- asp.net - 发布到 iis 后电子邮件功能不起作用
- c# - C# 属性,这是一个不好的做法吗?
- java - 石英触发器不会立即触发
- python - 从列表创建 matplotlib 3D 曲面图
- c# - 使用 EPPlus.DataExtractor 仅获取 Excel 文件中的正确行
- linux - linux和windows之间nodejs路径的区别