打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
unity

目标:判断滑动屏幕方向,只调用一次滑动事件处理函数

因为功能简单易懂,代码也比较简单,不再详细说明,参考官方API:http://docs.unity3d.com/ScriptReference/EventType.html

using UnityEngine;using System.Collections;public class Player : MonoBehaviour { enum slideVector { nullVector, left, right }; private Vector2 lastPos;//上一个位置 private Vector2 currentPos;//下一个位置 private slideVector currentVector = slideVector.nullVector;//当前滑动方向 private float timer;//时间计数器 public float offsetTime = 0.01f;//判断的时间间隔 // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI(){ if (Event.current.type == EventType.MouseDown) {//滑动开始 lastPos = Event.current.mousePosition; currentPos = Event.current.mousePosition; timer = 0; //TODO click event Debug.Log ('Click begin && Drag begin'); } if (Event.current.type == EventType.MouseDrag) {//滑动过程 currentPos = Event.current.mousePosition; timer = Time.deltaTime; if (timer > offsetTime) { if (currentPos.x < lastPos.x) { if (currentVector == slideVector.left) { return; } //TODO trun Left event currentVector = slideVector.left; Debug.Log ('Turn left'); } if (currentPos.x > lastPos.x) { if (currentVector == slideVector.right) { return; } //TODO trun right event currentVector = slideVector.right; Debug.Log ('Turn right'); } lastPos = currentPos; timer = 0; } } if (Event.current.type == EventType.MouseUp) {//滑动结束 currentVector = slideVector.nullVector; Debug.Log ('Click over && Drag over'); } }}

上次时间不多只写了一种方案,现在补充一下。

上方案可以实现目标功能,但是还有很多地方可以优化。

如:1:增加有效距离防止错误判断。2:功能可不可以在OnGUI上写(因为这样的话对于检测掌控不方便)。3:多样化判断。

为了解决以上问题,提出集中解决方法和优化方案。


首先,滑动判定的原理其实大家都懂,检测移动距离判定。我们只需要能检测到鼠标按下、鼠标按住、鼠标松开的三个状态即可。

一:使用Input.GetMouseButtonDown(0)

这种方法应该是我们最熟悉的,不多说直接上代码:

if (Input.GetMouseButtonDown (0)) { lastPos = Input.mousePosition; currentPos = Input.mousePosition; timer = 0; } if (Input.GetMouseButton (0)) { currentPos = Input.mousePosition; timer = Time.deltaTime; if (timer > offsetTime) { if (currentPos.x < lastPos.x) { if (currentVector == slideVector.left) { return; } //TODO trun Left event lastVector = slideVector.left; currentVector = slideVector.left; if (player != null) { player.AttackLeft (); } //Debug.Log ('Turn left'); } if (currentPos.x > lastPos.x) { if (currentVector == slideVector.right) { return; } //TODO trun right event lastVector = slideVector.right; currentVector = slideVector.right; if (player != null) { player.AttackRight (); } //Debug.Log ('Turn right'); } lastPos = currentPos; timer = 0; } } if (Input.GetMouseButtonUp (0)) { if (lastVector != slideVector.nullVector && currentVector == slideVector.nullVector) { if (lastVector == slideVector.left) { //TODO trun Left event //Debug.Log('click attack left '); player.AttackLeft(); } else { //Debug.Log('click attack right '); player.AttackRight(); } } currentVector = slideVector.nullVector; }


这种方法很好理解,可以直接运行或修改,跟上面的比增加了有效距离的判定,想要增加其他滑动检测在基础上简单修改即可。

说明:这种方法在Update中执行,开关检测需要用信号来实现。还有一种方式就是把检测放在协程里面,利用开关协程来开关检测。本方法是全屏的,不论是在控件上滑动还是在空白区域都生效。若不想在控件上生效,请自行做遮罩处理。


其他方法:利用UGUI的Event系统,UGUIEvent系统提供包括点击、按下、按住、移动、松开等多种与用户交互事件,只需要实现他们的函数接口便能实现对应效果,而且种类很多,读者可以试一试。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
大中小字体 双击滚屏功能
只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!
[原创]网页滚屏特效全攻略
Unity3d中使用鼠标拖动物体移动
C#使用System.Timers.Timer类实现一个Button锁定功能(windows form)
Unity 中初始化挂载组建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服