从左到右读取对象

Vik*_*ria 5 c# unity-game-engine

我在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;
}
Run Code Online (Sandbox Code Playgroud)

并通过以下方式创建循环:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*z M 2

我不使用Unity,如果我遗漏了一些东西,很抱歉,但似乎虽然在外for循环中你从左到右看,但你在循环内没有使用这些信息。内部循环仅检查每个渲染器是否可见并将其添加到列表中,因此它们可能按照放入集合中的顺序出现在输出列表中renderers

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

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