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)
但不幸的是,这不起作用.那我怎么能从左到右阅读所有物体呢?
我不使用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 坐标为键的列表中,列表就会自动保持对象的顺序。