如何在Unity3D的OnDrawGizmos中以屏幕像素坐标绘制内容?

时间:2016-05-14 10:57:15

标签: c# unity3d

我想在MonoBehaviour中OnDrawGizmos的屏幕像素坐标中绘制一个矩形

public class Test : MonoBehaviour
{
   void OnDrawGizmos()
   {
       Rect rect = new Rect(10, 10, 150, 100);
       UnityEditor.Handles.DrawSolidRectangleWithOutline(rect, Color.black, Color.white);
   }
}

rect中的这些值最终会成为面向屏幕的世界空间坐标,相对于此脚本附加到Transform的{​​{1}}。

我想在屏幕上绘制像素,其中0,0是屏幕的左上角。我是否需要拿出相机并计算相对于当前GameObject变换的那些位置,还是有更简单的方法?

2 个答案:

答案 0 :(得分:2)

我遇到了完全相同的问题,我发现您只需添加Handles.BeginGUI();即可更改为屏幕坐标而不是世界坐标,您可以执行以下操作:

public class Test : MonoBehaviour
{
   void OnDrawGizmos()
   {
       Rect rect = new Rect(10, 10, 150, 100);
       UnityEditor.Handles.BeginGUI();
       UnityEditor.Handles.DrawSolidRectangleWithOutline(rect, Color.black, Color.white);
       UnityEditor.Handles.EndGUI();
   }
}

答案 1 :(得分:0)

所以这是 NOT 我正在寻找的解决方案。我想要的解决方案只是告诉Unity我想用2D绘制并开始使用GUIGUILayout函数,但是当我尝试使用它们时,我遇到了错误。也许某人有一个例子?

代替这里的一些代码来计算所需屏幕坐标的正确世界坐标

Vector3 ScreenToWorld(float x, float y) {
    Camera camera = Camera.current;
    Vector3 s = camera.WorldToScreenPoint(transform.position);
    return camera.ScreenToWorldPoint(new Vector3(x, camera.pixelHeight - y, s.z));
}

Rect ScreenRect(int x, int y, int w, int h) {
    Vector3 tl = ScreenToWorld(x, y);
    Vector3 br = ScreenToWorld(x + w, y + h);
    return new Rect(tl.x, tl.y, br.x - tl.x, br.y - tl.y);
}

因此,这似乎有效

public class Test : MonoBehaviour
{
   void OnDrawGizmos()
   {
       Rect rect = ScreenRect(10, 10, 150, 100);
       UnityEditor.Handles.DrawSolidRectangleWithOutline(rect, Color.black, Color.white);
   }

...