在做VR/AR的开发 ,在AR项目中,2D的UI是不支持的,即便是需要2D的,也只能通过3D的方式实现,即Canvas 要选择World Space 模式。 这时候UI上的事件也不能用默认的事件系统来响应了。 VR/AR 中,基本是没办法触摸屏幕来响应鼠标事件。基本都是使用的射线。
使用射线要能够触发UGUI的事件系统,就要重构它的事件系统。这个不多介绍。。主要碰到的问题是一些坐标数据,通过 EventSystem调用之后,就变成了NAN 数据。 结果导致界面上某个角度区域的按钮不会被选中以及触发。
NAN的错误不会爆红,导致不容易发现 。
通常出现 NAN的方式为除以了0。
比如在代码里除以了Time.deltaTime。 又恰好设置了 TimeScale 为0。
NAN与其他数做运算,就会一直传递,比较烦人。
平常写代码其实也不容易出现这个问题,很少会写出 除以0 这种情况,很多时候会从其他地方传递过来。 比如做局域网游戏时,使用Mirror类似的插件,一些数据经过服务器传递一次之后,回来就变成了NAN. 等等
如果遇到了这种情况,但是源头的位置 又不在自己能处理的范围内,就只能在适合的位置进行截断。将NaN数据尽早剔除出去。
可以用float.IsNaN(num)来判定。或者判定 num!=num .因为NAN 跟NAN 用等号连接不会成立。不过这种写法会被脚本 误认为写错,给出警告