我在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
仍然位于屏幕的左上角,而不是游戏对象。我错过了什么?
答案 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按钮。希望这会有所帮助。