常见需求,点击ui的时候,不需要3d物体也作出相关响应操作 ![[Pasted image 20221116082845.png]] 还有这个需求,3D物体有响应,2d不响应 ![[Pasted image 20221210165731.png]] 拿一个写好的脚本来分析: MonoBehavior默认是有一个OnMouseDown()的方法 ![[Pasted image 20221210165814.png]] 这个测试代码,就是修改颜色来着 ![[Pasted image 20221210165915.png]] 运行游戏,点击3d物体,就可以穿透,直接变色了 ![[Pasted image 20221210165958.png]] 然后,解析另一个写好的脚本,是给2d图片用的,继承的类和内置监听,是这些: ![[Pasted image 20221210172416.png]] 运行,点击,可以看到,图片点击,也是变色了,但俩都变色了 ![[Pasted image 20221210172514.png]] 日常的一个需求,就是点2d图片的时候,3d物体应该不响应 来处理一下,先放一个物理组件到相机上 ![[Pasted image 20221210172726.png]] 可以看到,canvas画布,是有继承这个ugui相关的射线检测 ![[Pasted image 20221225133111.png]] 3d物体的这个脚本,可以remove移除了 ![[Pasted image 20221225134144.png]] 勾选使用这个就好 ![[Pasted image 20230102105037.png]] 重新运行游戏,可以看到,点击2d物体的碰撞检测,是正常了,不会也触发3d物体 ![[Pasted image 20221225134242.png]] 可以看到,默认是勾选上这个,指的是,忽略没有关联Graphics的元素 需要注意的是,只有ugui的元素,是继承和关联Graphics基类的 ![[Pasted image 20230102102055.png]] 换一下函数的调用 ![[Pasted image 20230102105317.png]] 声明一个index,用三元运算符做处理 ![[Pasted image 20230102105406.png]] 重新运行游戏,点ui,需求逻辑还是正常的,不会对3d物体产生影响 ![[Pasted image 20230102105443.png]] 点后面3d物体,也是正常的 ![[Pasted image 20230102105523.png]] 说明,这个接口用起来,还是比较方便的 ![[Pasted image 20230102105552.png]] ###### 103-解决UI和3D物体的同时响应问题 如果要实现,ui点击,和3d物体同时响应,承前启后,也是基于这个接口实现,这样在系统设计上,逻辑会比较连贯 ![[Pasted image 20230103090114.png]] 加一个函数,其中调用的事件系统接口,是会收集所有点击到的物体,然后进行排序 ![[Pasted image 20230103090302.png]] 补充点击的eventData数据,还有点击结果的数据,完成传参处理 ![[Pasted image 20230103090432.png]] 继续完善逻辑,在拿到点击结果之后,遍历一下,触发一下点击事件和逻辑 ![[Pasted image 20230103093153.png]] 然后,调用一下 ![[Pasted image 20230105092626.png]] 之前写错地方了,那个触发全部的函数逻辑,应该放到ui逻辑里 剪切过来就好 ![[Pasted image 20230105092800.png]] 也是调用一下就好 ![[Pasted image 20230105092840.png]] 重新运行游戏,点击ui,3d物体也会变色了 ![[Pasted image 20230105092920.png]] 注释掉 ![[Pasted image 20230105092958.png]] 恢复成之前的亚子 ![[Pasted image 20230105093020.png]] ###### 104-解决UI和鼠标点击之间的响应问题 加了这个脚本 ![[Pasted image 20230106092001.png]] 逻辑简单,响应鼠标左键点击,切换颜色 ![[Pasted image 20230106092034.png]] 用图形射线做检测,先声明一下,然后实例化 ![[Pasted image 20230106093934.png]] 写一个方法,判断是否点击中,包含ui ![[Pasted image 20230110091459.png]] 加到判断条件里,取false,不是ui的时候,才生效 ![[Pasted image 20230110091625.png]] 运行,点击空白地方,也是只有3d物体变更了颜色,ui是没变化的 ![[Pasted image 20230110091712.png]] 点ui也是单独变颜色 ![[Pasted image 20230110093810.png]] ###### 105-为什么要实现自己的圆形图片组件 一般单独小案例,都会创建一个独立的场景 ![[Pasted image 20230116091626.png]] 如果要看上一个章节的内容,其实介个场景也是可以看得到的 ![[Pasted image 20230116093503.png]] 生成圆形图片的,是介个场景 ![[Pasted image 20230116093529.png]] 先弄一个image出来 ![[Pasted image 20230116093627.png]] 简单设置一下尺寸 ![[Pasted image 20230116093648.png]] ctrl+d复制一份出来 ![[Pasted image 20230117094341.png]] 拖曳,变成子物体 ![[Pasted image 20230117094420.png]] 用icon1作为图片 ![[Pasted image 20230117094503.png]] 在父物体加一个mask蒙版 ![[Pasted image 20230119102057.png]] 这是一张圆形的纯色图,背景透明 ![[Pasted image 20230119102157.png]] 把这个图,拖曳到父物体上 ![[Pasted image 20230119102311.png]] 因为有蒙版,所以整个图形都变成圆形了 ![[Pasted image 20230119102357.png]] 这就是unity自带的圆形实现,不过缺陷也比较多,其中一个就是锯齿很明显 ![[Pasted image 20230119102525.png]] 还有一点,就是会提高unity的drawcall,可以看到,这里现在有5个 mask会极大增加drawcall ![[Pasted image 20230119102618.png]] 所以,需要自己写一个实现