首页 文章

如何在Unity3D中触摸工作?

提问于
浏览
3

我正在使用Unity3D制作Android应用程序,它已经可以使用点击检测功能,但不能通过触摸进行操作 . 我需要触摸才能进行多点触控检测 .

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

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

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

2 回答

  • 2

    Klausar,你要找的是.........

    A BUTTON(!!!)

    就这么简单!

    • 点击“添加画布” . (您很可能希望“缩放到屏幕大小” - 选择该选项 . )

    • 点击“添加按钮” .

    • 没有“三”..去喝酒 .

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

    public void UserClickedRight()
     {
     Debug.Log("click right whoo!");
     }
    

    和左一样 . 在编辑器中转到右侧 Button . Just drag the script to it and select UserClickedRight. 如果您以前没有看过,可以在数以百万计的教程中解释这一点 . 这是Unity的绝对基本机制和范例 - 在编辑器中将某个脚本拖动到"slot" .

    难以置信的简单吧?!

    您不需要达到触摸处理水平即可实现此目的 .


    现在你问,“当按下按钮时”怎么样?

    这非常简单,您只需要了解Unity“事件”系统的一些事项 .

    请注意,在“按钮”中,Unity在“检查器”面板中“为您提供”指向“OnClick”的链接 .

    enter image description here

    你完全知道如何使用它,对吧?因此,为了方便起见,Unity将这一个“放在面板中”,因为您在大多数按钮上使用它 .

    好消息是 Buttonother terrific events, you can use .

    你问,这些其他令人敬畏的事件是什么?总是只是看看doco找出:http://docs.unity3d.com/ScriptReference/UI.Button.html

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

    再看一下这张图片......

    enter image description here

    重复一遍,Unity "give you" OnClick 就在编辑器中 .

    你可能会说"well, why aren't the others in there?"没有神秘感 - 只是 OnClick 被如此普遍地使用 . 在一两年内说,Unity发现每个人都一直使用 OnPointerDown ,每个人都总是大吼大叫,把它添加到那里 . 在这种情况下,他们可能会在那里添加它以方便使用 . 相反,你可以想象他们可能根本就没有把 OnClick 放在那里,也许是为了让那个面板更小 .

    这一点是 OnClickOnPointerDown 等等是 all events, just the same - 只是因为它发生了它们在那个面板上有"thrown in" OnClick ,因为它很受欢迎 .

    事实上,有些人会说这有点令人困惑:如果Unity没有把 OnClick 放在那里,那么你只是要解释一下,对吧?您必须执行以下操作,只是为了使用 OnClick ...看看我的意思?

    所以使用其他事件非常简单,你就是这样

    1,创建一个引用所需事件的脚本,

    和,

    2,你把那个脚本放在有问题的按钮上......

    就这么简单 .

    所以 . 您将使用Unity的事件系统,因此您必须这样做:

    using UnityEngine.EventSystems;
    

    下一个, . 你知道脚本通常会像这样开始......

    public class FancyButton:MonoBehaviour
    

    “MonoBehaviour”部分只是意味着它是一个c#脚本,它将“驱动一个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!")
      }
    }
    

    现在你所要做的就是 put that script on the Button . 这样做并给它一个测试 .

    所以不要忘了,事实上,你可以把它放在任何你喜欢的按钮上,让按钮按照这种方式工作 . (通常你有这样的脚本,你可以在项目中的每个按钮上放置,或者在预制件上放置 . )

    接下来,点击欧比旺,看看我们到目前为止的位置!

    enter image description here

    最后,听起来你想要“按下按钮时”做一些事情 . 这只是一个普通的编程问题 - 你有一个布尔值,当按钮上下移动时你可以打开和关闭它 . 我们开始做吧 .

    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,角色控制器......和音频 . 请享用!

  • 6

    你应该热心阅读this . 你要做的事实上很简单:

    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:添加了多点触控支持

相关问题