从左到右读取对象

时间:2017-07-27 17:47:07

标签: c# unity3d

我在Unity中编写了一个C#脚本,它可以检测所有可见对象。现在我想从左到右输出它们,就像它们在场景中的位置一样。每个对象都有一个数字,但脚本按升序输出对象。

我的想法:

我想到了沿着水平视野的for-loop。首先通过以下方式计算水平FOV:

private static float horizontalFOV() {
    float radAngle = Camera.main.fieldOfView * Mathf.Deg2Rad;
    float radHFOV = 2 * Mathf.Atan(Mathf.Tan(radAngle / 2) * Camera.main.aspect);
    float hFOV = Mathf.Rad2Deg * radHFOV;

    return hFOV;
}

通过以下方式创建循环:

public static string OutputVisibleRenderers (List<Renderer> renderers) {
    float hFov = horizontalFOV ();

    if (null == renderers)
        throw new System.ArgumentNullException ("renderers are null");

    for (int i = 0; i < hFov; i++) {
        foreach (var renderer in renderers) {
                if (IsVisible (renderer)) {
                myList.Add (renderer.name);
            }
        }
    }
    string itemsInOneLine = string.Join ("-", myList.ToArray());
    myList.Clear ();
    print (itemsInOneLine);
    print ("--------------------------------------------------");
    return itemsInOneLine;
}

但不幸的是,这不起作用。那我怎么能从左到右阅读所有物体呢?

2 个答案:

答案 0 :(得分:2)

我没有使用Unity,很抱歉,如果我错过了某些内容,但似乎虽然在外let query='update users set freinds="' + freind + '" where username = "'+ username+'"'; connection.query(query, function(err) { }); 循环中你从左到右看,你不会在循环中使用此信息。内部循环只检查每个渲染器是否可见并将其添加到列表中,因此它们可能按照它们放在for集合中的顺序出现在输出列表中。

为了从左到右对对象进行排序,您应该计算它们的屏幕坐标,然后使用它们进行排序。要计算此值,您可以使用Camera.WorldToScreenPoint方法。我在这里找到了一些可能有用的建议:http://answers.unity3d.com/questions/49943/is-there-an-easy-way-to-get-on-screen-render-size.html

要对对象进行排序,您可以使用此处所述的renderers类:https://msdn.microsoft.com/en-us/library/ms132319(v=vs.110).aspx。 计算每个对象的屏幕坐标后,只需将其添加到列表中,屏幕上的X坐标作为键,列表将自动保持对象的排序。

答案 1 :(得分:0)

假设renderers是一个列表,您可以使用List.Sort方法并使用点积从左到右对对象进行排序。

我已经制作了一个可以在这里运行的脚本,试一试

    public System.Collections.Generic.List<Renderer> renderers ;

    private void Start()
    {
        var sortedRenderers = new System.Collections.Generic.List<Renderer>( renderers ) ;
        sortedRenderers.Sort( SortLeftToRight ) ;

        for( int i = 0 ; i < sortedRenderers.Count ; ++i )
            Debug.Log( sortedRenderers[i].name ) ;

    }
    private int SortLeftToRight( Renderer r1, Renderer r2 )
    {
        Transform camTransform = Camera.main.GetComponent<Transform>(); // You can optimize if you cache the transform of the camera
        Vector3 axis = camTransform.right ; 
        Transform t1 = r1.gameObject.GetComponent<Transform>();
        Transform t2 = r2.gameObject.GetComponent<Transform>();
        float dot1 = Vector3.Dot( axis, t1.position - camTransform.position );
        float dot2 = Vector3.Dot( axis, t2.position - camTransform.position );

        if( Mathf.Abs( dot1 - dot2 ) < 0.001f )
            return 0 ;

        return dot1 < dot2 ? -1 : 1 ;
    }

SortRenderers

有用的链接: