如何将碰撞体数据从基于对象标签的排序数组中提取出来,并在 C# 中将该对象分配给目标


GameObject GetTarget()
{
GameObject TopTarget=null;
Collider[] col = Physics.OverlapSphere(transform.position, checkRadius, checkLayers);
Array.Sort(col, new DistanceComparer(transform));

foreach (Collider item in col)
{
if(item.CompareTag("HurbFood"))
{

return TopTarget;
}
else
{
Array.Clear(col, 0, 100);
}

}

Target = TopTarget;
return Target;
}

在此,我根据距离对碰撞体阵列进行了排序,并尝试为我的AI分配最近的目标。

我最终需要根据碰撞体将遇到的对象标签添加其他条件,但我需要知道将首先分配目标。

in

if(item.CompareTag("HurbFood"))
{         
return TopTarget;
}

您将始终返回TopTarget(==null(。相反,您应该在此处返回item

然后,您还可以清除任何与所需标签不匹配的项目的数组...因此,如果第一个条目(例如不匹配(,您基本上会扔掉您的数组......你怎么知道有100元素,而不是或多或少..?


我宁愿LinqWhere和LinqOrderBy喜欢

using System.Linq;
...
private bool TryGetTarget(out GameObject target)
{
target = default;
var colliders = Physics.OverlapSphere(transform.position, checkRadius, checkLayers);
// Filter by tag etc
// You could add more filters here
var filteredColliders = colliders.Where(col => col.CompareTag("HurbFood")).ToArray();
switch(filteredColliders.Length)
{
case 0:
return false;
case 1:
target = filtered colliders[0].gameObject;
return true;
default:
// Now order by distance ascending
var orderedColliders = filteredColliders.OrderBy(col => Vector3.Distance(col.transform.position, transform.position));
target = orderedColliders.First().gameObject;
return true;
}
}

你会像这样使用它

private void Update()
{
if(TryGetTarget (out var target))
{
transform.position = Vector3.MoveTowards(transform.position, target.transform, moveSpeed * Time.deltaTime);
}
else
{
// Probably either stay here and do nothing 
// but wait for food appearing close to you
// or wander around in some random pattern in order
// to try and find some food ;)
}
}

最新更新