top of page

【Gamystery】EP6 | PCG 到底怎麼用 Part 1

已更新:2024年4月28日

前言

  在前一篇【Gamystery】EP5 | PCG Bridge練習。我很快的嘗試了Unreal Engine對於場景製作推出的新功能。在GDC上簡單的展示了,如何使用這個新系統,礙於展示時間限制,感覺得到挑選範例以簡單、容易解說為主。有興趣也可以先看看,一分鐘的官方的展示


  上次練習後,對於這項功能長遠的目的性、地位,沒有得到太多的解答。於是找了官方詳細的解說直播,總長兩小時再多一點。



 接下來會拆解、整理範例的生成過程、PCG的重點與技巧,最後在分享我整個系統會有哪些看點、潛在的問題。


進入正題…


Procedural Generation Content

Procedural Generation Content( 簡稱PCG ) , 將程序生成與美術製作結合的系統。利用了圖形化的編輯方式方式,製造高變異性的場景。


本篇整理Unreal 官方解說自家出的使用案例PCG Demo Project - Electric Dreams,部分內容。

整個影片長達兩小時,大致上提到五個內容:

  1. Simple Demo

  2. 解說 PCG Level Part 1 - PCGDemo_Ground

  3. 解說 PCG Spline Example

  4. 解說 PCG Level Part 2 - LargeAssemblyGraph

  5. PCG World Compoent


由於內容眾多,礙於篇幅,本篇會著重在第二階段的紀錄與重點整理。會分享我的理解,以PCG Grpah 搭配結果的方式說明。希望可以幫助讀者更快理解和上手PCG的功能。


主要的檔案:

  1. 地圖Level - CloseRange

  2. 生成器PCG Graph - PCGDemo_Ground


 以這個案例來說, PCG的製作大致可分為兩個階段:

  1. 空間的建置: 階要讓PCG的節點( Point Data ) 能正確地產生,可能是依形狀、地形、線條…等 不同的方式。

  2. 物體的產生、擺放: 在有足夠多的節點後,可以開始疊加要產生的物體,可以是Static Mesh或是Actor。


PCG Graph 內容解說


先幫助大家建立內容框架, 兩個主要的檔案


Level - ElectricDreams_PCGCloseRange

  共分為三個區塊,分別是獨立的物件,各自也都使用不同的PCG邏輯完成。後續展示主要討論第二區塊的部分。後續再補充其他區域。


a.案例地圖_原貌

PCGDemo_Ground

  看到第二區塊的PCG邏輯。大致上可分為兩個主要的階段。

  1. 空間取樣: 要根據美術設定的外型,對空間產生節點

  2. 物件生成: 依照物件擺放邏輯,標記符合需求的節點,並產生對應物件


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..等,並加上標籤,以利於系統找到對應的物件。需要考慮的是,可能會增加不同檔案之間的耦合性,也就是必須相關的檔案都必須同時出現在場上時,才能正常運作。









bottom of page