【问题标题】:Unity - Check if mouse click was inside of a rect transformUnity - 检查鼠标点击是否在矩形变换内
【发布时间】:2018-01-28 21:09:44
【问题描述】:

我试图确定鼠标点击是否在矩形变换内。

用户每次点击屏幕,都会抛出一个球。但是如果用户点击暂停按钮,则不应抛出任何球。

我试图用这段代码来解决,但似乎只能识别矩形变换的右上角。这是一个展示实际问题的短视频:https://youtu.be/gdyDBK6ubgo

这里是sn-p的代码:

void Update() {
     //Check if user touch on display / click mouse button 
     Vector2 mousePos = new Vector3(Screen.width - Input.mousePosition.x,Screen.height - Input.mousePosition.y, 0); 
     if (Input.GetMouseButtonDown(0) && props.throwable && !checkCollisionWithPauseButton(mousePos) && props.remainingBalls > 0)
     {
         fireBall(Input.mousePosition);
     }
 }

 bool checkCollisionWithPauseButton(Vector3 mousePos){
     //TODO: This does not work very well
     return pauseButton.GetComponent<RectTransform>().rect.Contains (mousePos); 
 }

这是一个screenshot,它显示了矩形变换。

【问题讨论】:

  • 你为什么不直接使用它应该工作的事件系统呢? docs.unity3d.com/ScriptReference/…
  • 非常感谢 - 我不知道这种方法!但是知道为什么这不会像预期的那样工作吗?
  • 不用多想,我认为它与Input.mousePosition 已经在屏幕空间中有关。尝试将您与Debug.Log(string) 比较的所有计算和值输出到控制台并查看您得到的结果。您可能能够自己得出结论。
  • 请不要发布指向图像托管网页的链接,这些网页会强制停用添加阻止程序...而是将图像直接上传到您的问题。

标签: c# user-interface unity3d


【解决方案1】:

使用 RectTransformUtility.RectangleContainsScreenPoint 检查鼠标指针是否在 Rect Transform 中。无论 rectTransform 位于本地的什么位置,这都会起作用。

public RectTransform rectTransform;

...

Vector2 mousePos = Input.mousePosition;
RectTransformUtility.RectangleContainsScreenPoint(rectTransform, mousePos);

【讨论】:

    【解决方案2】:

    这些都不适用于我的情况。这是我最终做的:

    public RectTransform rectTransform;
    
    ...
    
    Vector2 lp;
    Vector2 mousePos = Input.mousePosition;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, mousePos, Camera.main, out lp);
    
    if (rectTransform.rect.Contains(lp))
        ..ect
    

    【讨论】:

      【解决方案3】:

      它不起作用,因为您正在执行一些不必要的工作。你不需要这一行:

      Vector2 mousePos = new Vector3(Screen.width - Input.mousePosition.x,Screen.height - Input.mousePosition.y, 0); 
      

      只需将Input.mousePosition 传递给Rect.Contains 函数,就可以了。

      Vector2 mousePos = Input.mousePosition;
      pauseButton.GetComponent<RectTransform>().rect.Contains (mousePos);
      

      尽管这可能有效,但这并不是正确检测 UI 或 GameObjects 上的点击的方法。 EventSystems 用于此目的。例如,请参阅this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多