我有一个用户界面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))
{
等)似乎落入了游戏过程。
答案 0 :(得分:19)
当然,你在层次结构中会有一个EventSystem
(当你添加一个Canvas时会自动获得其中一个;不可避免地每个场景都有一个)
在相机中添加物理raycaster (只需点击一下)
执行此操作:
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通过触摸技术的旅程非常吸引人:
“早期团结”......非常容易。完全没用。根本没用。
“当前'新'团结'......工作精美。非常简单,但难以以专业的方式使用。
“即将到来的Unity”......大约在2025年,他们将实际工作并且易于使用。不要屏住呼吸。
(情况与Unity的 UI 系统没有什么不同。起初,UI系统是可笑的。现在,它很棒,但以专家的方式使用有些复杂。截至2019年,它们是即将完全改变它。)
(网络是一样的。起初它是完全垃圾。“新”网络非常好,但有一些非常糟糕的选择。就在最近2019年他们又改变了网络。)
方便的相关提示!
记住!如果您有一个全屏 不可见 面板,其中包含一些按钮。在全屏隐形面板上,您必须 关闭 光线投射!很容易忘记:
作为一个历史问题:这里是“忽略用户界面”的粗略准备快速解决方案,几年前你以前能够在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;
}