zoukankan      html  css  js  c++  java
  • NGUI与EasyTouch结合使用

    用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行。这篇文章我就来说说EasyTouch和NGUI的结合。

    总体来说触摸屏幕也就三种情况。

    1.触摸事件只响应NGUI部分,不响应3D部分。

    2.触摸事件只响应3D部分,不响应NGUI部分。

    3.触摸事件同时响应。

    举个例子,在战斗场景我们希望通过手指滑动来控制摄像机的旋转。但是这时屏幕上可能还有一些UI的按钮,但是我们不希望用户点击UI按钮也影响到了摄像机的旋转。所以此时我们只希望触摸事件在3D部分响应。

    1. 如下图所示,这里我增加了一个UISprite,我希望我的手指触摸事件只在UI上响应,不在3D上响应

     1 using UnityEngine;
     2 using System.Collections;
     3  
     4 public class UImomo : MonoBehaviour {
     5     //头像
     6     GameObject icon;
     7     void Start () 
     8     {
     9         icon = transform.Find("icon").gameObject;
    10         //添加一个手指滑动的事件。
    11         EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd;
    12     }
    13  
    14     void OnDestroy()
    15     {
    16         //施放一个手指滑动的事件。
    17         EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
    18     }
    19  
    20     //当手指滑动结束时在这里
    21     void EasyTouch_On_SwipeEnd(Gesture gesture)
    22     {
    23         //判断手指是否触摸在NGUI的头像中
    24         if(gesture.IsStartInRect(NGUIObjectToRect(icon)))
    25         {
    26             //输出手指滑动的方向
    27             Debug.Log(gesture.swipe);
    28         }
    29     }
    30  
    31     //计算出NGUI某个UISprite或者UITexture或者 UILabel 在屏幕中占的矩形位置。
    32     private  Rect NGUIObjectToRect(GameObject go)
    33     {
    34         Camera camera = NGUITools.FindCameraForLayer(go.layer);
    35         Bounds bounds = NGUIMath.CalculateAbsoluteWidgetBounds(go.transform);
    36         Vector3 min = camera.WorldToScreenPoint(bounds.min);
    37         Vector3 max = camera.WorldToScreenPoint(bounds.max);
    38         return new Rect(min.x, min.y, max.x - min.x, max.y - min.y);
    39     }
    40  
    41 }

    2.我希望手指触摸只响应3D,不响应NGUI 。这里其实更多的运用于游戏的战斗界面,战斗界面的UI一般都集中在屏幕的四个角, 比如头像 小地图 技能 摇杆等等。EasyTouch提供了NGUI模式,可以很方便的解决这个问题,不过它原理也是用射线来判断,所以你要确保需要略过的UI空间有BoxCollider组件。

    我们把所有NGUI做的界面放在UI层上面。代码简单的改改,这样EasyTouch就不会在UI层上响应了。

     1 void Start () 
     2     {
     3         icon = transform.Find("icon").gameObject;
     4         //添加一个手指滑动的事件。
     5         EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd;
     6         //得到UI摄像机
     7         Camera uiCamera = GameObject.Find("UI Root/Camera").GetComponent<Camera>();
     8         if(uiCamera != null)
     9         {
    10             //启动NGUI模式
    11             EasyTouch.instance.enabledNGuiMode = true;
    12             //把NGUI摄像机加入过滤队列
    13             if(!EasyTouch.instance.nGUICameras.Contains(uiCamera))
    14             {
    15                 EasyTouch.instance.nGUICameras.Add(uiCamera);
    16             }
    17             //设置需要过滤的UI层
    18             EasyTouch.instance.nGUILayers = (1 << LayerMask.NameToLayer("UI"));
    19         }
    20     }
    21  
    22     void OnDestroy()
    23     {
    24         //施放一个手指滑动的事件。
    25         EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
    26         //施放
    27         EasyTouch.instance.enabledNGuiMode = false;
    28         EasyTouch.instance.nGUILayers =0;
    29         EasyTouch.instance.nGUICameras.Clear();
    30     }

    最后,我现在用的EasyTouch可能版本比较老,我用的版本是v3.1.1。EasyTouch这个版本里有一个BUG。就是超过10只手指在屏幕中滑动会出现空指针的错误,后来我看了一下代码,在UpdateTouches 里面做一下判断就好了。

    NGUI研究院之与EasyTouch结合使用(十五) - 雨松MOMO程序研究院 - 2

    EasyTouch有很强大的事件回调方法,大家可以去它的官网上查一下。不知道现在还有没有更好用的触屏插件。

  • 相关阅读:
    formValidator4.1.1问题汇总
    什么,又是字符串拼接,我有些不淡定了
    webform下的分页辅助类再总结
    winform下的一个分页控件总结
    总结SQL Server窗口函数的简单使用
    sql复制表定义及复制数据行
    动态SQL开发基础和经验再总结
    c#执行定时计算限制操作(计时器)
    ado.net关于操作数据库的连接字符串整理
    使用Visual Studio实现WinForm多语言版本实例
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7029459.html
Copyright © 2011-2022 走看看