今天,一个关系很好的同事问我,如何检测3dUI是否在摄像机视野内。
刚春节放假回来,也不是很忙,就花点时间研究了下。把研究结果分享给大家。
首先是在3d环境的ui,即Canvas的RenderMode为“World Space”。
判断是否在摄像机视野范围,需要知道物体或UI的渲染边界框
所以我们第一步 先给ui加上“Sprite Renderer”组件,来获取UI的bounds
如果ui为image,则设置“Sprite Renderer”组件的“Sprite”属性为该image的图片
如果ui是text或者其它,就随便设置“Sprite”一张图片
这里的“Sprite”是一定要设置的,否则会一直检测不在视野内
在设置ok后,添加下面脚本,随便挂载到物体上,并给image赋值后 即可测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using UnityEngine; using System.Collections; using UnityEngine.UI; public class Test : MonoBehaviour { public Image image; // 需要自己贴上该图片。如果不是图片,就更换下 void Update() { if (!image.GetComponent<SpriteRenderer>().IsInScreen(Camera.main)) { print("不在视野范围"); } else { print("在视野范围"); } } } public static class RendererExtensions { /// <summary> /// 渲染器扩展方法 /// </summary> public static bool IsInScreen(this Renderer renderer, Camera camera) { Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera); return GeometryUtility.TestPlanesAABB(planes, renderer.bounds); } } |
这里介绍的3dui其实是根据3d物体的思路来的,如果要检测3d物体是否在视野内,就把“SpriteRenderer”更换为“Renderer”就可以了。
- 本文固定链接: http://www.u3d8.com/?p=998
- 转载请注明: 网虫虫 在 u3d8.com 发表过