当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下:

  1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI。但无论Physics2D.Raycast()还是Physics.Raycast()都只能检测到含有Collider组件的物体,普通UI如Image Button等一般用射线是不起作用的。EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个PointerEventData参数传入检测的点坐标:

     PointerEventData pointerData = new PointerEventData (EventSystem.current);
pointerData.position = Input.mousePosition;
List<RaycastResult> results = new List<RaycastResult> ();
EventSystem.current.RaycastAll (pointerData, results);

  2. 在3D物体的Camera上挂上PhysicsRaycaster组件即可让3D物体上的脚本响应IPointerClickHandler等事件了(原理同Canvas上都挂有GraphicRaycaster组件一下)。

  当3D物体之上有UI时则会自动被UI事件所拦截,因为一般UI的显示级别(Camera或overlay)是高于场景中的3D物体的。

  这样就当点击在UI上时只响应UI事件了,如果同时也要响应3D物体上的事件则只能再次用射线检测点击处是否有3D物体(3D物体一般都有Collider)。

  3. 详见www.xuanyusong.com/archives/3327,如下代码

 1         void Update ()
2 {
3 if (Input.GetMouseButtonDown (0) || (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began))
4 {
5 #if UNITY_IOS || UNITY_ANDROID
6 if (EventSystem.current.IsPointerOverGameObject (Input.GetTouch (0).fingerId))
7 #else
8 if (EventSystem.current.IsPointerOverGameObject ())
9 #endif
10 Debug.Log ("当前触摸在UI上");
11
12 else
13 Debug.Log ("当前没有触摸在UI上");
14 }
15 }

但EventSystem.current.IsPointerOverGameObject ()只能检测到有event存在的组件如Button等,普通Image等UI是不能被检测的,故该方法仅用于简单几个按钮等可交互的UI与3D物体间的判断,当一个大的UI窗口打开时点击在非按钮上如背景图时则失效。

另:

  让3D物体响应点击有个MonoBehaviour自带的消息函数MonoBehaviour.OnMouseDown()可简单实现,但脚本中最好不要有OnMouseXXX的消息处理函数,此类函数会影响游戏性能。(当存在此类函数时build打包结束时有黄色警告提示性能影响)

  Graphics Raycaster的Raycast是个虚函数,可以写个Graphics Raycaster的派生类,在默认的Raycast操作执行完以后,用自定义的layer进行筛选,把不需要响应的gameobject去掉。这样就可以实现只响应某个layer的需求了。新手引导中只要把需要响应的gameobject设置为特定layer就行了。

  实现ICanvasRaycastFilter接口并挂在UI组件上,当有任何UI事件触发时可以实现自定义的判断,如:

 public class CustomRay : MonoBehaviour, ICanvasRaycastFilter
{
public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
//....
...
return true;
//....
...
return false;
}
}

unity区分点击在3D物体还是2D UI上的更多相关文章

  1. Unity 3D物体的点击事件响应以及NGUI坐标和世界坐标的互相转换

    Unity 版本:4.5 NGUI版本:3.6.5 参考链接:http://game.ceeger.com/Script/Camera/Camera.ScreenPointToRay.html,Uni ...

  2. Unity 弹出界面时屏蔽对3D场景的点击

    注:这里的UI制作用的是NGUI插件 如题,在游戏中经常会遇到这种情况,场景中点击相关物体或者按钮弹出对应的2D界面,这时候除了2D界面上的可点击按钮等,应该屏蔽掉对3D场景的点击或者拖动事件. 在这 ...

  3. unity 3D物体使用EventSystem响应事件

    在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...

  4. cocos 射线检测 3D物体 (Sprite3D点击)

    看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...

  5. unity实现3D物体上的事件监听处理

    想要在3D物体上实现全套事件监听处理: OnMouse系列 OnTrigger系列 OnPointer系列 OnDrag系列   1.在相机中添加Physics Raycaster组件 2.3D物体上 ...

  6. 使用3D物体做GUI界面

    通常来说,Unity自带的OnGUI不太好用,靠代码完成,在场景中无法直接编辑.所以,一般项目使用NGUI插件来做界面,但我这次要修改一个游戏,它没用NGUI,也没用OnGUI,而是使用类似NGUI的 ...

  7. UI和3D物体的堆叠响应

    一.问题:当3D物体和UI元素重叠显示时一般UI元素会遮挡物体,这时点击UI元素响应时UI后方的物体也会响应. private void OnMouseDown() { ChangeColor(); ...

  8. unity NGUI点击消息不传入到场景中去

    unity NGUI点击消息不传入到场景中去 1.今天遇到的问题是点击NGUI的按钮,场景中也相应了这个消息 解决的办法是在场景中需要互动的时候,也就是在update中进行判断 是否是点击了NGUI按 ...

  9. u3d 鼠标点击位置,物体移动过去。 U3d mouse clicks position, objects move past.

    u3d 鼠标点击位置,物体移动过去. U3d mouse clicks position, objects move past. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱: ...

随机推荐

  1. php 添加redis扩展(二)

    php代码操作redis 1.连接 <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 63 ...

  2. Neutron分析(7)—— neutron-l3-agent HA solutions

    1. keepalived vrrp/conntrackd High availability features will be implemented as extensions or driver ...

  3. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  4. 替换、恢复Html中的特殊字符

    public static string HtmlEncode(string theString){theString = theString.Replace(">", &q ...

  5. c++中引用和指针的区别

    1.指针和引用的主要区别. 引用是为变量起另一个名字(小名),一般在变量初始化时,初始值直接拷贝给变量,定义引用时,把引用(小名)和初始值“绑定”在一起,而不是将初始值拷贝给引用.因为 无法将引用重新 ...

  6. vs2012 遇到 “此操作要求使用 IIS 集成管线模式。”

    这个项目是VS2013开发的,我用2012打开想调试,但报这个错误. 最后安装2013,然后调试则正常.

  7. 51nod1258 序列求和V4

    T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k,求S(n).   例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^ ...

  8. android学习笔记25——事件处理Handler

    Handler消息传递机制 ==> android消息机制是另一种形式的“事件处理”,这种机制主要是为了解决android应用的多线程问题. ——android平台不允许Activity新启动的 ...

  9. 【mysql】之MySQL导入sql脚本错误:2006 - MySQL server has gone away

    到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24Line no.:85Error Code: 2006 ...

  10. 删除SQL server 实例

    在网上找到下面几种方法,本人使用的是第一种,很实用. 1.删除 SQL Server 的特定实例若要删除 SQL Server 的某个特定实例,请按照以下步骤操作: 找到并删除%drive%:\\Pr ...