NGUI研究之与EasyTouch结合使用
2014-07-22 19:05
686 查看
用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行。这篇文章我就来说说EasyTouch和NGUI的结合,对图文混排有疑问的请移驾NGUI研究之有点坑爹的图文混排可以看看。
总体来说触摸屏幕也就三种情况。
1.触摸事件只响应NGUI部分,不响应3D部分。
2.触摸事件只响应3D部分,不响应NGUI部分。
3.触摸事件同时响应。
举个例子,在战斗场景我们希望通过手指滑动来控制摄像机的旋转。但是这时屏幕上可能还有一些UI的按钮,但是我们不希望用户点击UI按钮也影响到了摄像机的旋转。所以此时我们只希望触摸事件在3D部分响应。
1. 如下图所示,这里我增加了一个UISprite,我希望我的手指触摸事件只在UI上响应,不在3D上响应
2.我希望手指触摸只响应3D,不响应NGUI 。这里其实更多的运用于游戏的战斗界面,战斗界面的UI一般都集中在屏幕的四个角, 比如头像 小地图 技能 摇杆等等。EasyTouch提供了NGUI模式,可以很方便的解决这个问题,不过它原理也是用射线来判断,所以你要确保需要略过的UI空间有BoxCollider组件。
我们把所有NGUI做的界面放在UI层上面。代码简单的改改,这样EasyTouch就不会在UI层上响应了。
最后,我现在用的EasyTouch可能版本比较老,我用的版本是v3.1.1 因为目前项目也比较稳定,所以也不敢升级。EasyTouch这个版本里有一个BUG。就是超过10只手指在屏幕中滑动会出现空指针的错误,后来我看了一下代码,在UpdateTouches 里面做一下判断就好了。
EasyTouch有很强大的事件回调方法,大家可以去它的官网上查一下。不知道现在还有没有更好用的触屏插件,如果你觉得比EasyTouch还好用的话,希望你在下面给我留言,谢谢。
用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行。这篇文章我就来说说EasyTouch和NGUI的结合,对图文混排有疑问的请移驾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 | 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); } } |
我们把所有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 | 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有很强大的事件回调方法,大家可以去它的官网上查一下。不知道现在还有没有更好用的触屏插件,如果你觉得比EasyTouch还好用的话,希望你在下面给我留言,谢谢。
相关文章推荐
- NGUI与EasyTouch结合使用
- NGUI研究之开发项目的一些使用心得比较细节
- 基于funambol ds 的云同步服务研究(五)-结合Sync Client的测试使用
- RPG游戏中 使用unity3d 客户端 结合NGUI的UI系统框架
- NGUI研究之在Unity中使用贝塞尔曲线
- EasyTouch与UGUI的结合使用
- NGUI研究之Sprite精灵与精灵动画的使用
- NGUI研究之在Unity中使用贝塞尔曲线
- ORACLE中BFILE字段的使用研究
- Together与Visual.Studio.NET的结合使用(一)
- 对收藏夹中AspectJ和Spring结合使用例子(What the teacher said (using AspectJ with Spring part II). )的补充
- 使用XmlHttp结合ASP实现网页的异步调用
- 扑克21点作弊算法【综合文 FreeXploiT收集整理】仅供研究,不要非法使用
- Together与Visual.Studio.NET的结合使用(转载)
- Together与Visual.Studio.NET的结合使用
- 分析研究私自使用和干扰GPS的可能性!
- 将lex,yacc(flex,bison)与MFC结合起来使用!
- 使用XmlHttp结合ASP实现网页的异步调用
- flash和oa项目 其他应用项目结合使用 的应用
- C# xml xsl javascript 的结合使用 web 程序模仿 windows 资源管理器