如何在Unity3D中触摸工作?

我正在使用Unity3D制作一个Android应用程序,它可以用于点击检测,但不能用于触摸。 我需要触摸才能进行多点触控检测。

我想要的是:我有我的播放器和2个箭头图像。 一个箭头指向右侧,一个指向左侧。 当我触摸左箭头时,玩家应该开始向左移动,当我触摸右箭头时,玩家应该开始向右移动。

但是如何检测触摸(并保持)哪个箭头? 我在Google上找到的所有代码都太旧了,不再有用了。

我正在使用C#脚本,这是一款2D游戏。

Klausar,你要找的是………

一个按钮 (!!!)

就这么简单!

  1. 单击“添加canvas”。 (您可能希望“缩放到屏幕大小” – 选择该选项。)

  2. 单击“添加按钮”。

  3. 没有“三”..去喝酒。

在你的代码中,有一个例程

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

正如您所看到的,有很多很棒的事件,比如OnPointerDownOnPointerUp 。 这就是你想要的。

再看一下这张图片……

在此处输入图像描述

重复一遍,Unity在编辑器中“给你” OnClick

你可能会说“好吧,为什么其他人不在那里?” 没有什么神秘感 – 只是OnClick被如此普遍使用。 说在一两年内Unity发现每个人都一直使用OnPointerDown ,而且每个人总是大吼大叫他们把它添加到那里。 在那种情况下,为了方便起见,他们可能会在那里添加它。 相反,你可以想象他们可能根本就没有打扰在那里放置OnClick ,也许是为了让那个面板更小。

关键是OnClickOnPointerDown所有事件都是一样的 – 只是因为它发生了它们在那个面板上“抛出” 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:添加了多点触控支持