如何在Unity3D中触摸工作?
我正在使用Unity3D制作一个Android应用程序,它可以用于点击检测,但不能用于触摸。 我需要触摸才能进行多点触控检测。
我想要的是:我有我的播放器和2个箭头图像。 一个箭头指向右侧,一个指向左侧。 当我触摸左箭头时,玩家应该开始向左移动,当我触摸右箭头时,玩家应该开始向右移动。
但是如何检测触摸(并保持)哪个箭头? 我在Google上找到的所有代码都太旧了,不再有用了。
我正在使用C#脚本,这是一款2D游戏。
Klausar,你要找的是………
一个按钮 (!!!)
就这么简单!
-
单击“添加canvas”。 (您可能希望“缩放到屏幕大小” – 选择该选项。)
-
单击“添加按钮”。
-
没有“三”..去喝酒。
在你的代码中,有一个例程
public void UserClickedRight() { Debug.Log("click right whoo!"); }
和左一样。 在编辑器中转到右侧的Button
。 只需将脚本拖到它并选择UserClickedRight
。 如果您以前没有看过,可以在数百万个教程中解释这一点。 这是Unity的绝对基本机制和范例 – 在编辑器中将某个脚本拖到“插槽”中。
难以置信的简单吧?!
您不需要达到触摸处理水平即可实现此目的。
现在你问,“当按下按钮时”怎么样?
这非常简单,你只需要了解Unity“事件”系统的一些事情。
请注意,在“按钮”中,Unity会在“检查器”面板中“为您提供”指向“OnClick”的链接。
你完全知道如何使用它,对吧? 因此,为了方便起见,Unity将这一个“放在面板中”,因为您在大多数按钮上使用它。
好消息是Button
有其他可怕的事件,你可以使用 。
你问,这些其他令人敬畏的事件是什么? 总是只需看看doco就可以找到: http : //docs.unity3d.com/ScriptReference/UI.Button.html
正如您所看到的,有很多很棒的事件,比如OnPointerDown
和OnPointerUp
。 这就是你想要的。
再看一下这张图片……
重复一遍,Unity在编辑器中“给你” OnClick
。
你可能会说“好吧,为什么其他人不在那里?” 没有什么神秘感 – 只是OnClick
被如此普遍使用。 说在一两年内Unity发现每个人都一直使用OnPointerDown
,而且每个人总是大吼大叫他们把它添加到那里。 在那种情况下,为了方便起见,他们可能会在那里添加它。 相反,你可以想象他们可能根本就没有打扰在那里放置OnClick
,也许是为了让那个面板更小。
关键是OnClick
, OnPointerDown
等所有事件都是一样的 – 只是因为它发生了它们在那个面板上“抛出” OnClick
,因为它很受欢迎。
事实上,有些人会说这有点令人困惑:如果Unity没有将OnClick
放在那里,你必须学习我刚要解释的内容,对吧? 您必须执行以下操作,只是为了使用OnClick
…看看我的意思?
所以使用其他事件非常简单,你就是这样
1,制作一个引用你想要的事件的脚本,
和,
2,你把那个脚本放在有问题的按钮上……
就这么简单。
所以。 您将使用Unity的事件系统,因此您必须这样做:
using UnityEngine.EventSystems;
下一个,。 你知道脚本通常会像这样开始……
public class FancyButton:MonoBehaviour
“MonoBehaviour”部分只是意味着它的ac#脚本将是“驱动GamObject”,它将是“GameObject的一部分”。 但在这种情况下,我们必须进一步警告引擎您将使用向下和向上点击事件。 所以你加上这个。
,IPointerDownHandler,IPointerUpHandler
所以。 到目前为止,我们有这个
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler {
现在很容易的部分。 您只需键入Unity将在事情发生时为您运行的两个例程。
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler { public void OnPointerDown(PointerEventData data) { Debug.Log("holy! someone clicked down!") } public void OnPointerUp(PointerEventData data) { Debug.Log("whoa! someone clicked up!") } }
现在你要做的就是把那个脚本放在Button上 。 这样做并给它一个测试。
所以不要忘记将该脚本放在有问题的按钮上。 并且不要忘记,实际上,您可以将它放在任何您喜欢的按钮上 ,以使该按钮以这种方式工作。 (通常你有一个这样的脚本,你可以在项目中的每个按钮上放置,或者在预制件上放置。)
接下来,点击欧比旺,看看我们到目前为止的位置!
最后,听起来你想做什么“按下按钮时”。 这只是一个普通的编程问题 – 你有一个布尔值,当按钮上下移动时你可以打开和关闭它。 我们开始做吧。
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler { [System.NonSerialized] public bool mouseIsDownRightNow; public void OnPointerDown(PointerEventData data) { mouseIsDownRightNow = true; } public void OnPointerUp(PointerEventData data) { mouseIsDownRightNow = false; } }
您可以从另一个脚本或任何您想要的任何脚本访问该变量。
如果要在按钮关闭时运行例程,请添加以下内容:
void Update() { if (buttonIsDownRightNow) WhileButtonIsDown(); } private void WhileButtonIsDown() { Debug.Log("THE #$@#$ BUTTON IS DOWN!!!!!!!! WHOA!"); }
在按住向下和向上按钮的同时尝试并观察控制台。
以下是按钮关闭时不断增加值的示例:
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler { [System.NonSerialized] public bool buttonIsDownRightNow; private int countSomething; public void OnPointerDown(PointerEventData data) { buttonIsDownRightNow = true; } public void OnPointerUp(PointerEventData data) { buttonIsDownRightNow = false; } private void WhileButtonIsDown() { ++countSomething; } void Update() { if (buttonIsDownRightNow) WhileButtonIsDown(); Debug.Log("value is now " +countSomething.ToString()); } }
这里的所有都是它的。 一旦你真正了解Unity中的事件,就没有更多的东西需要理解。
唯一的其他重要主题是Mecanim,着色器书写,触摸,协同程序,线程,PhysX,原生插件,精灵,网络,动态网格,导航,VR,AR,动画,反向运动学,粒子,地形,IAP,照明,烘焙,阴影,MMP,角色控制器……和音频。 请享用!
你应该好好读这个 。 你要做的事实上很简单:
foreach (Touch touch in Input.touches) { if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary) if (guiTexture1.HitTest(touch.position)) { // Maybe move left } if (guiTexture2.HitTest(touch.position)) { // Maybe move right } } }
编辑1:此代码现在检查正在按下哪个图像
编辑2:添加了多点触控支持