Gamystery

YJ 遊戲技術站

長文

藍圖的黃昏與 Verse 的黎明:從 AI 自動化推演到社群的震撼教育

在關於 Epic 官方活動中,討論到了 UE6 想達到的目的與設計目標。UE6 的核心概念很明確,就是「UE5 + UEFN = UE6」。UEFN 是一款主打在 Fortnite(每日 8000 萬玩家)生態內部署的遊戲設計工具,而 UE5 則是目前最主流、用於打造各類大型遊戲的引擎,兩者各有局限。UE6 的目標,就是將兩者的優勢合併。

然而,其中引發最大震盪的變革是:新的主要 Gameplay 程式語言 Verse(原本在 Fortnite 開發環境中使用),將逐步取代 Blueprint(藍圖)。 雖然底層的 C++ 不會消失,且早期的 UE6 仍會保留藍圖與 Actor 系統,但長遠來看,藍圖將被 deprecated(棄用)。

同樣做為一個學習藍圖進入 UE 世界的開發者,我最直覺的反應是:未來要重新學習一個開發方式的成本實在太高了,這必然會帶來不小的陣痛期。但在綜合分析了 Verse 的技術特性與當前 AI 的發展後,我一開始反而轉向了樂觀看待。

在分享我的推測之前,我們必須先釐清藍圖與 Verse 各自扮演的角色。

為什麼需要藍圖?「活字印刷」的中間語言

藍圖在遊戲開發中扮演的角色,主要是負責邏輯以及資料之間的串接。這些工作傳統的底層語言 C++ 當然也能做,但為了讓開發者能更快、更有彈性地進入核心內容的開發,引擎商將大量常用的遊戲邏輯做成了積木。

如果用活字印刷來比喻,C++ 就像是拿著毛筆一筆一劃親手書寫——你對每一個字有完整的掌控,但也得從零開始。藍圖則像是活字印刷的字盤:引擎商已經把常用的遊戲邏輯鑄成一顆顆現成的活字,開發者要做的不是刻字,而是從字盤裡挑出需要的字塊,排好順序、對齊版面,就能印出一篇完整的文章。你專注的是「排什麼、怎麼排」,而不是「怎麼造字」。藍圖就是幫助開發者降低時間成本、方便製作遊戲的完美「中間語言」。

什麼是 Verse?迎戰元宇宙的新標準

外觀上,Verse 更像是傳統的程式語言,開發者面對的是一組一組的純文字。但從技術亮點來看,它使用了 Software Transactional Memory(STM,軟體交易式記憶體),讓遊戲程式碼能以「可回滾的交易」方式執行,並支援跨多台伺服器的分散式運算,用以實現更大規模的世界與玩家人數。官方將其定位為元宇宙時代的基礎語言,期望解決藍圖在跨平台、跨遊戲面向的不足。

為什麼 Epic 要放棄藍圖?我的推測:AI 友善度

藍圖與 Verse 共存,在單純的技術考量下應該是可行的,那 Epic 團隊為何選擇漸漸淘汰前者?我認為關鍵在於 AI 友善度

Verse 是在 2023 年公布的,當時 ChatGPT 剛推出不滿一年,市場普遍還不認為 AI 能夠精準寫程式。然而,到了 2026 年的現在,市場普遍已將「寫代碼不需要人負責」視為共識。AI 寫程式能力的突飛猛進,是我認為官方提升 Verse 戰略地位的最重要因素。

藍圖是一種圖像化的程式設計方式,除了邏輯外,還包含了大量對「人類友善」的輔助資料,例如顏色、線條、輸入輸出外型等。這些資訊導致在表達相同遊戲邏輯下,藍圖需要的資料量遠遠超過純文字的 Verse。這對 AI 來說,是一種多餘的負擔。

image.png

(圖一) 藍圖圖像化呈現邏輯示意

Begin Object Class=/Script/BlueprintGraph.K2Node_CustomEvent Name="K2Node_CustomEvent_2" ExportPath="/Script/BlueprintGraph.K2Node_CustomEvent'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager:EventGraph.K2Node_CustomEvent_2'"
   CustomFunctionName="TryPurchase"
   NodePosX=464
   NodePosY=608
   ErrorType=1
   NodeGuid=9FD5D27548C74AA6375ADEA0DEE97AFE
   CustomProperties Pin (PinId=F490C8194C4CA82A866A7E99881CF5B5,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager_C'",MemberName="TryPurchase",MemberGuid=9FD5D27548C74AA6375ADEA0DEE97AFE),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=00F75D9E49ADF44A9AB853A442DD97C7,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_10 31F7F8A5420F248871AAF79E31DE4EF0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=344400F64B163F61C1D3059A6A007AAB,PinName="GameProductID",Direction="EGPD_Output",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_10 7D2E133A4A0C0D23243B17A338FAE20A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=150935CA48252EF948CECBBBD05EDC1B,PinName="CurrentPC",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_6 286013ED4B593FA72C3F99888DAA4293,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties UserDefinedPin (PinName="GameProductID",PinType=(PinCategory="name"),DesiredPinDirection=EGPD_Output)
   CustomProperties UserDefinedPin (PinName="CurrentPC",PinType=(PinCategory="object",PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'"),DesiredPinDirection=EGPD_Output)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_10" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager:EventGraph.K2Node_CallFunction_10'"
   FunctionReference=(MemberName="GetPlatformProductID",MemberGuid=962CF8B5449278C6DBAB0F9AF0A8EE2F,bSelfContext=True)
   NodePosX=704
   NodePosY=608
   NodeGuid=6F0077C745BC2BB2CDFEF7BFA7166F2A
   CustomProperties Pin (PinId=31F7F8A5420F248871AAF79E31DE4EF0,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CustomEvent_2 00F75D9E49ADF44A9AB853A442DD97C7,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=CF8E782842B478AA484A9196EE75DEF9,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_11 1578860545B993CB8D8B7A9643250E9A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=35CD292F4719EE7D481C309E47506A76,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSelf Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="self",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=7D2E133A4A0C0D23243B17A338FAE20A,PinName="GameProductID",PinToolTip="Game Product ID\nName",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="None",AutogeneratedDefaultValue="None",LinkedTo=(K2Node_CustomEvent_2 344400F64B163F61C1D3059A6A007AAB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=C65BD5704254E027B680D098AE3E38BF,PinName="PlatformProductID",PinToolTip="Platform Product ID\nString",Direction="EGPD_Output",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_11 A2DAD95842505522D2AF2892DAF921B0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_11" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager:EventGraph.K2Node_CallFunction_11'"
   FunctionReference=(MemberName="DoGooglePlayPurchase",MemberGuid=747B374240ED1A3A3A1A9C8C96023493,bSelfContext=True)
   NodePosX=1103
   NodePosY=608
   NodeGuid=19FC20B64A4E3D359E03AAA26C155A86
   CustomProperties Pin (PinId=1578860545B993CB8D8B7A9643250E9A,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_10 CF8E782842B478AA484A9196EE75DEF9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=AF33C055478604FC3B80CE9FC4675961,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=8AC1681F422E3F597ADF1E9966420ED8,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="self",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=A2DAD95842505522D2AF2892DAF921B0,PinName="GooglePlayProductID",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_10 C65BD5704254E027B680D098AE3E38BF,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=A4F93D1D4C9B258B1DCA8F8454D6649F,PinName="CurrentPC",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_7 3CBB2C6E478653FBD6E664973EE489FF,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_6" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager:EventGraph.K2Node_Knot_6'"
   NodePosX=623
   NodePosY=766
   NodeGuid=B4A8C94E470D478F85E4CE9D5932A748
   CustomProperties Pin (PinId=286013ED4B593FA72C3F99888DAA4293,PinName="InputPin",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CustomEvent_2 150935CA48252EF948CECBBBD05EDC1B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=D970B75B4CCBE208D698F1A3770823BC,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_7 4F0AE4EE4935EAD920DC1DAF053D9916,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_7" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/CatSlap/Blueprint/Purchase/BP_PurchaseManager.BP_PurchaseManager:EventGraph.K2Node_Knot_7'"
   NodePosX=1042
   NodePosY=766
   NodeGuid=1A23A80742E8BEA1FEFE45ACCD789F46
   CustomProperties Pin (PinId=4F0AE4EE4935EAD920DC1DAF053D9916,PinName="InputPin",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_6 D970B75B4CCBE208D698F1A3770823BC,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
   CustomProperties Pin (PinId=3CBB2C6E478653FBD6E664973EE489FF,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_11 A4F93D1D4C9B258B1DCA8F8454D6649F,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object

(圖二) 圖一藍圖邏輯背後蘊含了過多「人類友善」的程式碼

「寫程式」是目前最不受消費者反感的遊戲工作項目。我可以想見五年後的未來,遊戲多數的邏輯都不必由開發者親自撰寫,而是由 AI 負責,人類只需驗證、校正參數。Verse 取代藍圖,我想就如同許多科技公司為 AI 打造專屬的 CLI(命令列介面)版本一樣——過去人類習慣的介面,對 AI 來說反而阻礙了效率。作為大量進行 Vibe Coding 的開發者,我深知目前就算在 MCP(Model Context Protocol)的幫助下,AI 生成藍圖邏輯的效率與準確率,仍遠遠無法取代人工。遊戲開發在 AI 輔助的紅利上,幾乎是落在最後梯隊的。

因此,我樂觀地認為:轉移的陣痛預計會比預期的更小,因為 AI 會替我們學習、掌握 Verse。 開發者能在 AI 的輔助下嘗試更多原型,並挑選有潛力的概念向下扎根。

社群的震撼教育:理想與現實的巨大落差

然而,當我拋出這些樂觀的推測,並實際去觀察廣大開發者社群的反饋時,我受到了不小的震撼。

社群對於這項決策的強烈反彈,點出了我觀點中過於理想化、忽略第一線現實的盲點:

1. AI 真的能精準產出 Verse 嗎?

(訓練資料的致命傷) 這是我認為社群反駁中最核心的一擊。LLM 的強大是建立在海量的開源程式碼(如 Python, C++)之上。但 Verse 是一個剛起步的新語言,根本沒有足夠的資料庫供 AI 訓練!在這種情況下,依賴 AI 來寫 Verse,極高機率只會產出語法看似正確、但邏輯崩潰的「幻覺代碼」。最後,清理這些爛攤子的重擔,依然會落在資深工程師的頭上,所謂的「AI 無痛代工」在初期根本是不可能實現的幻想。

按照我的觀察,在新語言有明確規則情況下,AI 未必不能創造出好的Verse程式碼,這點可能還得仰賴Epic 官方去證明。

2. 對非程式人員的無情屠殺

藍圖最偉大的成就,是讓沒有程式背景的美術、關卡設計師也能獨立實作遊戲邏輯。Verse 雖然強大,卻引入了「可變性 (mutability)」與「並發性 (concurrency)」等極度生硬的程式概念。社群痛批,就算有 AI 幫忙,非工程背景的人看到這些純文字依然會一頭霧水,這將大幅提高開發門檻,扼殺無數小團隊身兼多職的創作能力。即便 Epic 承諾未來會有「Visual Verse」,大家也悲觀地認為它只會淪為像 Scratch 那樣無法應付大型 3D 專案的簡陋玩具。

3. 抹殺了 Unreal 十幾年的傳承與教育生態

從 UE3 的 Kismet 時代一路走來,視覺化腳本已經是 Unreal 的靈魂與產業標準。許多開發者認為,Epic 為了迎合「AI」與「元宇宙」這些投資圈的流行語,強行破壞了現有且運作完美的開發工作流。直接拔除藍圖,等同於單槍匹馬地殺死了整個 Unreal Engine 的教育生態系統,讓無數人的學習心血付諸東流。

結語:險棋與未知的橋樑

重新審視我的推測與社群的擔憂,我現在的看法變得更加務實。

從底層技術與未來五年 AI 自動化的願景來看,我依然相信純文字、具備 STM 機制的 Verse 是邁向未來的正確方向;但社群的憤怒也是極度真實且致命的——因為這座名為「AI 自動化」的橋樑,目前根本還沒建好,Epic 卻已經準備把開發者腳下名為「藍圖」的平地給抽走。

Epic 這次確實走了一步極度冒險的棋。他們能否在徹底淘汰藍圖之前,拿出真正能克服「訓練資料不足」並讓「非程式人員也能無痛使用」的 AI 輔助工具?這不僅是 Verse 的挑戰,更是 Unreal Engine 6 能否延續輝煌的生死關鍵。

如果你喜歡或是這樣的內容對你有幫助的話,可以訂閱「YJ 遊戲技術站」,即時收到每周的電子報與長文。或是追蹤FB專頁,你的追蹤是我持續撰寫的最大動力。