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