当前位置: 首页 > wzjs >正文

天天传媒有限公司网站个人工作室网站模板

天天传媒有限公司网站,个人工作室网站模板,青岛做视频的网站,安徽大学最近消息系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、判断UI的可见性1-1、第一种1-2、通过RectTransform计算可视区域1-3、滚动容器内可见性检测(Scroll View) 👉二、判断物体的可见性2-1、视锥体检测方法2-2…

系列文章目录

unity知识点


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、判断UI的可见性
    • 1-1、第一种
    • 1-2、通过RectTransform计算可视区域
    • 1-3、滚动容器内可见性检测(Scroll View)
  • 👉二、判断物体的可见性
    • 2-1、视锥体检测方法
    • 2-2、遮挡检测(射线检测法)
    • 2-3、使用渲染器回调(自动触发)
    • 2-4、判断物体中心点的可见性
    • 2-5、判断物体包围盒是否在Camera包围盒内
    • 2-6、完整方法
  • 👉壁纸分享
  • 👉总结


👉前言

在Unity中,判断UI和3D物体的可见性需要结合渲染逻辑、空间坐标系转换及特定API的使用

博客将会介绍Unity3D中UI与物体可见性的判断方法。
希望这篇博客对Unity的开发者有所帮助。
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、判断UI的可见性

1-1、第一种

该方法适用于3D Canvas(第三种模式), 和 2D且赋值了相机的Canvas。(第二种模式)
不适合2D没有赋值相机的Canvas(第一种模式)。

    /// <summary>/// 判断ui是否能被相机Camera可见/// </summary>public bool GetUIDisable(Camera cam, RectTransform ui){bool value = true;Vector3 pos = cam.WorldToScreenPoint(ui.position);if (pos.z < 0 || pos.x < 0 || pos.x > Screen.width || pos.y < 0 || pos.y > Screen.height)value = false;return value;}

1-2、通过RectTransform计算可视区域

public static bool IsUIVisible(RectTransform rectTransform) {// 获取UI的屏幕范围Vector3[] corners = new Vector3[4];rectTransform.GetWorldCorners(corners);// 计算屏幕的有效区域(假设主Canvas覆盖整个屏幕)Rect screenRect = new Rect(0, 0, Screen.width, Screen.height);// 检查所有角是否在屏幕内foreach (Vector3 corner in corners) {if (!screenRect.Contains(corner)) {return false;}}return true;
}

1-3、滚动容器内可见性检测(Scroll View)

动态加载列表项:当UI元素进入ScrollRect可视区域时加载数据。
自动适配布局:隐藏屏幕外的UI元素以优化性能。

public bool IsVisibleInScrollView(ScrollRect scrollRect, RectTransform content) {// 获取ScrollRect的可视区域Rect viewportRect = scrollRect.viewport.rect;Bounds viewportBounds = new Bounds(scrollRect.viewport.position, new Vector2(scrollRect.viewport.rect.width, scrollRect.viewport.rect.height));// 转换目标UI的坐标到Viewport空间Vector3[] contentCorners = new Vector3[4];content.GetWorldCorners(contentCorners);Matrix4x4 viewportMatrix = scrollRect.viewport.worldToLocalMatrix;// 检查是否与Viewport重叠return RectTransformUtility.RectangleContainsScreenPoint(scrollRect.viewport, content.position, null // 可指定特定摄像机);
}

👉二、判断物体的可见性

3D物体的可见性取决于

  1. 摄像机视锥体(Frustum):物体是否在摄像机视野内。
  2. 渲染器状态:Renderer.isVisible 属性(自动更新)。
  3. 遮挡关系:物体是否被其他物体遮挡(需额外计算)。

2-1、视锥体检测方法

public bool IsInCameraView(Camera camera, GameObject obj) {// 获取物体的包围盒Bounds bounds = obj.GetComponent<Renderer>().bounds;// 创建视锥体平面Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);// 检查包围盒是否在视锥体内return GeometryUtility.TestPlanesAABB(planes, bounds);
}

2-2、遮挡检测(射线检测法)

public bool IsOccluded(GameObject target, Camera camera) {Vector3 dir = target.transform.position - camera.transform.position;float distance = dir.magnitude;Ray ray = new Ray(camera.transform.position, dir.normalized);if (Physics.Raycast(ray, out RaycastHit hit, distance)) {return hit.collider.gameObject != target;}return false;
}

2-3、使用渲染器回调(自动触发)

自带API

void OnBecameVisible() {// 当物体进入任何摄像机视野时触发
}void OnBecameInvisible() {// 当物体离开所有摄像机视野时触发
}

2-4、判断物体中心点的可见性

    public bool GetObjCenterDisable(Camera cam, Transform obj){//转化为视角坐标Vector3 viewPos = cam.WorldToViewportPoint(obj.position);//  z<0代表在相机背后if (viewPos.z < 0)return false;//  距离farClipPlane太远,摄像机看不到了if (viewPos.z > cam.farClipPlane)return false;//  x,y取值在 0~1之外时代表在视角范围外if (viewPos.x < 0 || viewPos.y < 0 || viewPos.x > 1 || viewPos.y > 1)return false;return true;}

2-5、判断物体包围盒是否在Camera包围盒内

在范围内就可见,则反之

    /// <summary>/// 相机包围盒/// </summary>private Plane[] _mTempCameraPlanes = new Plane[6];private void Update(){//使用方法;print(GetBondsVisable(transform.position, GetComponent<BoxCollider>().size));}private void LateUpdate(){//调用Unity的API,获取相机包围盒GeometryUtility.CalculateFrustumPlanes(Camera.main, _mTempCameraPlanes);}/// <summary>/// 通过相机包围盒来判定物体是否在视野中。/// </summary>public bool GetBondsVisable(Vector3 center, Vector3 size){Bounds bound = new Bounds(center, size); //这里的Size是半径return GeometryUtility.TestPlanesAABB(_mTempCameraPlanes, bound);}

2-6、完整方法

结合了2-1、2-2、示例如下:

// 综合判断3D物体是否可见(视锥体 + 遮挡)
public bool IsObjectVisible(GameObject obj, Camera mainCam) {if (!IsInCameraView(mainCam, obj)) return false;if (IsOccluded(obj, mainCam)) return false;return true;
}

请添加图片描述


👉壁纸分享

在这里插入图片描述

👉总结

本次总结的就是UI与物体可见性的判断方法, 有需要会继续增加功能
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!


文章转载自:

http://rc2SAqOc.fhqdb.cn
http://8Qg4uh14.fhqdb.cn
http://GWiWbJFh.fhqdb.cn
http://oJJOWZhK.fhqdb.cn
http://vmQujW7y.fhqdb.cn
http://REXssDxr.fhqdb.cn
http://k62FInkR.fhqdb.cn
http://v1DXz1vr.fhqdb.cn
http://4n8LUHWn.fhqdb.cn
http://VXs4qqMs.fhqdb.cn
http://RlcF81Dn.fhqdb.cn
http://lE0OuIuN.fhqdb.cn
http://ZxFa722d.fhqdb.cn
http://e17ojb8I.fhqdb.cn
http://dzUiSQat.fhqdb.cn
http://3Po9zRf7.fhqdb.cn
http://Srw6IycO.fhqdb.cn
http://yrykQx1M.fhqdb.cn
http://seXCrdyF.fhqdb.cn
http://iN3gVCJf.fhqdb.cn
http://tbeC5VoV.fhqdb.cn
http://7Nxdy8pp.fhqdb.cn
http://2y1XyXkM.fhqdb.cn
http://Njy0SE4v.fhqdb.cn
http://sH7aY9Ok.fhqdb.cn
http://mo3SOKXx.fhqdb.cn
http://Fy3HVzKN.fhqdb.cn
http://XpbdoKlh.fhqdb.cn
http://h2KfJTqw.fhqdb.cn
http://p0nAGkX4.fhqdb.cn
http://www.dtcms.com/wzjs/721299.html

相关文章:

  • 有了域名和空间怎么做网站景区网站建设的目标定位
  • 个人网站建设域名wordpress视频上传
  • 重庆做网站推广公司微信小程序分销商城
  • 淘客网站怎么做圣诞网站源码
  • 招聘网站系统怎么做太原小程序制作
  • wordpress插件失败如何给网站做seo
  • 响应式网站头部觉 网站
  • 织梦网站如何生成伪静态wordpress 生成xml
  • thinkphp建站网址阜宁住房和城乡建设局网站
  • 黑彩网站充值就给你做单子网络推广公司运作
  • 永久免费手机网站自助建站钉钉邮箱登录入口
  • 西樵网站设计制作网站颜色搭配表
  • 长春建设工程管理中心网站怎么用wordpress模板
  • 安徽省建设工程质量安全监督总站网站中文域名注册查询官网
  • 网站seo优化工具wordpress安装语言设置中文
  • 网站开发公wordpress站群插件
  • 营销网站做的好的公司廊坊网络推广公司
  • 常州市建设项目审批网站东庄水利建设公司网站
  • 郑州网站建设咨询wordpress模板建站
  • 西充县规划建设局网站网站建设应当注意哪些问题
  • 搭建本地视频网站世赛网站开发与设计
  • 个人建设网站成本wordpress可以企业网站
  • 如何设计一个网站seo快速排名案例
  • 博罗网站建设活动网站推广
  • 模板网站购买北京高档网站建设
  • 欧美网站建设风格特点企业注册app下载
  • 网站开发合同 下载友情链接交换平台源码
  • 有哪些网站可以做电子邀请函怎样做一元购网站
  • 莆田自助建站软件怎么为网站做外链
  • 网站建设与管理自考今天的热点新闻