Engine

遊戲引擎:場景圖、元件、腳本、物理、PBR 管線、世界編輯器,以及桌面與行動裝置的原生組建。

一句話說明#

一個完整的遊戲引擎,就在瀏覽器裡:建構一個場景、賦予它行為、按下播放,然後把它匯出到網頁,或匯出成一個原生的桌面與行動裝置執行檔。

它是 aukimi 裡最大的工作室,而且差距懸殊。這個頁面按照介面本身的方式來對應內容,也就是依照每個面板所在的抽屜分類,而不是按字母順序列出功能。

版面配置#

Engine,含場景圖、視口、屬性面板和主控台

選單列File · Edit · View · Windows · Run · Plugins
工具列專案名稱、復原/取消復原、視口模式切換(3D · 2.5D · 2D · TXT)、場景選擇器、四個面板按鈕、FX Master、HUD、解析度欄、傳輸控制(播放、暫停、停止)和 Build
左側一排圖示、場景圖、清單、音訊、主控台,以及它所開啟的面板
中央視口,附有自己的 gizmo 列(平移、旋轉、縮放、世界/本地座標、格線、貼齊、取景)和一個品質選擇器
右側選取實體的屬性面板
底部ConsoleProfiler,並排顯示
狀態列模式、視口尺寸、實體數量、格線狀態

四個面板按鈕#

Engine 工具列:場景名稱、復原、視口模式切換、四個面板按鈕與傳輸控制

它們的行為並不完全一樣,而這個差異,值得在你去找東西之前先弄清楚:

按鈕行為
Systems打開一個抽屜
Tools打開同一個抽屜,Systems 和 Tools 會互相關閉對方
Assets切換一個常駐的停靠面板
Scripts打開一個彈出視窗

Systems 和 Tools 刻意共用同一個位置;它們被並排放置,就是為了讓這件事看得出來。

Systems#

引擎自己的子系統:一個場景擁有的東西,而不是你用來製作的東西。

群組面板
Plugins外掛瀏覽器
RenderingRendering · Rendering Pipeline · Look Presets · Shader Lab · Render Style · Shadows · Mesh LOD · Post Process Volumes
GameplayMultiplayer room · Physics · AI & Navigation · Gameplay Zones
WorldScene Graph · Level Streaming · Baking · Light Probes · Decals

Rendering#

工具列上的 FX Master 開關可以一鍵開關整條後製管線:這是查看它到底花費你多少成本最快的方法。逐一列出:泛光、景深、SSR、SSAO、GTAO、SSGI、時間性抗鋸齒、FXAA、動態模糊、體積霧、接觸陰影、調色分級、膠片顆粒、色差、暈影和色調對映,外加 Nanite 風格的幾何處理和 Hi-Z 遮蔽剔除。

Look Presets(外觀預設)是以上這些的整套組合。Render Style(算圖風格)會改變畫面的調性,從照片寫實轉為風格化。Shader Lab(著色器實驗室)是你自己撰寫著色器的地方。Mesh LODPost Process Volumes 是在大型場景裡最能回本的兩項:每個 mesh 各自的細節層級,以及只在一個體積內部套用的後製處理。

算圖引擎是 Babylon.js。它會先以 WebGL 啟動,瀏覽器支援時再換成 WebGPU,失敗時也會自動退回。

Gameplay systems#

Physics(物理)涵蓋 3D 解算器(Havok)和 2D 解算器兩者。AI & Navigation(AI 與導航)就是導航網格及其上的代理者。Gameplay Zones(玩法區域)是附加了行為的觸發體積。Multiplayer room(多人連線房間)把場景連接到一個 Colyseus 伺服器(見下文)。

World systems#

Level Streaming(關卡串流)會隨著玩家移動,載入與卸載關卡的各個部分。Baking(烘焙)預先計算光照;Light Probes(光照探針)擷取空間中特定點的間接光與反射。Decals(貼花)能在不新增幾何體的情況下,把細節投影到表面上。

Tools#

用來製作的東西。

群組面板
EditorsScripts · Blueprint Editor · UI Editor · Tilemap
WorldSky Studio · Terrain · Water · Tree Generator · Plant Generator · Rock Generator · Kitbash
GameplayInventory · Data tables · Dialogue Trees
AnimationTimeline · Cinematic Sequencer · Camera Tools
AudioAudio Manager
DebugProfiler

World generators#

地形、水域、天空,以及四種內容產生器:樹木、植物、岩石與套件組合零件。它們在下方有自己的一個章節

Gameplay authoring#

Inventory(庫存)、Data tables(資料表,Tools → Data)和 Dialogue Trees(對話樹)是三個能讓遊戲擁有內容、而不必把內容寫死在程式碼裡的編輯器(詳情見下方)。

Animation#

Timeline(時間軸)用於實體動畫,Cinematic Sequencer(運鏡序列器)用於鏡頭,Camera Tools(攝影機工具)用於取景。詳見動畫與攝影機

世界編輯器#

Tools → World 底下的七個面板。它們是快速填滿一個場景的方法,也是一個關卡不必從一場建模作業開始的原因。

Terrain#

一個場景可以容納好幾個地形;每一個都是 Terrains 清單裡的一列,並以三種解析度之一建立:128²(快速)、256²(平衡)或 512²(精細)。

這個面板有十種模式,它們有一個共通點:在 Masks 裡繪製的遮罩會限制它們每一個。

模式作用
Sculpt在高度場上使用十七款筆刷
Paint最多八個貼圖圖層,橫跨兩張 splatmap
Generate雜訊、自動貼圖,以及真實世界高程資料匯入
Sketch畫出稜線與山谷,合成出對應的地形
Masks把其他每一種模式限制在表面的一部分
Water海平面,以及在地形水域和 FFT 海洋之間選擇
Paths烘焙進地面的一條貝茲曲線道路
Vegetation以筆刷或規則為基礎的散布
SDF一個以光線行進算圖、而非以 mesh 呈現的地形
Biomes一次處理土壤、植物、樹木與岩石

Sculpt。 Raise(提高)1、Lower(降低)2、Smooth(平滑)3、Flatten(拉平)4、Pinch(收縮)5、Inflate(膨脹)6、Noise(雜訊)7、Sharpen(銳化)8、Stamp(印花)9、Terrace(階梯)0、Erode(侵蝕)E、Fill(填平)F、Clone(仿製)CAlt+點擊設定來源)、Blur(模糊)B、Ramp(斜坡)R,另外還有兩個水利工具:River(河流)畫出一條水道,Lake(湖泊)則在一個點上填出湖泊。

筆刷本身帶有動態設定:壓力曲線、懶惰滑鼠、衰減、對稱、圖樣,以及作用在大小和強度上的抖動。Stamp(印花)帶有六種形狀:坑洞、山峰、高原、河谷、圓頂、雜訊丘。侵蝕有兩種形式:E 筆刷是局部性的,而 Adjustments(調整)則會對整個地形套用水力熱力風力侵蝕。

Paint。 八個圖層,因為兩張 RGBA splatmap 各自能容納四個通道。材質庫依類別排序:草地、泥土、森林、岩石、道路與表面、懸崖、沙地、雪地、火山、濕地、奇幻,以及你自己的材質,每個圖層都帶有 UV 縮放、位移、細節貼圖,以及表面浮雕(凹凸強度與視差深度)。**Break texture tiling(cell bombing,打散貼圖重複)**這個設定,能讓重複的地面貼圖不會被看出是一格一格的。

Generate(產生)以雜訊為基礎建構,接著 Generate Textures(產生貼圖)會依高度和坡度指定材質,並帶有南北向的陰影變化,以及有水的地方會出現沙灘或礫石岸線。Real World(真實世界)會匯入公開的 NASA/USGS 高程圖磚:挑選一個地標,或直接輸入座標,選擇縮放程度,面板會回報它取回的高程範圍。

Sketch(草繪)是另一種切入方式。在一張 2D 地圖上畫出稜線與山谷筆觸,最多挑選三個真實的來源地景,地形就會被合成出來以符合這張草圖,可以選擇與現有的地形混合,並在同一道流程中自動貼圖與侵蝕。

Masks(遮罩)用筆刷繪製,接著可以整體編輯:清除、反轉、模糊、擴張、縮小。智慧遮罩則直接從地形本身推導出一個遮罩:依高度、依坡度、依圖層,或依凹陷程度。

Paths(路徑)。 點擊放下控制點,一條平滑的曲線就會穿過它們;拖曳琥珀色的點來移動它們,拖曳青色的控制桿來彎曲曲線。Bake Path(烘焙路徑)會把底下的地面拉平、繪上貼圖,並築起路堤。

**Vegetation(植被)**有兩個部分。筆刷用來手動放置與移除實例;散布規則則依條件、圖層權重、種子值、最小/最大縮放,以及每個素材接受的高度與坡度範圍來放置它們。草和花會在一個可設定的繪製距離之外淡出,Export to Scene(匯出到場景)能把這些實例變成場景物件。

Biomes(生態群系)是以上所有功能的一鍵版本:選一個生態群系,勾選你想要的類別(土壤、樹木、植物與草、花朵、水邊藻類、岩石),設定一個密度,Apply Biome(套用生態群系)就會繪製地面並散布所有東西,並回報每一種各放置了多少個實例。樹木的年齡變化會混合從樹苗到古樹的各種樣貌,而不是到處蓋上同一棵樹,ground blend (RVT)(地面融合)則會把每塊岩石的底部融入它下方的地形顏色。

SDF 是一種不同的算圖器,而不是一個不同的工具:地形是從一個距離場以光線行進方式算圖出來的,形狀由八度音、間隙度和持續度決定,貼圖依草地/岩石/雪地並附有雪線與坡度閾值,還有它自己的柔和陰影、環境光遮蔽和霧效。

大型地形有一套 LOD 系統,附有裙邊幾何(用來封閉層級之間的縫隙)、平滑的層級過渡、視錐剔除,以及一個統計數據覆蓋層。高度圖以 16 位元 PNG、8 位元 PNG 或 16 位元 RAW 格式匯入匯出;splatmap 可以是一張 RGBA PNG,或每個圖層各一個檔案;整個地形,或只有它的設定,都可以另存為一個預設集。

Sky Studio#

大氣層。四種天空類型:純色、漸層、HDRI,以及一個物理大氣,具備瑞利散射與米氏散射、米氏吸收、臭氧、地表反照率、渾濁度、行星半徑和大氣厚度。

一切都圍繞著時刻運作,它可以自行循環:太陽依仰角、方位角和強度變化,有自己的陰影強度;月亮依相位變化;星星帶有閃爍效果;還有極光。體積雲具有厚度、侵蝕、雜訊尺度和捲曲扭曲,並透過吸收、散射、環境光和一個粉狀項來處理光線;卷雲和金星帶是分開的。空氣透視是隨距離增厚、讓遠處幾何體淡入地平線的霧霾,正是這個設定,讓一片地景讀起來夠遼闊。

十種預設可以作為起點:晴天、黎明、日落、黃昏、夜晚、陰天、暴風雨、沙漠、極地和太空。

Water#

兩個分頁:Ocean (FFT) 用於開闊海域,Shore & lakes 用於其他所有情況。

⚠️ 水域是在 Terrain 編輯器裡建立的:透過河流與湖泊工具,或 Show Water(顯示水域),然後在這裡調整。在一個沒有水域的場景上打開這個面板,只會得到一堆沒有東西可以套用的設定。

岸邊水域帶有顏色、不透明度、波浪強度與速度、波紋雜亂度、泡沫寬度和菲涅耳效應,加上螢幕空間反射和折射模糊。底下則是 WGSL 著色器本身:兩組各自擁有捲動方向與速度的法線縮放、泡沫閾值與柔和度、折射強度與折射率,以及水中的光線:吸收、渾濁度、散射與半透明度。

Tree Generator#

兩種模式,Tree(樹木)和 Trunk(樹幹)。一棵樹可以是落葉或常綠,年齡從樹苗到古樹都有,狀態可以是活著、枯死、斷木,或倒下的原木。一切都由種子值決定,所以 Randomize seed(隨機種子值)是取得一棵風格相同、外觀不同的樹最快的方法。

形狀是逐分支層級設定的:子分支數、長度、半徑、錐度、扭結程度、扭轉、剖面段數、分段數、角度和起始高度,外加自然變異、向光性向地性:這兩者讓樹木朝向光源傾斜、在自身重量下低垂,還有一個自帶強度的全域作用力。樹基有根部外擴(裂片與高度)和板根。

葉片是廣告牌式的,單面或雙面,具備數量、大小、角度、變異、聚簇、捲曲、下垂、光澤和圓潤法線等參數。樹皮有六種風格:溝紋、白楊、松樹、樺樹、光滑、棕櫚,並帶有浮雕、苔蘚、潮濕基部、日曬褪色、樹冠環境光遮蔽和秋色轉變。四個季節可以一次切換整體外觀。

**Forest(森林)**可以一次散布大量樹木:數量、散布半徑、縮放變異,以及年齡組合(單一、自然、年輕、年老、平均分布)。Add age progression(加入年齡漸變)會把全部五個生命階段排成一列,這是並排比較它們最快的方法。一棵樹可以以場景實體或 GLB 的形式輸出,任何設定都可以另存為一個預設集。

Plant Generator#

五種類型:花、簇生植物、草本、蕨類、草,共用莖部(數量、高度、粗細、彎曲度、顏色)和葉片(數量、大小、寬度、角度)參數。蕨類額外具備小葉對數、小葉展開角和葉片弧度;草則額外具備葉片數量和弧度。

任何一種都可以選擇加上花朵:花瓣、花瓣列數、長度、寬度、捲曲度、尖端銳利度、綻放程度、花心大小,以及三種顏色:花瓣、花瓣尖端和花心,並附有半透明度和粗糙度,用來決定光線穿過葉片的方式。可以把它加入場景、散布多株,或匯出成 GLB。

Rock Generator#

三種類型:岩石、石塊、懸崖,各有三種風格:寫實、卡通,或帶輪廓線的低多邊形。

形狀是套用在球體上的雜訊:尺度、強度、八度音、持續度、扭曲,以及一個稜狀選項,外加自帶頻率的地層紋理,以及帶有深度和銳利度、用於呈現有稜有角石塊的切面。半徑、細節、拉平、形狀變異和一個平底選項決定了輪廓,四種侵蝕預設:新鮮、風化、自然、侵蝕,可以一次調動全部這些參數。

表面具備顏色變化、礦脈紋理、地衣與苔蘚、附有重複與強度設定的細節貼圖、三平面混合和視差浮雕。它預設使用內建的 Stone 材質;把一個材質從 Matter 送到 Engine,即可覆蓋它。

Kitbash,與 Sculpt 共用的庫#

Kitbash 與 Sculpt 共用:這個面板和 Sculpt 的 Edit Forge 讀取的是同一個庫。在那邊建構的零件可以放置在這裡,在這裡繪製的零件也可以存回那個庫。

場景儲存的是這個零件與它的尺寸,而不是它的頂點,這就是為什麼一棟以套件組合出的建築,在檔案裡幾乎不佔任何空間,並且之後還能從它的來源更新。

從目錄裡選取一個零件,之後每次左鍵點擊都會放置它。三種貼齊模式決定它落在哪裡:on terrain(貼地形,零件會跟隨它們底下的地面高度)、on water(貼水面,建構平面會停在水位上),以及 snap to sockets(貼齊插槽),瞄準一個已放置零件上的連接點,新零件就會轉向去對接它。一條鏈會從它的自由端持續生長,已被佔用的插槽會從候選名單中移除,每次點擊都是各自獨立的一個復原步驟。Ctrl/Cmd 仍然保留給選取使用,Alt 則用於旋轉。集合會保留自己的來源與版本,所以當原件變動時,一個實例也能跟著更新。

其他編輯器#

世界編輯器負責填滿一個場景;接下來這些編輯器,則給它一個介面、一張地圖、它的內容表,以及檢查它成本的工具。

HUD 編輯器#

Tools → Editors → UI。六個分頁:TemplatesElementsLayersPreviewStyleScript,上方是一個可以在三種裝置尺寸間切換的預覽畫面:桌面 960×540、平板 768×432、手機 375×667。

元件分成三個群組(DisplayDataInput),並且可以巢狀嵌套:panelflex 可以容納子元件,所以 Layers 分頁是一棵真正的樹狀結構,而不是一份扁平清單。歷史紀錄有五十步深。

⚠️ Style 分頁只是類似 CSS,這個差異很重要。 HUD 是由 Babylon 的 GUI 系統畫在畫布上的,真正的 CSS 到不了那裡。你在這裡寫的規則,對應到的是 GUI 屬性;選擇器用 #name 指定單一元件,.type 指定一種類型(.text.panel),* 則代表所有元件。

Script 分頁是另一種建構方式:ui.* API,createTextcreatePanelcreateProgresscreateButton,有兩種執行方式。Build Layout(建構版面)會在設計期執行它,並留給你可以手動微調的真實元件;Run Live(即時執行)則是在遊戲中執行它。

有兩個對外的連接點:HUD 美術素材可以在 InkwellVectra 裡開啟,而且是連結回去,而不是複製一份,一份 Vectra 文件也可以被匯入成 HUD 元件。小地圖元件則是獨立的一項,具備範圍、格線,以及玩家、敵人、盟友、物品和目標的標記。

圖塊地圖編輯器#

十一種工具:筆刷、橡皮擦、填色、矩形、選取、滴管、印花、自動拼貼、道具、區域和路徑,可用於四種地圖投影方式:orthogonal(正交)、isometric(等角)、staggered isometric(交錯等角)和 hexagonal(六角形)。

Autotiling(自動拼貼)內建四種範本,每個名稱裡的數字就是它預期用到的圖塊數量:Blob 47(完整轉角與邊緣)、Wang 16(依邊緣判斷)、Simple 4(東南西北四方向),以及 RPG Maker A2(48 個圖塊,與那套軟體製作的地圖相容)。

在圖塊本身之上還有兩個圖層。Zones(區域)用來標繪玩法意義:可建造、水域、森林、道路、農地、住宅、商業、封鎖區;props(道具)則依類別放置物件:樹木、岩石、建築、植被、水域、道路。地圖存在瀏覽器自己的資料庫裡,所以一份未儲存的地圖也能撐過重新整理。

庫存、資料表與對話#

這三個編輯器,讓一款遊戲能擁有內容,而不必把內容寫死在程式碼裡。

Inventory(庫存)編輯一份目錄,並把它套用到場景上。一個物品帶有動作,一個動作就是一個觸發條件useequipunequip,再加上八種類型之一:訊息、治療、傷害、給予、移除、事件、提示、場景。這個面板本身有三種版面配置(格狀、清單、精簡),三種外觀預設(石墨、午夜、暖色),以及四個視覺插槽:背景、格位、裝備、提示框,它們會在另一個模組裡打開以進行完整的重繪。

Data tables(資料表)是有型別的:一個欄位可以是 textnumberboolref。CSV 可以匯入也可以匯出。每一次編輯都經過純函式處理,這正是讓匯出寫入的表格,和組建讀取的表格保持完全一致的原因。

Dialogue trees(對話樹)是帶有說話者和台詞的節點。一個節點要嘛延續到一個 next,要嘛分岔成多個選項,每個選項都有自己的文字和自己的目的地,是否分岔是這個編輯器裡唯一的結構性決定。

動畫與攝影機#

Cinematic Sequencer(運鏡序列器)建構帶有持續時間和循環旗標的序列,一個實體對應一條軌道,關鍵影格在播放頭位置擷取,Add Key(新增關鍵影格)會直接取用實體目前的數值,而不必要求你輸入。底下的圖表編輯器顯示時間對進度的關係,附有用於緩動的圓形控制桿:斜率就是速度。鏡頭有各自的持續時間,還提供 Cinemascope 構圖(1.422:1)作為信箱式黑邊。

Camera Tools(攝影機工具)涵蓋視野角度、位置、目標、模式和速度,外加給那些你一再回來查看的視角用的書籤,以及攝影機圖層。

Audio#

Audio Manager(音訊管理器)承載音訊事件、軌道,以及一個帶有聲道與分類的混音器。每個音源的效果有低通高通殘響傳送;一個 random(隨機)模式會在多個片段之間挑選,讓一個重複的聲音聽起來不像循環播放。拖曳播放頭時,會邊拖邊播放音訊。

分析器#

一份影格細目分析,而不只是一個影格計數器:攝影機算圖、mesh 求值、粒子、精靈和著色器編譯,每一項都標示為真實估計,這樣一個來自實際測量的數字,就絕不會被誤認為是來自一個模型估算的數字。旁邊還有計數器:mesh 與作用中 mesh、燈光、攝影機、物理剛體。

錄製是明確手動觸發的,結束時得到的是一份 Issues(問題)清單,而不是一張需要自己解讀的圖表:低 FPS、高繪製呼叫數、高三角形數、高記憶體用量,全都對照你設定的目標影格速率來判斷。

建構一個場景#

實體#

Engine 視口,選取的實體上顯示 gizmo

一個新場景一開始就帶有一個 Main Camera(主攝影機)、一個 Directional Light(方向光)、一個 Skybox(天空盒)和一個 Ground Plane(地面平面)。

場景圖,含新場景一開始的四個實體

你可以新增:Empty(空物件)、Cube(立方體)、Sphere(球體)、Cylinder(圓柱體)、Plane(平面)、Light(燈光)、Camera(攝影機)、Script(腳本)、Mesh,外加兩個已經預先接好線的家族:

  • Characters(角色):第三人稱、第一人稱(FPS)、俯視角、平台跳躍、基本款。
  • Props(道具):Pickup(拾取,回血)和 Hazard(危險物,造成傷害)。

場景圖可以搜尋、依類型篩選,並新增、複製或刪除實體;實體可以巢狀嵌套,重新設定父物件只需要拖曳。放置支援貼齊,還有一個散布筆刷可以快速在地面上鋪滿物件。

屬性面板#

Transform(位置、旋轉、縮放)、一個 Enabled(啟用)開關,以及實體的元件:在這裡新增、設定和移除,底部有 Add Script(新增腳本)。選取多個實體時,屬性面板會切換成批次編輯模式,讓一次欄位變更同時套用到所有選取的實體上。

主控台#

不只是一份日誌。它可以依等級篩選(全部、logs、info、warning、error),能把一則訊息連結回產生它的實體,還帶有一個運算式輸入列:輸入一個運算式,按 Enter 就會對著即時場景執行它,方向鍵可以在歷史紀錄中前後移動。

賦予它行為#

三條路徑,它們可以並存。

腳本#

帶有生命週期鉤子的 JavaScript,有自己的一份參考文件

function start() {}                     // once, when the entity starts
function update(dt) {}                  // every frame
function fixedUpdate(dt) {}             // fixed timestep, for physics
function onCollisionEnter(other) {}     // first frame of contact
function onCollisionStay(other) {}      // every frame while touching
function onCollisionExit(other) {}      // contact just ended
function onTriggerEnter(other) {}       // entered a trigger volume
function onTriggerExit(other) {}
function onMessage(msg, data, senderId) {}   // entity-to-entity messaging
function onAnimationEvent(name, data) {}
function onDestroy() {}

碰撞和觸發在 2D 和 3D 裡都會觸發,而且雙方各自會拿到自己的接觸法線:other.contact.normal 是從對方實體指向這一個實體的方向。這就是讓一個腳本能夠分辨「我落在它身上」和「它落在我身上」的方法:一個平台遊戲的踩踏判定讀取的是 other.contact.normal.y > 0.5

腳本編輯器#

F2,或是在一個實體上使用 Add Script。一個帶分頁的 Monaco 編輯器,可以同時打開好幾個腳本,每一個都保存在瀏覽器自己的資料庫裡,而不是專案檔案裡,所以一個未儲存的緩衝區也能撐過重新整理。

五種方言,一份程式。 語言切換提供 JavaScript、BASIC、Python、C# 和 Rust。它實際做的事,跟看起來的不一樣:JavaScript 才是真正的來源,另外四種都是從儲存的 JS 轉譯出來的檢視畫面。從 Python 切到 Rust,並不是把 Python 翻譯過去,而是回到產生這份 Python 的那份 JS,再翻譯那份 JS。多次跳轉式的翻譯正是會讓一份程式損毀的原因,編輯器拒絕這麼做。

十三個範本,分成五個類別,各自標示難度:

類別範本
Basics(基礎)附生命週期骨架的空白腳本
Movement(移動)自動旋轉.WASD.以軸為基礎的 3D 移動.附地面偵測的物理跳躍.第三人稱攝影機跟隨
Gameplay(玩法)觸發區域.附傷害與治療的血條.定時生成器
AI附玩家接近警示的巡邏
Advanced(進階)Verse 風格的非同步過場動畫.結構化並行處理.完整 API 表面測試

角色控制器預設集和遊戲起始道具(拾取物、危險物)出現在同一份清單裡,這是把一個可用的控制器套用到一個匯入角色上,最實際的方法。

執行與除錯。 F5 執行,F9 設定中斷點。除錯器會在一行程式碼上暫停、單步執行一個影格,並透過監看運算式回報即時數值。Script Lab(腳本實驗室)能在完全不附加任何實體的情況下執行一份程式,是一個給 API 用的草稿本,而不是一個掛在物件上的元件。

程式碼旁邊還有:一份 API 參考文件、目前開啟檔案的符號清單,以及一個帶有我的最愛和最近使用的程式碼片段庫。Ctrl+S 儲存,Ctrl+F 尋找,Ctrl+H 取代,編輯器內建八種主題。

藍圖與行為#

一張視覺化的圖、一個現成行為的庫,以及疊加在行為堆疊之上的一個狀態機。

這張圖帶有分成二十二個群組的267 個節點:Math、Scene、Entity、Animation、Flow Control、String、Events、Physics、UI、Array、Vector、Transform、Debug、Input、Utility、Game、Boolean、Camera、Tween、Variables、Audio,以及 2D 和 3D 家族。有三種屬性把它們區分開來,這也正是這張圖的組成方式:17 個事件節點啟動執行流程,117 個純節點計算一個數值、沒有副作用也沒有執行接腳,而 9 個 latent 節點則會延後完成,正是這些節點讓一個延遲或一段補間動畫,不需要你自己寫一個狀態機就能表達出來。

四種工具:選取 V、平移 H、註解 C、重新繞線 R,畫布可以從 0.1× 縮放到 3×,並附有縮圖導覽。變數有六種類型:boolean、integer、float、string、vector3 和 object。每個節點的說明都在它的工具提示裡,這也是這麼大的一個庫,唯一能夠自己解釋自己的地方。

狀態機#

它自己的一個面板,而且刻意不是 Animator 的那一個:Animator 的條件是一個扁平的列舉值,每種情況都要手寫 UI,而這裡的條件是結構化的,談的是世界本身。

七種條件,每一種都是關於場景的一個問題:sees(視野內看到一個帶標籤的目標,可以選擇性限定角度和視線範圍)、lost(N 秒內找不到目標)、distance(與一個閾值比較的距離)、health(生命值)、message received(收到訊息)、timer(在目前狀態停留的時間),以及 flag(共享黑板上的一個數值)。兩個組合子,andor,兩者都列了出來,即使 or 本來就已經隱含存在(兩條指向同一個狀態的轉換就是一個 or),但「它看到我,而且我還有生命值」這種情況,原本完全沒有辦法表達。

⚠️ 生命值的比較方式,永遠是佔最大值的比例,而不是絕對數值。 「低於 30 HP」這種閾值撐不過一次數值平衡調整;「低於 0.3」則可以。

進入或離開一個狀態時,有四種效果:send(傳送)一則訊息、set(設定)一個黑板鍵值、play(播放)一段動畫片段,或觸發一個具名效果。它們沒有一個會移動任何東西,移動永遠交給行為負責,狀態機只決定哪一個行為是作用中的。

一個轉換可以從 * 開始,代表任何狀態。驗證器會回傳問題的完整清單,而不是遇到第一個問題就丟出例外,所以一個寫到一半的狀態機仍然能畫出來,讓你一次看到所有的錯誤。節點的位置也是資料的一部分:一張版面配置存在場景之外的圖,對下一個打開它的人來說,會是重新洗過牌的結果。

BASIC#

TXT 視口模式是一個經典 BASIC 環境,內建示範程式,這個語言也有自己的一份參考文件。在這裡它是一個真正的語言,不是玩具:多檔案模組(#INCLUDE)、有型別的數值(有號與無號 8/16/32/64 位元、float32 和 float64)、巢狀記錄、附 SELF 的物件方法、參照(REF/BYREF)、結構化的 TRY/CATCH/FINALLY、條件編譯、協程、有型別的控制代碼,以及具備儲存緩衝區和原生 WGSL 的 WebGPU compute(WebGPU 運算)。

OPTION EXPLICIT 是選擇性加入的;經典的隱含變數宣告方式仍然是預設值,所以匯入的程式依然能執行。

遊玩與發布#

Play#

PlayPauseStop。停止時,一則橫幅會回報這次工作階段改動了什麼,所以一次遊玩模式下的編輯,永遠不會被悄悄保留,也不會被悄悄遺失。工作階段可以被錄製並重播進一份錯誤回報裡,而情境書籤能讓一次遊戲測試,從一個關卡的中間開始。

Build#

Build(組建)需要一個遊戲類型(從場景自動偵測,或手動設定:橫向捲軸/平台跳躍、第一/第三人稱、文字型)和一個目標平台。

  • Web:WebGPU 加上 WebGL 備援、可選的 WebXR(VR/AR)、程式碼壓縮、一個 FPS 計數器,以及一個能產生單一檔案的 embed assets(內嵌素材)選項。
  • Desktopmobile:原生組建。場景會被匯出成資料(scene.glb + scene.json),並透過一個自動產生的 Bevy(Rust)專案編譯;腳本則會在那裡透過一個內嵌的 QuickJS 執行環境原封不動地執行。

壓縮可以分軸調整:演算法、貼圖、mesh,並有一個品質預設把它們串在一起。組建會保存在一份歷史紀錄裡,附上它們的大小(原始大小對照壓縮後大小),之後也能重新下載。

一個原生組建,只會包含匯出工具知道怎麼匯出的東西。glTF 無法承載自訂著色器、薄實例(thin instances)、程序化天空或後製處理,所以一個還沒被移植到 Bevy 那一側的執行期系統,會在桌面或行動裝置組建裡消失,即使在網頁上看起來完美無缺。在依賴一個原生組建之前,請先檢查它。

Multiplayer#

Multiplayer room(多人連線房間)面板會把一個場景連接到一個 Colyseus 遊戲伺服器。有一個免費的共享測試伺服器可用,不需要帳號也不需要設定;一個專案也可以擁有自己專屬的伺服器。這個房間是以一組分享代碼作為索引的,你可以自己留著,也可以分享出去。

讀寫的檔案格式#

原生格式.engine
匯入.glb.gltf.obj.fbx.png.svg.mp4.webm.mov.scene
匯出一個網頁組建、一個原生桌面/行動裝置組建、scene.glb + scene.json

送去其他工作室#

接收來自 Sculpt、Retopo 和 Pigment 的 mesh,來自 Render 的完整場景,像素畫,動畫,來自 Matter 的 PBR 材質組,2D 綁定,影片專案,影像,向量作品,以及 Vectra objects。

產出 2D 綁定。

一份 Vectra 畫面模擬稿,抵達時是結構,而不是一張圖片。 它會變成一個 Engine 可以排版並寫腳本的 HUD 階層架構:這正是一個你可以接線運作的設計,和它的一張截圖之間的差別。

快捷鍵#

Cmd/Ctrl + K 可以從指令面板存取 Engine 自己的指令,和全域指令並列在一起。Engine 在自己的設定裡也有一個專屬、可搜尋的鍵盤快捷鍵面板;它的內容遠比快捷鍵頁面能容納的多。

限制與常見問題#

  • 視口一片空白,通常是瀏覽器的問題,不是場景的問題。 Engine 需要 WebGL 2;檢查硬體加速是否已開啟。
  • Systems 和 Tools 共用一個抽屜。 如果一個面板「不見了」,它多半是在另一個裡面。
  • 主控台是第一個該看的地方,而不是最後一個:它會把錯誤連結回引發它們的實體。
  • 在遊玩模式下新增的元件,可能撐不過停止。 讀一下停止時出現的那則橫幅。
  • 物理在 2D 和 3D 之間的解算器並不相同,即使腳本回呼是一樣的。2D 裡的靜止接觸是用 2 mm 的皮層來偵測的,因為解算器會在偵測執行之前,先把穿透量精確地歸零。