注意
:考慮到優化的內容比較多,我將該內容分開,并全部整合放在【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,如果學習過程中遇到任何問題,也歡迎你評論私信找我。
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,你的每一次支持
都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!