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

时间:2016-02-20 22:36:13

标签: c# unity3d navmesh

我有一个用户界面get_path(使用var glue = ' > ', // if you want a specific string separator, otherwise use false showIds = true; // if false names will be shown $('#tree').jstree().get_path(data.node, glue, showIds ) )。

但是,点击Button似乎点击到场景中(在我的情况下点击导航网格)。

如何解决这个问题?

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

UnityEngine.UI

如果我尝试这种方法

Button

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

似乎是一个基本问题,点击用户界面(if (Input.GetMouseButtonDown(0)) { 等)似乎落入了游戏过程。

3 个答案:

答案 0 :(得分:19)

以下是您今天在Unity中的使用方式:

  1. 当然,你在层次结构中会有一个EventSystem(当你添加一个Canvas时会自动获得其中一个;不可避免地每个场景都有一个)

  2. 在相机中添加物理raycaster (只需点击一下)

  3. 执行此操作:

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

    基本上 ,再次 基本 ,这就是它的全部内容。

    非常简单:这就是你在Unity中处理触摸的方式。这就是它的全部内容。

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

    看起来很简单,很容易。但是,做得好可能很复杂。

    (脚注:在Unity中做拖拽的一些恐怖:Horrors of OnPointerDown versus OnBeginDrag in Unity3D

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

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

    2. “当前'新'团结'......工作精美。非常简单,但难以以专业的方式使用。

    3. “即将到来的Unity”......大约在2025年,他们将实际工作并且易于使用。不要屏住呼吸。

    4. (情况与Unity的 UI 系统没有什么不同。起初,UI系统是可笑的。现在,它很棒,但以专家的方式使用有些复杂。截至2019年,它们是即将完全改变它。)

      (网络是一样的。起初它是完全垃圾。“新”网络非常好,但有一些非常糟糕的选择。就在最近2019年他们又改变了网络。)

      方便的相关提示!

      记住!如果您有一个全屏 不可见 面板,其中包含一些按钮。在全屏隐形面板上,您必须 关闭 光线投射!很容易忘记:

      enter image description here

      作为一个历史问题:这里是“忽略用户界面”的粗略准备快速解决方案,几年前你以前能够在Unity中使用 ......

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

      多年来你不能再这样做了。

答案 1 :(得分:0)

我也有这个问题,我找不到关于它的非常有用的信息,这对我有用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class SomeClickableObject : MonoBehaviour
{
    // keep reference to UI to detect for
    // for me this was a panel with some buttons
    public GameObject ui;

    void OnMouseDown()
    {
        if (!this.IsPointerOverUIObject())
        {
            // do normal OnMouseDown stuff
        }
    }

    private bool IsPointerOverUIObject()
    {
        // get current pointer position and raycast it
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        // check if the target is in the UI
        foreach (RaycastResult r in results) {
            bool isUIClick = r.gameObject.transform.IsChildOf(this.ui.transform); 
            if (isUIClick) {
                return true;
            }
        }
        return false;
    }
}

基本上,每次点击都会检查点击是否发生在UI目标上。

答案 2 :(得分:0)

不幸的是,第一个建议对我没有帮助,所以我只有五个所有面板标签“UIPanel”,当鼠标点击时检查当前是否有任何面板处于活动状态

    void Update()
    { if (Input.GetMouseButtonDown(0))
        {
            if (isPanelsOn()) 
            {}//doing nothing because panels is on
            else 
            {} //doing what we need to do
         }
}
public static bool isPanelsOn()
    {
        GameObject[] panels = GameObject.FindGameObjectsWithTag("UIPanel");
        foreach (var panel in panels)
        {
           if (panel.activeSelf)
            {
                return true; 
            }
        }
        return false;
    }