【Unity】【Camera】判断物体是否在视野范围内

本文针对AR全景应用中UI异常显示的问题进行了分析,并提出了利用Unity3D的OnBecameVisible与OnBecameInvisible回调函数进行优化的方法。

遇到的一些问题,做些笔记
问题:
在做ar全景的时候,UI在摄像机旋转180度以后不该出现的UI再次出现,原因是UI随着物体向左移动离开屏幕后再次从右边回来。

需求:
物体在视野范围内出现相关UI,物体离开视野范围内UI消失

需要用到以下两个回调函数:

void OnBecameVisible(){
//可见状态下你要执行 的东西
}
void OnBecameInvisible(){
//不可见状态下你要执行的东西
}

需要注意的是:
1.在Unity3D中测试时,需要同时满足物体也出了Scene的窗口,才可以响应OnBecameInVisible。打包成exe出来就没有这个影响。
2.OnBecameVisible和OnBecameInVisible所在的脚本是需要挂在要判断的物体上。
3.用来判断的物体是需要有Renderer Component的。

Unity判断2D物体是否进入摄像机的视野,可以通过多种方法实现。以下是几种常见的方法: 1. **使用摄像机视锥体(Camera Frustum)**: - 通过计算物体的边界框(Bounds)和摄像机的视锥体是否相交来判断物体是否视野内。 ```csharp using UnityEngine; public class VisibilityCheck : MonoBehaviour { public Camera mainCamera; void Update() { Bounds bounds = GetComponent<SpriteRenderer>().bounds; Plane[] planes = GeometryUtility.CalculateFrustumPlanes(mainCamera); bool isVisible = GeometryUtility.TestPlanesAABB(planes, bounds); if (isVisible) { Debug.Log("物体视野内"); } else { Debug.Log("物体不在视野内"); } } } ``` 2. **使用摄像机世界坐标转换**: - 将物体的世界坐标转换为屏幕坐标,然后判断是否在屏幕范围内。 ```csharp using UnityEngine; public class VisibilityCheck : MonoBehaviour { public Camera mainCamera; void Update() { Vector3 screenPoint = mainCamera.WorldToViewportPoint(transform.position); bool isVisible = screenPoint.z > 0 && screenPoint.x > 0 && screenPoint.x < 1 && screenPoint.y > 0 && screenPoint.y < 1; if (isVisible) { Debug.Log("物体视野内"); } else { Debug.Log("物体不在视野内"); } } } ``` 3. **使用碰撞器(Collider)和触发器(Trigger)**: - 在摄像机周围设置一个触发器,当物体进入触发器时触发事件。 ```csharp using UnityEngine; public class VisibilityCheck : MonoBehaviour { void OnTriggerEnter2D(Collider2D other) { Debug.Log(other.name + "进入视野"); } void OnTriggerExit2D(Collider2D other) { Debug.Log(other.name + "离开视野"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值