用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行。这篇文章我就来说说EasyTouch和NGUI的结合。
总体来说触摸屏幕也就三种情况。
1.触摸事件只响应NGUI部分,不响应3D部分。
2.触摸事件只响应3D部分,不响应NGUI部分。
3.触摸事件同时响应。
举个例子,在战斗场景我们希望通过手指滑动来控制摄像机的旋转。但是这时屏幕上可能还有一些UI的按钮,但是我们不希望用户点击UI按钮也影响到了摄像机的旋转。所以此时我们只希望触摸事件在3D部分响应。
1. 如下图所示,这里我增加了一个UISprite,我希望我的手指触摸事件只在UI上响应,不在3D上响应
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using UnityEngine; 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); } } |
2.我希望手指触摸只响应3D,不响应NGUI 。这里其实更多的运用于游戏的战斗界面,战斗界面的UI一般都集中在屏幕的四个角, 比如头像 小地图 技能 摇杆等等。EasyTouch提供了NGUI模式,可以很方便的解决这个问题,不过它原理也是用射线来判断,所以你要确保需要略过的UI空间有BoxCollider组件。
我们把所有NGUI做的界面放在UI层上面。代码简单的改改,这样EasyTouch就不会在UI层上响应了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 因为目前项目也比较稳定,所以也不敢升级。EasyTouch这个版本里有一个BUG。就是超过10只手指在屏幕中滑动会出现空指针的错误,后来我看了一下代码,在UpdateTouches 里面做一下判断就好了。
EasyTouch有很强大的事件回调方法,大家可以去它的官网上查一下。不知道现在还有没有更好用的触屏插件,如果你觉得比EasyTouch还好用的话,希望你在下面给我留言,谢谢。
- 本文固定链接: https://www.xuanyusong.com/archives/2948
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
有人有easytouch插件的下载地址吗。
我没有用插件,但是在安卓手机上手势总是有灵有时不灵,求问大神有没有好的方法推荐下
我已经放弃easytouch了。 手势操作都自己重写了。。
大神,求指导啊,我是用的input.touch自己写的,在iOS设备上完全OK,但是在安卓手机上,就特别的不对劲,时灵时不灵的
请问你的是十点以内触控移动的例子吗?现在问题解决了吗?
我现在用的3.0.1,人家项目,已经很多实现,暂时无发现什么BUG
我现在已经抛弃easytouch了。不太想用插件了。。
请问我用了easytouch3.1插件做了摇杆和按钮,并且在unity3d中测试有摇杆和按钮,也好使。但是导出为APK文件后,在手机上测试怎么没有看见摇杆和按钮啊?
你下面那个相应u3d的脚本是单独写出来的还是,跟相应ui的脚本一起的,我单独列出的一个相应u3d的脚本,但是还能相应ui的,代码跟你的相应u3d的一样,问题处在何处,求大神解救
问一下 如果有两个摇杆,只可以按一个怎么办。。。还有只可以按一个button
找不到 gesture.IsStartInRect() 这个函数
在WP8.1上,触控有冲突呢
我也是这样的,不知道大哥解决没
请问博主EasyTouch怎么作匀速运动啊?
FingerGesture
请教一个问题 easy touch的button 下 我还放了一个GUI. Button 现在我把鼠标放在touch button 下 怎么才能让让他下边的GUI. button不响应hover
大大,我想使用easytouch做摇杆,用ngui做技能,并带有技能冷却,现在遇到的问题是,当我按住摇杆向前跑的时候,点击技能(ngui),那个摇杆就会卡在之前的位置上,不管我怎么摇都滑不动,除非我放开手,重新按摇杆,才会回到正常,这导致我在移动过程中,发完技能就不得不松手,不知道咋解决~~~~~~
这个问题解决了吗?我也很恼火这个问题不知道怎么解决,求指导。。。。。
这个问题是因为EASY TOUCH在触发OnLongTouchStart之后就不会触发OnStartSwipe了,所以要不把long touch时间拉长避免触发,要不在OnTouchDown里面处理Swipe
具体怎么设置呢?比如在OnTouchDown里怎么处理OnStartSwipe?是重新激活OnStartSwip?
1.在场景里有个EASY TOUCH的对象,你把long tap time设置成99999,那么就不会触发longtap,永远都会响应swipe2.把响应swipe的逻辑写在响应OnTouchDown的方法里
不胜感激
我貌似解决了, 我重写ETCJoystick的OnDrag函数,在开头的地方判断touchCount是否大于1,大于1则代表此时可能按下NGUI按钮,然后return,thumb就不会因为按钮按下而改变位置
接触u3d就一直看你的帖子,现在在做一个设计游戏,需要用虚拟摇杆(用的就是easytouch)控制准心,现在虚拟摇杆已经做好了,但是NGUI做的射击按钮不能和摇杆同时触发,先按摇杆的话,所有NGUI的button全部不能触摸。先按下NGUI的射击按钮,再按摇杆就可以同时响应…刚学习不多久,这个问题目前困住了我,还请momo帮忙解答下!
勾选了兼容NGUI,也做了区域判断…都无济于事~~
已经搞定!
哥们,咋搞定的~
//添加手指按下和弹起的事件。EasyTouch.On_TouchDown += EasyTouch_On_TouchDown;EasyTouch.On_TouchUp += EasyTouch_On_TouchUp;//判断手指是否触摸在NGUI的按钮上if(gesture.IsInRect(NGUIObjectToRect(GunFireButton)))我是用这样的方法解决的…不是很好,我还在等待雨松大大回复……
比如左手还在摇杆上控制方向呢,右手点击了NGUI的技能button,这时左手的摇杆就不起作用了,怎么旋转都不动,你判断触摸也是右手的NGUI技能按钮,怎么才能触发摇杆继续能控制方向呢?急求。。。。
//添加手指按下和弹起的事件。EasyTouch.On_TouchDown = EasyTouch_On_TouchDown;EasyTouch.On_TouchUp = EasyTouch_On_TouchUp;//判断手指是否触摸在NGUI的按钮上if(gesture.IsInRect(NGUIObjectToRect(GunFireButton)))我是用这样的方法解决的…不是很好,我还在等待雨松大大回复……
雨松大大,能把镜头转换代码贴下么。搞不懂镜头杂转换啊!!!!
请教一个问题,用EasyTouch的时候,在电脑上没问题,但手机上的时候,摇杆中心那个圆球经常卡在边界上不懂,然后这时候角色的移动就会失控,这是咋回事儿
你用的是EasyTouch3.1.1么?我知道这个问题,这是Easytouch的一个bug,电脑上可以重现的,你动摇杆的时候,按住ctrl,拖动鼠标,电脑上会报错,可以通过修改Easytouch源文件临时修复这个bug,http://forum.unity3d.com/threads/released-easy-touch.135192/page-13#post-1400790,这个网址上面有,Easytouch制作团队回复的。
嗯,谢谢啦
請問如果是用 NGUI 加上 滑鼠點擊地面人物行 走會衝突到怎麼辦?因為一個是NGUI攝影機,另一個而是3D畫面的攝影機,無法使用Raycast判斷
以前用的是FingerGestures
我从Android 就开始看你写的 东西 现在 学 Unity 还是从您的书开始看 真厉害啊 大神
touchscript ~?!
感谢分享,但网站的账号注册界面在哪呢?还是只能用社交账号登陆?