我在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;
}
但不幸的是,这不起作用。那我怎么能从左到右阅读所有物体呢?
答案 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 ;
}
有用的链接: