我想将相同的脚本关联到我刚用作游戏中占位符的不同空对象。目的是利用它们的位置,以便当用户触摸屏幕中的一个点,接近这些对象之一时,会出现专用的GUI。问题是虽然这两个对象是不同的,但它们的脚本似乎相互影响,所以当游戏运行时我触摸这两个对象中的一个时,gui就出现了。我做错了什么?
....
private var check: boolean;
var topCamera : Camera;
var customSkin : GUISkin;
function Update () {
if (Input.GetMouseButtonDown(0)){
if(Input.mousePosition.x > this.transform.position.x - Screen.width*0.20 && Input.mousePosition.x < this.transform.position.x + Screen.width*20){
if(Input.mousePosition.y > this.transform.position.y - Screen.height*0.2 && Input.mousePosition.y < this.transform.position.y + Screen.height*0.2){
check = true;
}
}
}
if(check){
//the camera zooms forward
}else{
//the camera zooms backward
}
}
function OnGUI () {
if (this.check){
var w = Screen.width;
var h = Screen.height;
var bw = 0.083;
var bws = 0.001 *w;
GUI.skin = customSkin;
GUI.Box(new Rect(w*0.6,h*0.3,w*0.38,h*0.45), "Stuff");
customSkin.box.fontSize = 0.04*h;
customSkin.textField.fontSize = 0.08*h;
customSkin.button.fontSize = 0.04*h;
textFieldString = GUI.TextField (Rect (w*0.62, h*0.39, w*0.34, h*0.1), textFieldString);
if (GUI.Button (Rect (w*0.62,h*0.50, w*bw, h*0.1), "+")) {
if (this.check){
this.check=false;
}else{
this.check = true;
}
//...
}
//...
}
答案 0 :(得分:2)
这可能不起作用,因为您在Update()
函数中比较苹果和橙子。 Input.mousePosition
返回2D pixel 坐标中的位置,transform.position
返回GameObject在3D world 坐标中的位置。
要检查是否单击了某个对象,您需要将Collider附加到相关游戏对象,并使用脚本中的Raycast测试碰撞。以下是JavaScript文档中的相关示例:
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, 100)) {
print ("Hit something");
}
这种方法很酷的是我们正在检查对撞机和射线之间的碰撞。如果您只想查看是否在GameObject附近单击,只需使Collider大于GameObject。不需要搞乱不平等!
答案 1 :(得分:0)
如果你的目标是点击 close 到某个对象,而不仅仅是 at 该对象,那么你有一些配置(那些对象在空间中的位置)那里是两个对象足够接近它们的GUI出现的空间,因此你需要一些脚本来决定哪一个更接近。
我建议您实施monobehaviour that is a singleton来跟踪这些点击次数并测量所有对象的距离,以获得最接近的数据。
再次阅读你的帖子,我想你只需要在对象上点击就可以获得GUI,当你这样做时,你会得到两个GUI。我认为这种情况正在发生,因为错误地计算了使check
成为true
的区域。
你能提供更多细节吗?是否存在某些空间,单击时不应该有GUI消息,或者这些对象是否填充了所有内容?