首页 文章

如何让游戏玩法忽略Unity3D中UI按钮的点击?

提问于
浏览
6

我正在尝试创建一个3D点击以在Unity3D中移动游戏 .

我添加了一个UI Button (使用 UnityEngine.UI ),我希望最终点击以打开和关闭运行 .

但是,单击 Button 实际上似乎是 clicking through 到场景中(在我的情况下 NavMeshAgent 导航)并导致我的播放器移动到其他位置 .

如何禁用光线投射以单击UI按钮或以某种方式让UI捕获自己的事件?

我一直在使用典型的Unity3D代码让用户进入游戏玩法等

if (Input.GetMouseButtonDown(0))
  {

如果我尝试这种方法也一样

if( Input.touches.Length > 0 )
        {

        if ( Input.touches[0].phase == TouchPhase.Began )
            {

在iOS,Android和桌面上似乎就是这种情况 .

这似乎是一个基本的问题,点击UI( UnityEngine.UI.Button 等)似乎落入游戏玩法 .

1 回答

  • 16

    关于这个非常古老的问题:

    作为一个历史性的问题:这是一个粗略的准备好的快速修复,你在几年前的团结中......

    if (Input.GetMouseButtonDown(0)) { // doesn't really work...
      if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
          return;
      Bingo();
      }
    

    实际上,几年来你不能再这样做了 .


    撇开历史性的快速解决方案......

    以下是您今天在Unity中的表现:

    • 添加一个raycaster(只需点击一下),然后

    • 这样做:

    using UnityEngine.EventSystems;
      public class Gameplay:MonoBehaviour, IPointerDownHandler {
       public void OnPointerDown(PointerEventData eventData) {
        Bingo();
        }
       }
    

    Basically ,再次 basically ,这就是它的全部 .

    很简单:这就是你在Unity中处理触摸的方式 . 这里的所有都是它的 .

    添加一个raycaster,并拥有该代码 .

    它看起来很简单,而且很容易 . 但是,做得好可能很复杂 .


    (脚注1 - 完整详情:Horrors of OnPointerDown versus OnBeginDrag in Unity3D

    (脚注2 - 由于历史原因:如果链接仍然有效,这里是关于如何在Unity中进行"new"触摸的原始着名视频,从那时起:link,第3部分 . )


    Unity通过触摸技术的旅程非常吸引人:

    • “早期团结”......非常容易 . 完全没用 . 根本没用 .

    • “当前的'新'团结'......工作得很漂亮 . 非常简单,但难以以专业的方式使用 .

    • “即将来临的团结”......大约在2025年,他们将实际工作并且易于使用 . 不要屏住呼吸 .

    (情况与Unity的 UI 系统没有什么不同 . 起初,UI系统是可笑的 . 现在,它很棒,但以专家的方式使用有些复杂 . )


    方便的相关提示!

    记得!当你有一个全屏隐形面板,其中包含一些按钮 . 在全屏隐形面板本身,你必须 turn off 光线投射!这很容易忘记:

    enter image description here

相关问题