C# 如何根据object标记从这个排序数组中提取碰撞器数据,并将该对象指定给C中的目标

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

在这篇文章中,我根据距离对一系列碰撞器进行了排序,并试图为我的AI指定最接近的目标

我最终需要根据碰撞器将遇到的对象标记添加其他条件,但我需要知道将首先指定目标。

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