我如何根据对象标签从这个排序数组中提取碰撞数据并将该对象分配给 C# 中的目标

Posted

技术标签:

【中文标题】我如何根据对象标签从这个排序数组中提取碰撞数据并将该对象分配给 C# 中的目标【英文标题】:How do i pull the Collider Data out of this sorted array bassed on the object tag and Assign that object to the Target in C# 【发布时间】:2020-10-22 02:47:26 【问题描述】:
 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 分配最接近的目标。

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

【问题讨论】:

你检查item,但返回TopTarget,它除了null之外从未分配给任何东西。你也给它设置了Target 这是因为我不知道如何从它的一个组件中引用一个游戏对象,比如对撞机。 【参考方案1】:

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

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

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


我宁愿Linq Where和Linq OrderBy喜欢

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

【讨论】:

好的,对不起,我的示例代码不清楚! 对撞机数组按距离排序。我只需要引用数组中的碰撞器是其组件的游戏对象,将其分配为目标游戏对象,然后清空数组,因为当 AI 破坏目标时,它会再次调用此方法以查找下一个最近的目标。其对撞机范围内的对象将少于 100 个。

以上是关于我如何根据对象标签从这个排序数组中提取碰撞数据并将该对象分配给 C# 中的目标的主要内容,如果未能解决你的问题,请参考以下文章

如何从选择标签传递数组对象并将值传递给 API?

BASH - 如何从 CSV 文件中的列中提取数据并将其放入数组中?

加特林:如何从数组中提取一个对象?

我如何解析 JSON,将其排序为数组。提取数据并填充到表格视图中?

JAVA 数组中的元素是对象,如何给对象排序

根据数据生成表单