2014-10-27 35 views
0

我有一個GameObject,它是在Unity 2D模式下在屏幕上創建的。遊戲對象上的GUI元素的本地和世界座標

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); 
    } 
} 

但是當我運行了統一的項目,在屏幕的左上角被創建,而不是正好覆蓋GameObjectGUI.Button。原因是因爲地方和世界座標的差異?

如何在遊戲對象上創建一個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仍定位在屏幕的左上角,而不是通過遊戲對象。我錯過了什麼?

回答

0

是的,GUI元素在視口座標中表示。 我會轉換從世界遊戲對象的座標系中的座標視口的,這樣說:

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

和,然後,將GUI按鈕,對於這些新的座標。希望這可以幫助。

+0

試過。問題依然存在。看到我更新的問題。 – Raptor 2014-10-27 10:24:55

1

在Unity GUI中,元素始終在屏幕空間中工作。這裏描述:http://docs.unity3d.com/Manual/gui-Basics.html位置所有UnityGUI控件在屏幕空間中工作,屏幕空間是發佈播放器的分辨率(以像素爲單位)。因此,無論您的GameObject放置在場景中,渲染的GUI都獨立於此。你也不需要在「2D模式」下創建遊戲對象。

正如0Andrea描述你可以使用一個攝像頭變換使用

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。

+0

優秀!我現在可以獲得世界排名,但是我怎樣才能將當地規模轉換爲世界規模? – Raptor 2014-10-27 10:48:05