UI和统一立场

时间:2013-12-04 11:59:15

标签: c# unity3d

我有这个问题,我希望能够点击屏幕上的“图块”,然后应该在图块旁边显示一个弹出菜单。我可以点击图块,然后弹出一个菜单,但不是我想要的地方。

在图片here上,我点击了左上角的图片。

我放置图片的代码如下:

using UnityEngine;
using System.Collections;

public class TowerMenu : MonoBehaviour 
{
    bool showMenu = false;
    float x;
    float y;
    GUIStyle myStyle;

    public Texture2D[] towers;

    void OnGUI()
    {
        if(showMenu)
        {
            //Bear tower
            GUI.Button(new Rect(x + 10, y - 25, 50, 50), towers[0]);
            //Seal tower
            GUI.Button(new Rect(x + 10, y + 25, 50, 50), towers[1]);
        }
    }

    public void ShowMenu(Vector2 pos)
    {
        showMenu = true;
        x = pos.x;
        y = pos.y;
    }
}

希望有人能帮助我:)。

2 个答案:

答案 0 :(得分:1)

Sry,我不能发表评论,因为我没有足够的代表,这是对Steven Mills的评论和对该帖子的评论的评论。

第一个错误是因为你正在调用WorldToViewportPoint,就像它是一个静态成员函数那样(想想你是否有2个摄像头,你必须指定你想要的摄像头,阅读静态成员是什么意思在这里很有帮助)。你需要做的就是获取MainCamera的引用并从该实例调用该函数(最好的方法可能是使用公共变量并在编辑器中拖动脚本上的相机)

发生第二个错误是因为您尝试将Vector3提供给需要Vector2的ShowMenu()。第三个可能是编译器试图修复错误2的产物

这是一个逻辑错误,因为切片是GameObjects,因此transform.position是3d空间中的位置。你真正想要的是MainCamera屏幕上的2d像素位置。为此,您需要调用WorldToScreenPoint而不是WorldToViewportPoint。可悲的是,你会发现你也会在这里找到一个不是你想要的Vector3,但是你可以把x和y坐标作为你的像素屏幕坐标。 z坐标表示距摄像机的距离。

希望将它清理一下而不是让你感到困惑; D

请再次提问,但也尝试阅读Unity脚本参考,并尝试理解那里写的内容及其含义:)

答案 1 :(得分:0)

从它看来,你的ShowMenu方法正在接收一个(0,0)的pos,这就是为什么这两个按钮被放置在(10,-25)的位置和(10,25)。

没有看到代码调用ShowMenu我无法确定你给出的位置,但我的猜测是,tile属于父对象,而你传递的是本地位置而不是世界的位置。

如果您发布了致电ShowMenu的代码,我可以指出任何问题。

编辑:

根据评论中提供的信息,问题是位置需要在世界坐标和屏幕坐标之间进行转换:

void OnMouseDown()
        {
                if(state == State.water)
                {
                        errorHandler.sendError("You can't click on that");
                }

                if(state == State.ice)
                {
                        towerMenu.ShowMenu(camera.WorldToViewportPoint(this.transform.position));
                }
        }

并将ShowMenu更改为:

public void ShowMenu(Vector3 pos)
    {
        showMenu = true;
        x = pos.x;
        y = pos.y;
    }