Unity怎么触发touch事件触发顺序

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
FingerGestures研究院之初探Unity手势操作(一)
FingerGestures研究院之初探Unity手势操作(一)
围观70594次
编辑日期: 字体:
昨天搬家,我被无情的从4楼请上了10楼。原因就是房东们为了争家产打官司,受伤的永远是我们这些打工的租房的码农,呵呵!结果就是我们两家做了一个调换把房子换了一下。东西太多了,真的好累啊,好累啊~~前几天有个朋友问我Unity手势操作,后来我还帮他做了一个例子。我觉得在Unity中用这个手势操作的插件会很方便。以前我只是知道FingerGestures,但是没有深入的用过,这两天学习了一下。真的很好用。
最近研究了一下Unity中的一个手势操作的插件FingerGestures。它能很方便监听到Unity中的各种手势事件:上下左右四方向的滑动事件、按下事件、抬起事件、移动事件、连击事件、长按事件等等。它同时支持触摸屏操作与鼠标操作,总起来说使用起来还是比较方便的,今天写下教程记录这个插件的详细使用步骤。首先下载这个插件,大家可以在圣典上找这个插件的下载地址,当然也可以在本文最后下载该插件。
我看了一下这个插件底层的实现步骤,他是通过C#代理的形式来实现手势操作的。如下图红圈内所示,这五个重要的预设用来监听触摸与鼠标的手势事件。包括:单手触摸事件、双手触摸事件、鼠标事件、触摸事件。这里我们使用一个单手的事件,如图中所示将Finger Gertures Initializer拖拽入左侧层次视图中。
OK,上面我们说了该插件是通过C#代理形式来接收事件消息的,所以我们需要用脚本来注册这些事件从而开始接收消息。接着创建一个立方体对象用以处理手势操作,当然你也可以处理游戏中的任何对象。编写脚本FingerEvent.cs ,把这个脚本挂在这个立方体对象之上。
FingerEvent.cs脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
using UnityEngine;using System.Collections;&public class FingerEvent :&&MonoBehaviour {&&&&&void OnEnable()&&&&{&&&& //启动时调用,这里开始注册手势操作的事件。&&&&& //按下事件: OnFingerDown就是按下事件监听的方法,这个名子可以由你来自定义。方法只能在本类中监听。下面所有的事件都一样!!!&&&&&&&&FingerGestures.OnFingerDown += OnFingerDown;&&&&&&&&//抬起事件
FingerGestures.OnFingerUp += OnFingerUp; &&&&//开始拖动事件 &&&&FingerGestures.OnFingerDragBegin += OnFingerDragBegin;&&&&&&&&//拖动中事件...&&&&&&&&FingerGestures.OnFingerDragMove += OnFingerDragMove;&&&&&&&&//拖动结束事件&&&&&&&&FingerGestures.OnFingerDragEnd += OnFingerDragEnd;
//上、下、左、右、四个方向的手势滑动
FingerGestures.OnFingerSwipe += OnFingerSwipe;
//连击事件 连续点击事件
FingerGestures.OnFingerTap += OnFingerTap;
//手指触摸屏幕中事件调用一下三个方法
FingerGestures.OnFingerStationaryBegin += OnFingerStationaryBegin;
FingerGestures.OnFingerStationary += OnFingerStationary;
FingerGestures.OnFingerStationaryEnd += OnFingerStationaryEnd;
//长按事件
FingerGestures.OnFingerLongPress += OnFingerLongPress;&&&&&}&&&&&void OnDisable()&&&&{&&&& //关闭时调用,这里销毁手势操作的事件&&&& //和上面一样&&&&&&&&FingerGestures.OnFingerDown -= OnFingerDown;
FingerGestures.OnFingerUp -= OnFingerUp;
FingerGestures.OnFingerDragBegin -= OnFingerDragBegin;&&&&&&&&FingerGestures.OnFingerDragMove -= OnFingerDragMove;&&&&&&&&FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;
FingerGestures.OnFingerSwipe -= OnFingerSwipe;
FingerGestures.OnFingerTap -= OnFingerTap;
FingerGestures.OnFingerStationaryBegin -= OnFingerStationaryBegin;
FingerGestures.OnFingerStationary -= OnFingerStationary;
FingerGestures.OnFingerStationaryEnd -= OnFingerStationaryEnd;
FingerGestures.OnFingerLongPress -= OnFingerLongPress;&&&&}&&&&&//按下时调用&&&&void OnFingerDown( int fingerIndex, Vector2 fingerPos )&&&&{
//int fingerIndex 是手指的ID 第一按下的手指就是 0 第二个按下的手指就是1。。。一次类推。
//Vector2 fingerPos 手指按下屏幕中的2D坐标&
//将2D坐标转换成3D坐标&&&&&&&&transform.position = GetWorldPos( fingerPos );
Debug.Log(" OnFingerDown ="&&+fingerPos);&&&&}& //抬起时调用 void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown ) {&
Debug.Log(" OnFingerUp ="&&+fingerPos); }& //开始滑动 void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )&&&&{&&
Debug.Log("OnFingerDragBegin fingerIndex =" + fingerIndex&&+ " fingerPos ="+fingerPos +"startPos =" +startPos);&&&&} //滑动结束 void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos ) {&
Debug.Log("OnFingerDragEnd fingerIndex =" + fingerIndex&&+ " fingerPos ="+fingerPos); } //滑动中&&&&void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )&&&&{&&&&&&&&&& transform.position = GetWorldPos( fingerPos );
Debug.Log(" OnFingerDragMove ="&&+fingerPos); &&&&&} //上下左右四方方向滑动手势操作 void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity )&&&&{
//结果是 Up Down Left Right 四个方向
Debug.Log("OnFingerSwipe " + direction + " with finger " + fingerIndex);&&&&&}& //连续按下事件, tapCount就是当前连续按下几次 void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount )&&&&{&&&&&&&&&Debug.Log("OnFingerTap " + tapCount + " times with finger " + fingerIndex);&&&&&}& //按下事件开始后调用,包括 开始 结束 持续中状态只到下次事件开始!&&&&&&&& //OnFingerStationary 事件和&&OnFingerDragMove 有一个区别。&&&&&&&& //OnFingerStationary 是手指触摸在屏幕中的事件,而OnFingerDragMove是先触摸一下然后滑动的事件。&&&&&&&& //如果你需要时时捕获手指触摸屏幕中的事件时 用OnFingerStationary 即可 void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos ) {&
Debug.Log("OnFingerStationaryBegin " + fingerPos + " times with finger " + fingerIndex); }& void OnFingerStationary( int fingerIndex, Vector2 fingerPos, float elapsedTime ) {&
Debug.Log("OnFingerStationary " + fingerPos + " times with finger " + fingerIndex);& }& void OnFingerStationaryEnd( int fingerIndex, Vector2 fingerPos, float elapsedTime ) {&
Debug.Log("OnFingerStationaryEnd " + fingerPos + " times with finger " + fingerIndex); }& //长按事件 void OnFingerLongPress( int fingerIndex, Vector2 fingerPos ) {&
Debug.Log("OnFingerLongPress " + fingerPos ); }& //把Unity屏幕坐标换算成3D坐标&&&&Vector3 GetWorldPos( Vector2 screenPos )&&&&{&&&&&&&&Camera mainCamera = Camera.main;&&&&&&&&return mainCamera.ScreenToWorldPoint( new Vector3( screenPos.x, screenPos.y, Mathf.Abs( transform.position.z - mainCamera.transform.position.z ) ) );&&&&}}
如下图所示,用鼠标还是IOS Android触摸事件都能很好的在这个Cube上响应,大家把我的代码手动的打一遍就什么都明白了。
上面的脚本,我们是直接绑定在立方体对象上来监听它,如果你想在别的脚本监听这个立方体对象的手势操作。只需调用如下方法即可。这个方法官方封装在了SampleBase中。因为官方的例子程序脚本是继承它的,所以子类就可以直接使用父类的方法。可是SampleBase会自动初始化一个SampleUI的脚本,不想初始化这个脚本的话直接用下面方法就行,原理就是通过射线我就不过多的解释了。传递鼠标或触摸的2D坐标即可得到触摸的3D模型对象。
1234567891011
&&&&// Return the GameObject at the given screen position, or null if no valid object was found&&&&public static GameObject PickObject( Vector2 screenPos )&&&&{&&&&&&&&Ray ray = Camera.main.ScreenPointToRay( screenPos );&&&&&&&&RaycastHit hit;&&&&&&&&&if( Physics.Raycast( ray, out hit ) )&&&&&&&&&&&&return hit.collider.gameObject;&&&&&&&&&return null;&&&&}
最后大家仔细看一下官方的FingerGestures.cs脚本,所有的手势操作的事件都在这里,包括单手操作事件、双手操作事件、鼠标操作事件。
插件以及源码下载地址:
雨松MOMO祝大家学习愉快,啦啦啦。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
UGUI研究院之判断鼠标或者手指是否点击在UI上(六)
UGUI研究院之判断鼠标或者手指是否点击在UI上(六)
围观77386次
编辑日期: 字体:
比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分。为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上。 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法。
123456789101112131415161718192021222324252627282930313233343536373839
#if UNITY_ANDROID && !UNITY_EDITOR#define ANDROID#endif&&#if UNITY_IPHONE && !UNITY_EDITOR#define IPHONE#endif&&&using UnityEngine;using UnityEngine.UI;using System.Collections;using UnityEngine.EventSystems;public class NewBehaviourScript : MonoBehaviour {& // Use this for initialization void Start () {
} & void Update() {
if (Input.GetMouseButtonDown(0)||(Input.touchCount &0 && Input.GetTouch(0).phase == TouchPhase.Began))
{#if IPHONE || ANDROID
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))#else
if (EventSystem.current.IsPointerOverGameObject())#endif
Debug.Log("当前触摸在UI上");
Debug.Log("当前没有触摸在UI上");
这段代码我在Android上已经测试通过。 哦 我用的是unity5.1
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity判断手势触摸的类型 判断手势的滑动方向 并获取刚触摸以及触摸结束事的坐标
我的图书馆
Unity判断手势触摸的类型 判断手势的滑动方向 并获取刚触摸以及触摸结束事的坐标
本章咱们一起来看下unity对有触摸手势做出的响应
Input.touchCount==1
Input.GetTouch(0).phase==TouchPhase.Moved
Input.touchCount & 1
判断两只手指至少有一只为移动触摸
Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved
* 判断是否为单点触摸
public static bool singleTouch()
if(Input.touchCount==1)
* 判断单点触摸条件下 是否为移动触摸
public static bool moveSingleTouch()
if (Input.GetTouch(0).phase==TouchPhase.Moved)
*判断是否为多点触摸
public static bool multipointTouch()
if (Input.touchCount & 1)
*判断两只手指至少有一只为移动触摸
public static bool moveMultiTouch()
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
* 新建一个公共方法用于判断手指的移动方向
* 假如是往左或者往上 则模型往各个轴的正方向位置移动 函数返回1
* 加入是往右或者往下 则模型往各个轴的负方向位置移动 函数返回-1
int judueFinger(){
if (Input.GetTouch(0).phase == TouchPhase.Began && startPosFlag == true)
//Debug.Log("======开始触摸=====");
startFingerPos = Input.GetTouch(0).
startPosFlag =
if (Input.GetTouch(0).phase == TouchPhase.Ended)
//Debug.Log("======释放触摸=====");
startPosFlag =
nowFingerPos = Input.GetTouch(0).
xMoveDistance = Mathf.Abs(nowFingerPos.x - startFingerPos.x);
yMoveDistance = Mathf.Abs(nowFingerPos.y - startFingerPos.y);
if (xMoveDistance&yMoveDistance)
if(nowFingerPos.x-startFingerPos.x&0){
//Debug.Log("=======沿着X轴负方向移动=====");
backValue = -1; //沿着X轴负方向移动
//Debug.Log("=======沿着X轴正方向移动=====");
backValue = 1; //沿着X轴正方向移动
if (nowFingerPos.y - startFingerPos.y&0)
//Debug.Log("=======沿着Y轴正方向移动=====");
backValue = 1; //沿着Y轴正方向移动
//Debug.Log("=======沿着Y轴负方向移动=====");
backValue = -1; //沿着Y轴负方向移动
return backV
TA的最新馆藏[转]&[转]&[转]&
喜欢该文的人也喜欢当前位置: >
Android触摸事件响应
时间: 09:43 来源:Unity之家 作者:unity.jb51.net 浏览:
我们来看下在手机上面实现多点触屏直接贴出代码详情://首先在start()函数里面允许多手指触屏
&&&&&&&&void&Start()&{&
&&&&&&&&&&&&&&&&&&//允许多点触屏
&&&&&&&&&&&&&&&&&Input.multiTouchEnabled=&
&&&&&&&&&}
//判断当前触摸屏幕的手指个数&该函数可自定义&然后在Update()里面调用&也可以直接在Update()里面写
&&&&&&&&if(Input.touchCount&&=&0)&{&&&&&&&&&&&&&&&&}
&&&&&&&&if(Input.touchCount&==&1)//一个手指触摸屏幕
&&&&&&&&&&&&&&&&{if(Input.touches[0].phase&==&TouchPhase.Began)//开始触屏
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_screenpos=Input.touches[0].//自定义的二维坐标向量&记录初始触屏位置
&&&&&&&&&&&&&&&&&&&&&&&&}else&if(Input.touches[0].phase&==&TouchPhase.Moved)//手指移动
&&&&&&&&&&&&&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//使物体旋转
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.transform.Rotate(new&Vector3(-Input.touches[0].deltaPosition.y*0.5f,Input.touches[0].deltaPosition.x*0.5f,0),Space.World);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&//当有多个手指触屏时&
&&&&&&&&else&if(Input.touchCount&&&1)//当有多个手指触屏&
&&&&&&&&&{
&&&&&&&&&&&&&&&&&//记录两个手指的位置&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&Vector2&finger1=&new&Vector2();
&&&&&&&&&&&&&&&&&&&&&&&&&Vector2&finger2=&new&Vector2();
&&&&&&&&&&&&&&&&&//记录两个手指的移动距离&
&&&&&&&&&&&&&&&&&&&&&&&&&Vector2&mov1=new&Vector2();
&&&&&&&&&&&&&&&&&&&&&&&&&Vector2&mov2=new&Vector2();
&&&&&&&&&&&&&&&&&for&(int&i=0;i&2;i++)//用循环来实现记录position
&&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&&Touch&touch&=&Input.touches[i];&[/i]//记录第0个、第1个触屏点的状态
&&&&&&&&&&&&&&&&&&&&&&&&&if(touch.phase&==&TouchPhase.Ended)&&//如果手指触屏之后离开就break
&&&&&&&&&&&&&&&&&&&&&&&&&if(touch.phase&==&TouchPhase.Moved)//&当手指移动时
&&&&&&&&&&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&float&mov&=0;&//&用来记录移动增量
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(i&==&0)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&finger1=touch.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mov1=touch.deltaP&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&finger2=touch.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mov2=touch.deltaP
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(finger1.x&&&finger2.x){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mov=mov1.x;&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}else&{&mov=mov2.x;&}//比较两个手指在x轴上移动的距离&取其较大者
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(finger1.y&finger2.y)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&mov+=mov1.y;&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else&{&mov+=mov2.y;&}//加上在y轴上移动的较大的增量
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Camera.main.transform.Translate(0,0,mov*Time.deltaTime);//移动相机&在z轴上变化&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&}
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity编程 ??????关于手机的Touch事件
&& & & & &用unity3d做了一个游戏,发布在IOS上的时候Touch事件很正常,可是发布到Android上,Touch事件会发送两次命令。请问是什么原因呀,由于游戏比较耗资源,在ios上正常运行,可是在Android上运行就会很卡,是不是因为卡的原因呢?(代码完全没有改过)。
要评论请先&或者&
把你touch那块的代码贴出来看看哦
用户被禁言,该主题自动屏蔽!
不好意思 &代码出了点小错误,现在改回来了,谢谢
请问楼主怎么改的,我也遇到这个问题了
请问楼主怎么改的,我也遇到这个问题了+1
:把你touch那块的代码贴出来看看哦 if (Input.touchCount & 0)&& & & & & &{&& & & & & & & &Touch th = Input.GetTouch(0);&& & & & & & & &if (th.phase == TouchPhase.Began)&& & & & & & & &{&& & & & & & & & & &Ray ray = Camera.main.ScreenPointToRay(th.position);&& & & & & & & & & &RaycastH&& & & & & & & & & &if (Physics.Raycast(ray, out hit, 100))&& & & & & & & & & &{&& & & & & & & & & & & &GameObject obj = hit.transform.gameO&& & & & & & & & & & & &if (obj.name == &entry-button&)&& & & & & & & & & & & &{&& & & & & & & & & & & & & &GameObject obj1 = GameObject.Find(&Label_password&);&& & & & & & & & & & & & & &lable_password = obj1.GetComponent&UILabel&();&& & & & & & & & & & & & & &obj1 = GameObject.Find(&Label_userName&);&& & & & & & & & & & & & & &lable_userName = obj1.GetComponent&UILabel&();&& & & & & & & & & & & & & &password = lable_password. && & & & & & & & & & & & & &userName = lable_userName. && & & & & & & & & & & & & &LoginToServer(password, userName);&& & & & & & & & & & & &}&& & & & & & & & & &}&& & & & & & & &}&& & & & & &}我是这么写的, LoginToServer总是执行两次,请问该怎么改呢?
:if (Input.touchCount & 0)&& & & & & &{&& & & & & & & &Touch th = Input.GetTouch(0);&& & & & & & & &if (th.phase == To... 额,找到问题了
:额,找到问题了 不该大于0吗?
:不该大于0吗? 我把脚本挂到了两个按钮上,结果点entry-button的时候就执行了两次

我要回帖

更多关于 js 触发touch事件 的文章

 

随机推荐