【Gamystery】EP6 | PCG 到底怎麼用 Part 1
- 彥澤 廖
- 2024年4月21日
- 讀畢需時 4 分鐘
已更新:2024年4月28日
前言
在前一篇【Gamystery】EP5 | PCG Bridge練習。我很快的嘗試了Unreal Engine對於場景製作推出的新功能。在GDC上簡單的展示了,如何使用這個新系統,礙於展示時間限制,感覺得到挑選範例以簡單、容易解說為主。有興趣也可以先看看,一分鐘的官方的展示。
上次練習後,對於這項功能長遠的目的性、地位,沒有得到太多的解答。於是找了官方詳細的解說直播,總長兩小時再多一點。
接下來會拆解、整理範例的生成過程、PCG的重點與技巧,最後在分享我整個系統會有哪些看點、潛在的問題。
進入正題…
Procedural Generation Content
Procedural Generation Content( 簡稱PCG ) , 將程序生成與美術製作結合的系統。利用了圖形化的編輯方式方式,製造高變異性的場景。
本篇整理Unreal 官方解說自家出的使用案例PCG Demo Project - Electric Dreams,部分內容。
整個影片長達兩小時,大致上提到五個內容:
Simple Demo
解說 PCG Level Part 1 - PCGDemo_Ground
解說 PCG Spline Example
解說 PCG Level Part 2 - LargeAssemblyGraph
PCG World Compoent
由於內容眾多,礙於篇幅,本篇會著重在第二階段的紀錄與重點整理。會分享我的理解,以PCG Grpah 搭配結果的方式說明。希望可以幫助讀者更快理解和上手PCG的功能。
主要的檔案:
地圖Level - CloseRange
生成器PCG Graph - PCGDemo_Ground
以這個案例來說, PCG的製作大致可分為兩個階段:
空間的建置: 此階要讓PCG的節點( Point Data ) 能正確地產生,可能是依形狀、地形、線條…等 不同的方式。
物體的產生、擺放: 在有足夠多的節點後,可以開始疊加要產生的物體,可以是Static Mesh或是Actor。
PCG Graph 內容解說
先幫助大家建立內容框架, 兩個主要的檔案
Level - ElectricDreams_PCGCloseRange
共分為三個區塊,分別是獨立的物件,各自也都使用不同的PCG邏輯完成。後續展示主要討論第二區塊的部分。後續再補充其他區域。
PCGDemo_Ground
看到第二區塊的PCG邏輯。大致上可分為兩個主要的階段。
空間取樣: 要根據美術設定的外型,對空間產生節點
物件生成: 依照物件擺放邏輯,標記符合需求的節點,並產生對應物件
Step 1-1. 根據Spline的形狀產生基本的節點
以本案例來說,總共用到了兩個Spline,一個用瞭展現凹地的整體形狀,另一個則是圖a.中,編號一區塊的外型。
根據不同應用,Spline可以替換成Landscape, Static Mesh…等物件,當有多個相同類型的物件時,則透過標籤( Actor Tag )的方式辨識。
對兩條線都做節點的取樣後,可以看到下列結果。
Step 1-2. 排除特地區域
從圖a.可以觀察到,有刻意保留了進入這個區域的入口與出口。
主要是透過空間( Volume ),與前一個階段產生的節點做個重疊的判斷 ,讓圖形保持開放。
Step 1-3. 根據Spline的形狀產生基本的節點
計算外部區域節點到兩個邊界的距離( 離邊界越近會呈現黑色 )
Step 1-4. 改變內圈的節點的方向
這個步驟比較難理解。
主要是改變靠近內圈的節點的方向,讓他遵循內圈的Spline的方向,除了視覺上比較合理外。也是考慮到當內圈的方向性有改變時,畫面上出現強烈的銜接感。
修改前,只有單一的方向
修改後,內圈節點遵循內圈的Spline
Step 1-5. 創造高度差異
如果地板平平的一定不好看,PCG 產生的節點,如果未特別調整,會過於整齊,非常的不自然。這個步驟增加了節點高地的差,來創造更好的視覺效果。
這邊表示了PCG節點有各種屬性,是可以根據需求修改單個屬性的數值。要修改哪個屬性,個案判斷。
( 指定Z軸數,創造高度差異 )
Step 2-1. 保留所需空間,產生地板
Step1產生的節點,成為主要的基礎。後續,根據不同物件適合擺放、產生的位置,來篩選出適合的節點。
Density篩選出靠近邊界的節點
產生地面
產生石頭
產生水窪、青苔..
由於所有節點都是根據兩個Spline之間的關係所產生。
就能產生編輯後自動適應,變化出新的樣貌的效果
Step 2-2. 保留所需空間,產生植被
基於相同概念,產生植被相關的物件。特別的點在於,木頭的產生有考慮到視覺上的效果,刻意地,排除與Volumn的重疊的節點。
當區域被其他物體佔住空間後,該空間就不再產生枯木。.
Step 2-3. 添加凹地中間的生態
在Graph中有是增加物件在中間濕地的區塊,製造出豐富的自然效果。
效果會根據場景上是否有物件( LargeAssembly )有些微差異。
為了方便理解,手動刪除名為LargeAssembly的物件。
整個中間生態的產生,依循著同樣的邏輯。1.篩選正確的節點, 2.產生物件。
特別的是,產生小草的部分,有提到特別的Custom Node - DiscardPointsInBumpyAreas,排除部分突起的點。如何定義突起的條件則是可以自己設定。
產生靠岸的石頭
實用的技巧
有三個不斷在影中出現的動作,自己研究時也常常用的。分享給大家:
1.Hide All Spawner
PCG 系統是線性是進行居多,產生物件通常都是最後一步。那可以先關閉生成的物件Graph Element,以便觀察前面階段的成果。
2.Debug Node and Inspect
每個節點都可以開啟除錯( Debgu )模式,就會顯示該節點在畫面上的結果。也可以選擇同時多個節點啟用,就會疊加再一起,使用時要注意。
監看( Inspect )則可以呈現Graph Element收到的節點呈現出來,主要是可以查看數值狀態與可以利用的屬性。
3.Add Actor Tag to Specify
要做到與空間的互動,通常需要先找到一個對象,可以是Static Mesh, Spline, Landscape..等,並加上標籤,以利於系統找到對應的物件。需要考慮的是,可能會增加不同檔案之間的耦合性,也就是必須相關的檔案都必須同時出現在場上時,才能正常運作。