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

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

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

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

3.触摸事件同时响应。

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

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

 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层上响应了。

 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 = ( << LayerMask.NameToLayer("UI"));
}
} void OnDestroy()
{
//施放一个手指滑动的事件。
EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
//施放
EasyTouch.instance.enabledNGuiMode = false;
EasyTouch.instance.nGUILayers =;
EasyTouch.instance.nGUICameras.Clear();
}

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

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

NGUI与EasyTouch结合使用的更多相关文章

  1. EasyTouch 3.1中文翻译

    Unity3D的Easy Touch 的手册最近寻找中文版本,google无果,自己动手.目前暂时只有c# ,javascript原理是一样的. 一.Quick Start 1-Import Easy ...

  2. EasyTouch和NGUI的使用心得

    今天来写一写Unity3D中两个比较常用插件:EasyTouch和NGUI的学习心得.我用的版本分别是EasyTouch 3.1.1和NGUI 3.6.0,下面也是对这两个版本的学习心得. 1. Ea ...

  3. Unity3d插件研究之Easytouch

    但我们开发移动端的游戏时,发现使用Input.GetMouseButtonDown的方法不可用,怎么办? 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装 ...

  4. Unity基于NGUI的简单并可直接使用的虚拟摇杆实现(一)

    可能大家都听说过大名鼎鼎的easytouch,然而easytouch是基于UGUI的,两种不同的UI混用,可能会造成项目管理的混乱,并且可能会出现各种幺蛾子,比如事件传递互相扰乱的问题. 于是就想找一 ...

  5. NGUI学习笔记(一)UILabel介绍

    来个前言: 作为一个U3D程序员,自然要写一写U3D相关的内容了.想来想去还是从UI开始搞起,可能这也是最直观同时也最重要的部分之一了.U3D自带的UI系统,也许略坑,也没有太多介绍的价值,那么从今天 ...

  6. NGUI裁剪模型和粒子

    效果预览 注:Cube上附着的绿色是我添加的粒子效果. 软件环境 NGUI 3.9.x Unity 5.1 x64 相关知识 RenderTexture RenderTexture是一种特殊的纹理,它 ...

  7. Unity NGUI添加UIRoot

    导入NGUI包后,菜单多出一个选项 "NGUI",选择其子选项 "options" -- "Reset Prefab ToolBar" ,在 ...

  8. NGUI之UIRoot——屏幕的自适应分辨率的计算

    //原来写在其他博客上的东西,搬迁 预备知识: 要明确的三个概念: 设计分辨率:在编辑器上开发UI使用的分辨率.我们所有的UI都是在这个分辨率下设计制作的. 显示区域分辨率:设备上所显示的UI区域在编 ...

  9. Shader实例:NGUI制作网格样式血条

    效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中 ...

随机推荐

  1. Oracle PLSQL Demo - 06.LOOP循环,以IF判断退出[IF in LOOP]

    declare v_sal ; begin loop v_sal :; dbms_output.put_line(v_sal); then exit; end if; end loop; end;

  2. 使用Konva创建进度条

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. freemarker遍历java.util.Properties

    java.util.Properties类 学习笔记 http://trans.blog.51cto.com/503170/110227/ FreeMarker代码 <#list systemP ...

  4. 【C#】往按钮事件中传递自定义参数

    情景:代码动态生成的按钮,需要自定义点击事件.但是生成的点击事件的参数是固定的,如何才能传入自定义的参数? Button btn = new Button() { Content = "这是 ...

  5. C语言 · 文本加密

    算法提高 9-2 文本加密   时间限制:1.0s   内存限制:256.0MB      问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A ...

  6. 反射方法调用时:参数计数不匹配( parameter count mismatch )

    Invoke方法的参数当中有一个自己的object[],正好你传递的参数也是object[],这样的话invoke就会把你参数数组里面的第一个参数作为参数传递给你要调用的方法,于是就报错了. 解决问题 ...

  7. ubuntu 命令 dpkg -l

    dpkg -l 每条记录对应一个软件包,每条记录的第一, 二, 三个字符是软件包的状态标识, 后边依此是软件包名称,版本号, 和简单描述. 关于每个状态,可以参考 man dpkg-query 关于每 ...

  8. 6. GC 调优(工具篇) - GC參考手冊

    进行GC性能调优时, 须要明白了解, 当前的GC行为对系统和用户有多大的影响. 有多种监控GC的工具和方法, 本章将逐一介绍经常使用的工具. 您应该已经阅读了前面的章节: 垃圾收集简单介绍 - GC參 ...

  9. DataGridView使用技巧十:单元格表示值的自定义

    通过CellFormatting事件,可以自定义单元格的表示值.(比如:值为Error的时候,单元格被设定为红色) 示例: private void dgv_Users_CellFormatting( ...

  10. 在网页中使用SVG

    SVG可以作为一个独立的文件存在.但更多的时候,我们希望他能集成在某个更大的文档中,比如HTML.将SVG插入到HTML中主要有以下几种方式: 将 SVG 作为图像导入 将 SVG放入 iframe ...