我有这个问题,我希望能够点击屏幕上的“图块”,然后应该在图块旁边显示一个弹出菜单。我可以点击图块,然后弹出一个菜单,但不是我想要的地方。
在图片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;
}
}
希望有人能帮助我:)。
答案 0 :(得分:1)
第一个错误是因为你正在调用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;
}