【问题标题】:How to find the closest GameObject in an array with another GameObject also in that array?如何在数组中找到最近的游戏对象,另一个游戏对象也在该数组中?
【发布时间】:2022-11-16 07:48:37
【问题描述】:

我正在制作游戏,我需要从最接近另一个 GameObject 的列表中找到 2 GameObjects,它也在同一个列表中,但我不希望它返回超过 2 GameObjects 或返回我正在检查的 GameObject

这是我要输入的内容:

GameObject[] objects, GameObject currentObject

我希望它输出:

GameObject[] closestObjects, GameObject currentObject

我试过了:

GameObject [ ] GetClosestPaths ( GameObject [ ] paths, GameObject pathToTest )
{
    GameObject[] bestTargets = new GameObject[2];
    float closestDistanceSqr = Mathf.Infinity;
    Vector3 currentPosition = pathToTest.transform.position;
    Transform[] pathTransforms = new Transform[paths.Length];

    for ( int i = 0; i < paths.Length; i++ )
    {
        pathTransforms [ i ] = paths [ i ].transform;
    }

    for ( int i = 0; i < pathTransforms.Length; i++ )
    {
        if ( pathTransforms [ i ].position != currentPosition && paths [ i ] != pathToTest )
        {
            Transform potentialTarget = pathTransforms[i];
            Vector3 directionToTarget = potentialTarget.position - currentPosition;
            float dSqrToTarget = directionToTarget.sqrMagnitude;
            if ( dSqrToTarget < closestDistanceSqr )
            {
                if ( bestTargets [ 0 ] == null )
                {
                    bestTargets [ 0 ] = paths [ i ];
                }
                closestDistanceSqr = dSqrToTarget;
                if ( paths [ i ].transform.position != bestTargets [ 0 ].transform.position )
                {
                    bestTargets [ 0 ] = paths [ i ];
                }
                else
                {
                    bestTargets [ 1 ] = paths [ i ];
                }
            }
        }
    }

    return bestTargets;
}

pathsGameObjectpathToTestcurrentObjectbestTargetsclosestObjects

我在 Stackoverflow 上得到了这个,但这根本不起作用。 我希望有人能提供帮助,否则这将成为一堆未完成的项目。

【问题讨论】:

  • 试试 Vector3.Distance

标签: c# unity3d


【解决方案1】:

对数组中两个对象(不包括测试对象)的简单检查可以从一个空数组开始,然后填充它,并在测试数组中的每个新对象时打乱值(用于排序)。生成的代码可能如下所示:

public static GameObject[] GetClosestPaths ( GameObject [ ] paths, GameObject pathToTest )
{
    var results = new GameObject[2];
    var resultsDistance = new float[] { float.MaxValue, float.MaxValue };
        
    for ( int i = 0; i < paths.Length; i++ )
    {
        // Unity has its mechanism to determine if two objects are equal.
        if ( paths [ i ] == pathToTest ) continue;

        // Grab the sqrDistance between the test object and the current array object.
        var d = (paths[i].transform.position - pathToTest.transform.position).sqrMagnitude;
        if ( d < resultsDistance [ 0 ] )
        {
            // Shuffle down the result if needed.
            if ( results [ 0 ] != null )
            {
                results [ 1 ] = results [ 0 ];
                resultsDistance [ 1 ] = resultsDistance [ 0 ];
            }
            results [ 0 ] = paths [ i ];
            resultsDistance [ 0 ] = d;
        }
        else if ( d < resultsDistance [ 1 ] )
        {
            results [ 1 ] = paths [ i ];
            resultsDistance [ 1 ] = d;
        }
    }

    // You can remove this debug statement once you're happy with the results.
    Debug.Log ( $"{results[0].name} - {resultsDistance[0]}
" +
        $"{results [ 1 ].name} - {resultsDistance [ 1 ]}" );
    return results;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2015-04-18
    • 2011-04-26
    相关资源
    最近更新 更多