游戏对象上GUI元素的局部和世界坐标

时间:2014-10-27 10:03:47

标签: c# unity3d

我在Unity 2D模式下在屏幕上创建了GameObject

GameObject的坐标是(3, 3)。在附加到GameObject的脚本中,我有以下OnGUI()方法:

void OnGUI() {
    if(GUI.Button(new Rect(renderer.bounds.min.x, renderer.bounds.min.y, renderer.bounds.max.x, renderer.bounds.max.y), "")) {
        Debug.Log ("My Position: " +  this.transform.position.x + ", " + this.transform.position.y);
    }
}

但是当我运行Unity项目时,屏幕左上角会创建GUI.Button,而不是完全覆盖GameObject。是因为当地和世界坐标的差异?

如何在游戏对象上创建GUI.Button()


更新:在阅读@ 0Andrea的回答后,我更新了代码。问题依然存在:

private Vector3 worldPos;

void Start () {
    worldPos = Camera.main.WorldToViewportPoint(gameObject.transform.position);
}

void OnGUI() {
    if(GUI.Button(new Rect(worldPos.x, worldPos.y, 1, 1), "")) {
        Debug.Log ("My Position: " +  this.transform.position.x + ", " + this.transform.position.y);
    }
}

GUI.Button仍然位于屏幕的左上角,而不是游戏对象。我错过了什么?

2 个答案:

答案 0 :(得分:1)

在Unity GUI中,元素始终在屏幕空间中工作。这里描述了:http://docs.unity3d.com/Manual/gui-Basics.html位置下:所有UnityGUI控件都在屏幕空间中工作,这是已发布播放器的分辨率(以像素为单位)。所以它没有将GameObject放置在场景中的位置,渲染的GUI与其无关。此外,您无需在“2D模式”下创建GameObject。

如0Andrea所述,您可以使用相机变换通过使用

来计算屏幕空间中GameObject的坐标
Vector3 screenPos = camera.WorldToScreenPoint(target.position);

(而不是 WorldToViewportPoint )。

Unity 4.6将与另一个名为uGUI的新GUI系统一起发布。使用此系统,您将能够在世界空间中创建GUI元素。 http://blogs.unity3d.com/2014/05/28/overview-of-the-new-ui-system/。如果您迫切需要这样的系统,可以在资产商店购买NoesisGUI或NGUI。

答案 1 :(得分:0)

是的,GUI元素以视口坐标表示。 我会将gameObject的坐标系从世界坐标转换为视口坐标系,这样:

Vector3 viewPos = camera.WorldToViewportPoint(gameObject.transform.position);

然后,根据这些新坐标放置GUI按钮。希望这会有所帮助。