C# 如何根据object标记从这个排序数组中提取碰撞器数据,并将该对象指定给C中的目标
在这篇文章中,我根据距离对一系列碰撞器进行了排序,并试图为我的AI指定最接近的目标 我最终需要根据碰撞器将遇到的对象标记添加其他条件,但我需要知道将首先指定目标。中C# 如何根据object标记从这个排序数组中提取碰撞器数据,并将该对象指定给C中的目标,c#,unity3d,artificial-intelligence,gameobject,collider,C#,Unity3d,Artificial Intelligence,Gameobject,Collider,在这篇文章中,我根据距离对一系列碰撞器进行了排序,并试图为我的AI指定最接近的目标 我最终需要根据碰撞器将遇到的对象标记添加其他条件,但我需要知道将首先指定目标。中 GameObject GetTarget() { GameObject TopTarget=null; Collider[] col = Physics.OverlapSphere(transform.position, checkRadius, checkLayers);
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;
}
您将始终返回TopTarget==null。相反,您应该在此处返回项目
然后清除与所需标记不匹配的任何项目的数组。。。因此,如果第一个条目(例如)不匹配,您基本上会丢弃您的数组。。。你怎么知道有100个元素而不是更多或更少
我宁愿和喜欢
你会像这样使用这个
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;
}
}
您可以选中项,但返回TopTarget,它只分配给null。您也将目标设置为它,这是因为我不知道如何从其组件(如碰撞器)引用游戏对象。好的,很抱歉,我不清楚我的示例代码!!碰撞器阵列按距离排序。我只需要引用数组中碰撞器所属的游戏对象,将其指定为目标游戏对象,然后清空数组,因为当AI摧毁目标时,它将再次调用此方法以查找下一个最近的目标。碰撞器范围内的对象将少于100个。
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 ;)
}
}