unity5, UGUI刺穿问题解法
我希望在touch屏幕时player起跳,于是在playerControl.cs的Update函数中添加如下touch代码:
if (Input.GetMouseButtonDown (0)) {//left button down
jump ();
}
同时我在屏幕左上角加了一个实现暂停的pause按钮,用的是Unity的UI Button。
于是问题来了,当我点pause按钮想暂停时,人物同时也会起跳!
即Button响应touch消息后并没能把它拦截下来,touch消息刺穿Button到达了屏幕。
解决UGUI刺穿问题目前在所有平台都有效的办法是在屏幕响应touch前先用graphicRaycaster当前touch是否落在ui上。
举例说明如下:
假设我的项目UI部分Hierarchy如下:

在UI节点上的脚本UIcontrol.cs中实现如下函数:
using UnityEngine.EventSystems;
using System.Collections.Generic;
using UnityEngine.UI;
public bool isTouchOnUI()
{
EventSystem eventSystem = gameObject.transform.FindChild ("EventSystem").GetComponent<EventSystem> ();
Transform[] childrenTransformList = GetComponentsInChildren<Transform>();
foreach (Transform transform in childrenTransformList) {
GraphicRaycaster graphicRaycaster = transform.GetComponent<GraphicRaycaster> ();
if (graphicRaycaster&&graphicRaycaster.enabled==true) {
PointerEventData eventData = new PointerEventData (eventSystem);
eventData.pressPosition = Input.mousePosition;
eventData.position = Input.mousePosition;
List<RaycastResult> list = new List<RaycastResult> ();
graphicRaycaster.Raycast (eventData, list);
////Debug.Log("list.Count:"+list.Count);
if (list.Count > 0)
return true;
}
}
return false;
}
那么前面的touch代码改为:
bool isTouchOnUI=m_gameRef.transform.Find("UI").GetComponent<UIcontrol>().isTouchOnUI();
if (isTouchOnUI==false&&Input.GetMouseButtonDown (0)) {//left button down
jump ();
}
即可解决touch穿透问题。
补充:
一,一定要加if(graphicRaycaster)的判断,因为注意GameObject.GetComponentsInChildren的文档中写道:
Returns all components of Type type in the GameObject or any of its children.
即,除了UI节点的孩子会被搜索以外,UI节点本身也会被搜索,而UI节点上不含有graphicRaycaster,所以必须先判断graphicRaycaster是否获得成功,再进行后续处理。
另外文档中还写道:
The search for components is carried out recursively on child objects, so it includes children of children, and so on.
即GameObject.GetComponentsInChildren不只是会搜索子节点,也会搜索孙节点。
二,加上graphicRaycaster.enabled==true的判断,好处是,如果我们希望某个Canvas能被刺穿,则可以将其Graphic Raycaster去掉勾选即可。
参考:http://www.cnblogs.com/fly-100/p/4570366.html
unity5, UGUI刺穿问题解法的更多相关文章
- 解决IE6下浮层遮盖select刺穿的问题
图一未解决刺穿问题: 图二已解决 解决方法使用iframe间接挡住层,具体方法见源码 源码一(未解决刺穿): <html xmlns=" ...
- leetcode 学习心得 (2) (301~516)
源代码地址:https://github.com/hopebo/hopelee 语言:C++ 301. Remove Invalid Parentheses Remove the minimum nu ...
- 2016.05.03,英语,《Vocabulary Builder》Unit 21
sub, means 'under', as in subway, submarine, substandard. A subject is a person who is under the aut ...
- 极客DIY:打造属于自己的无线移动渗透测试箱
本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱” ...
- [学习笔记]设计模式之Bridge
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...
- Unity 白猫操作小实例
最近师兄找我说白猫的操作如何做, 0.0 结果白猫没有android的客户端玩不了,看了下视频介绍就简单做了下 效果图: 核心代码: using UnityEngine; using Syste ...
- 【转】傅盛:一家公司最大瓶颈就是CEO
创业之路,一经踏上,即永无止境.当然,对于初创期的CEO而言,还是有一些方法论可循. 来源 | 盛盛GO(ID:fstalk) 文 | 傅盛 经常有创业者问我,如何当好创业公司CEO,或如何创业,我 ...
- 用户手册是Yasm汇编
本文档的用户手册是Yasm汇编. 它是介绍和通用所有Yasm用户参考. 英文的参考:http://www.cnblogs.com/coryxie/p/3959888.html 1 .介绍 Yasm b ...
- 游戏引擎架构Note2
[游戏引擎架构Note2] 1.视觉属性(visual property)决定光线如何与物体表面产生交互作用. 2.一个Mesh所使用三角形的多少可以用细致程度(level-of-detail,LOD ...
随机推荐
- vs2017 新建Class 文件时,自动添加作者版权声明注释
1.用文本打开,在其头部加上 “C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTempl ...
- node.js+mysql增删查改
数据库和表: -- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 ` ...
- 封装log4cp p
log4cpp 是参考 log4j 所写的 c++ 版本的写 log 的库.可以在这里下载 http://log4cpp.sourceforge.net/ 我的使用方法是: 1,定义了一个 _ ...
- JCA 了解
JCA (J2EE 连接器架构,Java Connector Architecture)是对 J2EE标准集的重要补充.因为它注重的是将 Java程序连接到非Java程序和软件包中间件的开发.连接器特 ...
- weblogic生成和配置SSL证书
采用Linux自带的OPENSSL进行证书的生成工作 准备阶段 以root登录,同时在el01gbcn01上完成 [oracle@el01gbcn01]# which java /u01/FMW/we ...
- requests.exceptions.SSLError: hostname '127.0.0.1' doesn't match None
http://stackoverflow.com/questions/33429453/python-requests-ssl-hostname-doesnt-match-error http://w ...
- 流畅的python第十八章使用asyncio包处理并发
对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...
- mount命令汇总
(一)挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o op ...
- 转:ios的图片文件上传代码
转自: https://gist.github.com/igaiga/1354221 @interface ImageUploader : NSObject { NSData *theImage; } ...
- [Algorithm] Fibonacci problem by using Dynamic programming
vThere are three ways to solve Fibonacci problem Recursion Memoize Bottom-up 'First Recursion approa ...