注意:考虑到优化的内容比较多,我将该内容分开,并全部整合放在【unity游戏开发——优化篇】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前言
  • 实战
    • 1、确保所有静止的3D物体都标记为`Occluder Static静态遮挡体`和`Occludee Static静态被遮挡体`
    • 2、然后在顶部菜单中找到`遮挡剔除`选项
    • 3、点击“烘焙”
    • 3、若要预览结果,请切换到可视化标签页
    • 4、选中摄像机调整角度查看效果
  • 补充知识
    • 1、烘焙参数介绍
    • 2、遮挡剔除
    • 3、孔洞剔除
    • 4、Occlusion Area自定义遮挡区域
    • 5、Occlusion Portal动态遮挡入口
    • 6、可移动的物体
  • 专栏推荐
  • 完结

前言

遮挡剔除是一种渲染技术,通过不绘制被其他物体遮挡的物体或者隐藏摄像机视角外的物体来提高性能。使用遮挡剔除仅渲染玩家可见部分,这非常适用于静态关卡。

在游戏中,我们没有必要渲染那些看不见的建筑,因为它们对你来说是没意义的。这就是遮挡剔除发挥作用的地方了,它将场景分割成更小的部分,然后检查给定的单元是否能被摄像机看到。如果单元可见,那么其中的物体也是可见的,如果不可见,它们都会被隐藏。

实战

1、确保所有静止的3D物体都标记为Occluder Static静态遮挡体Occludee Static静态被遮挡体

一般来说,小物体通常被用作被遮挡体,因为它们很少覆盖其他物体。而大物体如墙壁则被用作遮挡体

注意:地面也要设置为静态

在这里插入图片描述

2、然后在顶部菜单中找到遮挡剔除选项

在这里插入图片描述

3、点击“烘焙”

在这里插入图片描述

注意:如果上次烘培后,静态物体发生改变,比如修改了位置,可视化效果可能会与当前烘培设置以及遮挡区域放置有出入。所以每次修改都要记得重新进行烘培。

3、若要预览结果,请切换到可视化标签页

在这里插入图片描述

4、选中摄像机调整角度查看效果

在场景视图中,可以看到仅渲染相机能看到的内容,这能帮你很好的提升游戏性能。
在这里插入图片描述

补充知识

1、烘焙参数介绍

在这里插入图片描述

  • 最小遮挡物:我们可以设置打算阻挡其他物体可见性的物体的大小。所以如果我们在这里设置一个值,比如0.5。那么所有大于这个值的物体将被视为遮挡者,并隐藏其他物体。最小遮挡物也决定了单元格的大小。较小的值增加了精度,但也增大了遮挡数据的大小。
  • 最小孔:允许Unity在遮挡剔除过程中忽略非常小的洞。这避免了通过非常小的洞渲染那些遮挡物体。比如默认是0.25,也就是墙洞小于等于0.25时,会被看成是一面完整的墙进行遮挡。
  • 背面阈值:背面阈值是一项大小优化,通过视测试背面来减少不必要的细节。如果我们把背面阈值设置为100,不会移除任何背面。如果我们减小这个值,我们就可以决定一个给定单元格中背面可以占多少比例。建议把这个值保持在100,因为通常来说,有效的摄像机位置是看不到很多背面的。除非我们想要在一个非常复杂的场景中减少遮挡数据的大小,例如,位于地形下方和实体对象内部的几何体就可以移除。

2、遮挡剔除

我们创建一个5x5x1大小的物体设置为Occluder Static静态遮挡体,并在它后面创建一些设置为Occludee Static静态被遮挡体的小立方体

注意:地面也要设置为静态

在这里插入图片描述
重新烘培发现,后面的小立方体没有被遮挡剔除
在这里插入图片描述
为什么呢?

因为前面我们介绍过最小遮挡物这个参数,默认它是5,那么所有大于这个值的物体才会被视为遮挡者。所以我这我们可以调小这个值,比如改成1,再次点击烘培。

可以看到,遮挡着就起效果了
在这里插入图片描述

注意:要记得开启相机的遮挡剔除选项,不然可能不会有效果。虽然它默认就是开启的,但是我感觉还是有必要提醒一下。
在这里插入图片描述

3、孔洞剔除

我创建两个立方体,同样设置为Occluder Static静态遮挡体,它们相距1米,模拟孔洞效果
在这里插入图片描述
默认情况下,我们肯定不会剔除后面的物体,因为最小孔参数配置是0.25
在这里插入图片描述

如果我们把这个值改成1,再进行烘培
在这里插入图片描述
可以看到,后面的物体就被遮挡剔除了
在这里插入图片描述

4、Occlusion Area自定义遮挡区域

添加自定义遮挡区域
在这里插入图片描述
或者自己添加Occlusion Area组件
在这里插入图片描述
然后我们可以设置一个区域的边界
在这里插入图片描述
前往烘培选项,修改参数,比如这里我修改最小遮挡物为0.1,再点击烘培
在这里插入图片描述
效果
在这里插入图片描述
多亏这样,在烘焙遮挡区域时,我们可以指定某区域被分成更小的单元格,而其他将被分成更大的单元格。通过使用遮挡区域,我们可以确定哪里精度应该更高,哪里可以更低。

如果我们没有指定这样的区域,而是将整个地形都分成更小的单元格,这会增加烘焙时间和遮挡数据的大小。

这在房子内部尤其有用,因为通常那里的物体比外面更多。
在这里插入图片描述

5、Occlusion Portal动态遮挡入口

Occlusion Portal遮挡入口组件是一个特定的盒状组件,可以标记为打开或关闭。记得添加它需要重新进行烘培生效。
在这里插入图片描述
如果它是打开的,那么这个体积不会作为遮挡者起作用
在这里插入图片描述
而当我们关闭它时,它就像一个遮挡者,并且可以遮挡其后的物体。
在这里插入图片描述
它就像是动态的遮挡者,它们不能移动,但可以被打开或关闭,而且每次修改打开或关闭参数不需要重新烘培。

这在房间中有门的情况下很有用。
在这里插入图片描述
我们希望门是遮挡者,但在打开门之后,门后面的物体都应该可见。关门关闭它,门后面的物体剔除。

我们可以通过一个简单的脚本来实现这一点。

myOcclusionPortal.open = true;

6、可移动的物体

可移动的物体在运行时可以是遮挡者,但它不能遮挡静态物体。(能被遮挡,但是遮挡不了别人

添加同一个脚本,控制物体往返运动

using UnityEngine;public class PingPongMovement : MonoBehaviour
{[Header("移动设置")][SerializeField] private float speed = 2f;[SerializeField] private float distance = 5f;private Vector3 startPosition;private void Start(){startPosition = transform.position;}private void Update(){// 使用PingPong函数在0到distance之间来回变化float x = Mathf.PingPong(Time.time * speed, distance);// 计算新位置transform.position = startPosition + Vector3.right * x;}
}

将脚本挂载在可移动的物体上,并标记为Occludee Static静态被遮挡体

注意:这个动态物体只能被标记为Occludee Static静态被遮挡体,如果标记为Occluder Static静态遮挡体,烘培后,会出现问题,比如遮挡体移开了,但是遮挡效果还在,导致还是看不到后面的物体。所以可移动的物体设置千万不要标记为Occluder Static静态遮挡体

在这里插入图片描述
运行游戏,查看效果
在这里插入图片描述


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】
【unity游戏开发——编辑器扩展】
【unity游戏开发——热更新】
【unity游戏开发——网络】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88026.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88026.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88026.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通用业务编号生成工具类(MyBatis-Plus + Spring Boot)详解 + 3种调用方式

在企业应用开发中,我们经常需要生成类似 BZ -240704-0001 这种“业务编号”,它通常具有以下特点:前缀:代表业务类型,如 BZ 表示包装日期:年月日格式,通常为 yyMMdd序列号:当天内递增…

前端相关性能优化笔记

1.打开速度怎么变快 - 首屏加载优化2.再次打开速度怎么变快 - 缓存优化了3.操作怎么才顺滑 - 渲染优化4.动画怎么保证流畅 - 长任务拆分2.1 首屏加载指标细化:1.FP(First Paint 首次绘制) 2.FCP(First contentful Paint 首次内容绘制),FP 到 FCP 中间其实主要是 SPA…

7.7晚自习作业

实操作业02:Spark核心开发 作业说明 请严格按照步骤操作,并将最终结果文件(命名为:sparkcore_result.txt)于20点前上传。结果文件需包含每一步的关键命令执行结果文本输出。 一、数据读取与转换操作 上传账户数据$…

手机FunASR识别SIM卡通话占用内存和运行性能分析

手机FunASR识别SIM卡通话占用内存和运行性能分析 --本地AI电话机器人 上一篇:手机无网离线使用FunASR识别SIM卡语音通话内容 下一篇:手机通话语音离线ASR识别商用和优化方向 一、前言 书接上一文《阿里FunASR本地断网离线识别模型简析》,…

虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕

和大家分享一个以前收集的UE5虚幻引擎恐怖游戏开发教程,这是国外一个大神制作的视频教程,教程从零开始到制作出一款完整的游戏。内容讲解全面,如蓝图基础知识讲解、角色控制、高级交互系统、高级库存系统、物品检查、恐怖环境氛围设计、过场动…

多人协同开发时Git使用命令

拉取仓库代码 # 拉取远程仓库至本地tar_dir路径 git clone gitgithub.com:your-repo.git target_dir # 默认是拉取远程master分支,下面拉取并切换到自己需要开发的分支上 # 假设自己需要开发的分支是/feature/my_branch分支 git checkout -b feature/my_branch orig…

线性表——双向链表

线性表——双向链表1. 双向链表的实现1.1 简单图例1.2 结点的定义1.3 新结点的创建1.4 链表的初始化1.5 结点的插入1.5.1 头部插入(头插)1.5.2 尾部插入(尾插)1.5.3 任意位置(前)插入1.6 结点的删除1.6.1 头…

Java后端技术博客汇总文档

文章目录 前言Java后端汇总链接Java基础知识点数据结构算法(Java实现)算法知识点合集算法刷题算法竞赛AcWing课程蓝桥杯AB组辅导课合集(更新中…) 源码分析redission 数据库SQL ServerMySQLRedis -Canal JUC并发编程JVMNetty日志框…

QT 菜单栏设计使用方法

目录 常用设置函数 多个QAction的单选设置 ​​​​​​​菜单相关类 ​​​​​​​ 系统菜单的生成和响应 使用代码添加系统菜单 使用UI设计器设计系统菜单 使用Qt设计及界面时,常用的两种方式添加菜单,第一使用UI界面添加,第二种 在…

AIGC领域AI艺术,打造个性化艺术作品

AIGC领域AI艺术,打造个性化艺术作品 关键词:AIGC、AI艺术、生成对抗网络、个性化创作、深度学习、艺术风格迁移、创意计算 摘要:本文深入探讨了AIGC(人工智能生成内容)在艺术创作领域的应用,重点分析了如何利用AI技术打造个性化艺术作品。文章从技术原理出发,详细解析了生…

基于Flask+Jinja2的快捷教务系统(后端链接到新版正方教务系统)

快捷教务系统(Easy Educational Administration Management System, EasyEAMS) 项目简介 EasyEAMS 是一个基于 Flask Jinja2 的现代化教务系统 Web 应用。学生可通过网页端登录,在线查询个人信息、成绩、课表、学业生涯、通知、选课等。系…

EDM自动化与出海独立开发实用教程

随着互联网全球化发展,越来越多的独立开发者(Indie Developer)选择将自己的产品推向海外市场。如何高效地获客、激活用户、提升转化率,成为出海过程中必须解决的问题。EDM(电子邮件营销)自动化,…

「日拱一码」017 深度学习常用库——TensorFlow

目录 基础操作 张量操作: tf.constant 用于创建常量张量 tf.Variable 用于创建可训练的变量张量 tf.reshape 可改变张量的形状 tf.concat 可将多个张量沿指定维度拼接 tf.split 则可将张量沿指定维度分割 数学运算: tf.add 张量的加运算 tf.su…

ARM DStream仿真器脚本常用命令

以下是ARM DStream仿真器脚本中常用的命令及其功能分类,结合调试流程和典型应用场景整理: ⚙️ 一、连接与初始化命令 connect 建立与目标设备的连接,需指定接口类型(如JTAG/SWD)和处理器核心。 示例:conne…

vscode 调试unity

lanch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “Attach to Unity”, “type”: “vstuc”, “request”: “attach” } ] }

金融IT入门知识点

银行金融IT核心知识点全解析:架构、技术与实践 一、金融IT的战略地位与行业特性 金融IT作为银行业务的核心支撑体系,其发展水平直接决定了银行服务的效率、安全性与创新能力。截至 2025年,中国银行业线上化业务占比已达97%,手机银…

C++——手撕智能指针、单例模式、线程池、String

智能指针今天我们来学习一下C中的智能指针,如果有人不知道C中的智能指针的概念的话:C智能指针是一种基于RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制的高级内存管理工具,用于自动化…

Mybatis----留言板

基础项目:留言板 截止到目前为止,我们已经学习了 Spring(只学习了DI)、Spring MVC、SpringBoot、Mybatis 这些知识了,已经满足了做简单项目的基本要求了,所以接下来我们就从0到1实现表白墙项目。 需求分析…

Web-API-day3 DOM事件进阶

一、 事件流 1.事件冒泡 const fa document.querySelector(.father)const son document.querySelector(.son)document.addEventListener(click, function () {alert(我是爷爷)})fa.addEventListener(click, function () {alert(我是爸爸)})son.addEventListener(click, fun…

小波增强型KAN网络 + SHAP可解释性分析(Pytorch实现)

效果一览一、传统KAN网络的痛点与突破 1. 传统KAN的局限性 传统Kolmogorov-Arnold网络(KAN)虽在理论上有可靠的多变量函数逼近能力,但存在显著瓶颈: 计算效率低:训练速度慢于MLP,资源消耗大,尤其…