【问题标题】:Unity3D: Two objects with the same scriptUnity3D:具有相同脚本的两个对象
【发布时间】:2012-05-13 16:27:35
【问题描述】:

我想将相同的脚本关联到我在游戏中用作占位符的不同空对象。目的是利用它们的位置,以便当用户触摸屏幕上的一个点,靠近这些对象之一时,会出现一个专用的 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;
    }
//...   
}
 //...
    }

【问题讨论】:

  • 统一标签适用于 Microsoft Unity。不要滥用它。

标签: unity3d


【解决方案1】:

这可能不起作用,因为您在 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");
}

这种方法很酷的一点是,我们正在检查 Collider 和射线之间的碰撞。如果您只想查看是否在 GameObject 附近单击,只需将 Collider 设置为大于 GameObject。没有必要搞乱不平等!

【讨论】:

  • 这看起来很有趣,谢谢。我一回家就试试看
  • 这正是我想要的。谢谢!
【解决方案2】:

如果您的目标是单击对象 靠近 的某个位置,而不仅仅是 对象,那么您有一些配置(这些对象在空间中的位置)是足够接近两个对象以使其 GUI 出现的空间,因此您需要一些脚本来确定哪个更接近。

我建议你实现一个monobehaviour that is a singleton 来跟踪这些点击并测量所有对象的距离,以获得最近的。

再次阅读您的帖子,我认为您只想在单击 at 对象时获得 GUI,而当您这样做时,您会获得两个 GUI。我认为这是因为错误计算了使check 变为true 的区域。

你能提供更多细节吗?是否有一些空间在单击时不应该有 GUI 消息,或者所有内容都被这些对象填充?

【讨论】:

  • 我已经验证了物体和触摸在两个不同的坐标系中。例如,虽然我触摸了对象,但我得到的对象是 (-0.77, 0.46),触摸是 (12.1,95.2),我猜是用像素测量的。如何将一个变成另一个?
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2022-11-18
  • 2020-03-28
  • 2018-05-22
  • 2022-01-18
相关资源
最近更新 更多