最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity easytouch教程下载
本文旨在分享Unity EasyTouch的使用方法,内容详细且包含代码示例,大家可以仔细学习。
一、EasyTouch与NGUI结合概述
在使用EasyTouch插件一段时间后,发现虽存在一些小问题,但总体使用体验尚可。接下来着重介绍EasyTouch和NGUI的结合使用情况。
在触摸屏幕时,通常存在三种情况:
- 触摸事件仅响应NGUI部分,不响应3D部分。
- 触摸事件仅响应3D部分,不响应NGUI部分。
- 触摸事件同时响应NGUI和3D部分。
以战斗场景为例,我们期望通过手指滑动来控制摄像机旋转。但此时屏幕上可能存在一些UI按钮,我们不希望用户点击UI按钮影响摄像机旋转,所以希望触摸事件仅在3D部分响应。
二、触摸事件仅响应NGUI部分的实现
示例场景
如下图所示(此处未提供图片,可根据实际情况补充),增加了一个UISprite,期望手指触摸事件仅在UI上响应,不在3D上响应。
代码实现
using System.Collections;
public class UImomo : MonoBehaviour {
// 头像
GameObject icon;
void Start () {
icon = transform.Find("icon").gameObject;
// 添加一个手指滑动的事件
EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd;
}
void OnDestroy() {
// 释放一个手指滑动的事件
EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
}
// 当手指滑动结束时在这里处理
void EasyTouch_On_SwipeEnd(Gesture gesture) {
// 判断手指是否触摸在NGUI的头像中
if(gesture.IsStartInRect(NGUIObjectToRect(icon))) {
// 输出手指滑动的方向
Debug.Log(gesture.swipe);
}
}
// 计算出NGUI某个UISprite或者UITexture或者UILabel在屏幕中占的矩形位置
private Rect NGUIObjectToRect(GameObject go) {
Camera camera = NGUITools.FindCameraForLayer(go.layer);
Bounds bounds = NGUIMath.CalculateAbsoluteWidgetBounds(go.transform);
Vector3 min = camera.WorldToScreenPoint(bounds.min);
Vector3 max = camera.WorldToScreenPoint(bounds.max);
return new Rect(min.x, min.y, max.x - min.x, max.y - min.y);
}
}
三、触摸事件仅响应3D部分,不响应NGUI部分的实现
应用场景
这种情况更多应用于游戏的战斗界面,战斗界面的UI一般集中在屏幕的四个角,如头像、小地图、技能、摇杆等。EasyTouch提供了NGUI模式,可方便解决此问题,其原理是用射线来判断,所以要确保需要略过的UI空间有BoxCollider组件。
实现步骤
将所有NGUI做的界面放在UI层上面,对代码进行简单修改,使EasyTouch不在UI层上响应。
代码实现
void Start () {
icon = transform.Find("icon").gameObject;
// 添加一个手指滑动的事件
EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd;
// 得到UI摄像机
Camera uiCamera = GameObject.Find("UI Root/Camera").GetComponent<Camera>();
if(uiCamera != null) {
// 启动NGUI模式
EasyTouch.instance.enabledNGuiMode = true;
// 把NGUI摄像机加入过滤队列
if(!EasyTouch.instance.nGUICameras.Contains(uiCamera)) {
EasyTouch.instance.nGUICameras.Add(uiCamera);
}
// 设置需要过滤的UI层
EasyTouch.instance.nGUILayers = (1 << LayerMask.NameToLayer("UI"));
}
}
void OnDestroy() {
// 释放一个手指滑动的事件
EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
// 释放相关设置
EasyTouch.instance.enabledNGuiMode = false;
EasyTouch.instance.nGUILayers = 0;
EasyTouch.instance.nGUICameras.Clear();
}
四、版本问题及解决方法
目前使用的EasyTouch版本为v3.1.1,由于项目比较稳定,不敢轻易升级。该版本存在一个BUG,即超过10只手指在屏幕中滑动会出现空指针的错误。通过查看代码,在UpdateTouches里面做一下判断即可解决该问题。
五、总结与交流
EasyTouch拥有强大的事件回调方法,大家可以去它的官网上查询详细信息。如果你知道有比EasyTouch更好用的触屏插件,欢迎在下方留言分享。