我想在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变换的那些位置,还是有更简单的方法?
答案 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绘制并开始使用GUI
,GUILayout
函数,但是当我尝试使用它们时,我遇到了错误。也许某人有一个例子?
代替这里的一些代码来计算所需屏幕坐标的正确世界坐标
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);
}
...