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系统提供包括点击、按下、按住、移动、松开等多种与用户交互事件,只需要实现他们的函数接口便能实现对应效果,而且种类很多,读者可以试一试。

发布了14 篇原创文章 · 获赞 10 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览