-- Views
November 05, 26
スライド概要
講演内容:Verseとは何か、そしてEpic Gamesがなぜ新しいプログラミング言語を開発しているのか。本セッションでは、Verseが解決する課題や、UE6およびScene Graphにもたらすものについて解説し、Verseの主な言語機能も紹介します。
本講演へのアンケートにご協力をお願い致します:
https://docs.google.com/forms/d/e/1FAIpQLScI6FWrr04t65fePUmAE6s4RcAwETxXtOUQwk4M5skRkjaK-Q/viewform
講演者:
Magnus Enebakk(Epic Games)
Unreal Fest Tokyo 2026公式サイト:
https://www.unrealengine.com/events/unreal-fest-tokyo-2026
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
U E6, VERS E AN D S CENE GRAPH why we are building it
YOU R SPEA KE R Verse Evangelist, Epic Games
A GE NDA 01 02 03 04 05
WH AT VE RSE I S for gameplay code Print("Hello, Unreal") Count:int = 1.5 # error var Score:int = 0 for, loop, class, interface X := if (A) then 1 else 2 <decides><transacts>
WH Y V ERSE one live world CR EAT O R A Damage(Amount:float):void CR EAT O R B Health.Damage(25.0) CR EAT O R C uses B's weapon
WH Y V ERSE one live world CR EAT O R A Damage(Amount:float):void CR EAT O R B Health.Damage(25.0) Broken: the call has one argument CR EAT O R C uses B's weapon Broken with the weapon
WH Y V ERSE one live world CR EAT O R A Damage(Amount:float):void CR EAT O R B Health.Damage(25.0) Keeps working, unchanged CR EAT O R C uses B's weapon Keeps working, unchanged
WH Y V ERSE designed to solve
EN GI N E TI ME LI N E UE6 NO W UE6 UEFN
TH E FUTU RE UEFN + UE5 Engine Platforms
V ERSE IN UE6 sits
V ERSE IN UE6 Forward-looking in UE6
FOR UN REA L D EV ELO PERS maps over entity event, listenable component @editable prefab (a class) GetComponent[t] OnBegin/EndSimulation failure OnSimulate()<suspends> entity tags Sleep(), Await() []t, [k]v
TH E L AN GU AGE at a glance int var 16 # constant player_stats "Hello, Unreal" # type inferred float # mutable var 10 AddScore set 100.0 class string int # required 0 25.0 string int map "Ana" int void set player_stats "Ana" AddScore 10 Add int int Add 5 int # last expression is the result 10 # named, optional arguments SpawnWave SpawnWave 3 int float 1.5 0.0 void # types are snake_case, values are PascalCase
TH E L AN GU AGE
expression
# if produces a value
if
50.0
then "Healthy" else "Hurt"
# for produces an array: array{2, 4, 6}
for
array 1
2
3
2
# case produces a value
case
move_mode
300.0
move_mode
600.0
# a function's value is its last expression
Square
int
int
TH E L AN GU AGE what code can do <computes> <reads> <transacts> <decides> <suspends> FindTarget OpenDoor turret <decides><reads> agent door <suspends> void # can fail, only reads state # takes time
FA IL URE failure
FA IL URE nested null checks VERSE if GetVehicle GetComponent weapon_component GetLoaded then Fire
FA IL URE filters for IsAlive IsVisibleFrom Distance do GrantGold 50
FA IL URE everyday code # was it a player that stepped on the plate? if # no score yet? start from 0 player GrantPoints Scores or 0 10 # is there a current target? # take the first spawn point under the arena if FindDescendantEntitiesWithTag spawn_tag Fire if first Respawn
FA IL URE failable GetDamage player AllStats int <decides><reads> int # no stats? fails
FA IL URE failable GetDamage player int <decides><reads> int AllStats Weapons # no stats? fails # bad slot? fails
FA IL URE failable GetDamage player int <decides><reads> int AllStats # no stats? fails Weapons # bad slot? fails 0 # not positive? fails
FA IL URE failable GetDamage player int <decides><reads> int AllStats # no stats? fails Weapons # bad slot? fails 0 # not positive? fails # call it with [ ] in a failure context if GetDamage ApplyDamage 0
FA IL URE undoes changes TryBuy shopper Pay if # fails without enough gold TakeOne # fails when sold out Add # fails when the bag is full TryBuy Equip item <transacts><decides> void not kept yet not kept yet fails
FA IL URE Planned to know why buy_error Buy enum shopper item <transacts> result item Pay or TakeOne or return MakeError buy_error Add or return MakeError buy_error MakeSuccess buy_error return MakeError buy_error
FA IL URE Planned to know why buy_error Buy enum shopper item <transacts> result item Pay or buy_error return MakeError buy_error TakeOne or return MakeError buy_error Add or return MakeError buy_error not kept yet MakeSuccess not kept yet THE CAL LER fails speculate Buy if GetSuccess The player sees BagFull, and nothing changed. Equip else if ShowError GetError
C ONC URRE NC Y take time VERSE OpenVault <suspends> void Play Sleep 2.0 # wait, without blocking SlideOpen # returns when it's open Await Stop # wait for an event
C ONC URRE NC Y Tick Tick 1 VERSE TASK void AVault if Tick float OpenVault EVaultState 1 <suspends> void Play Sleep 2.0 if 0 return SlideOpen StartOpening Await EVaultState else if if Stop EVaultState IsOpen EVaultState return
C ONC URRE NC Y Tick Ticks 2 to 60: the 2 second wait VERSE TASK void AVault if Tick float OpenVault EVaultState 1 <suspends> void Play Sleep 2.0 if 0 return SlideOpen StartOpening Await EVaultState else if if Stop EVaultState IsOpen EVaultState return
C ONC URRE NC Y Tick Tick 61: the wait is over VERSE TASK void AVault if Tick float OpenVault EVaultState 1 <suspends> void Play Sleep 2.0 if 0 return 2 SlideOpen StartOpening Await EVaultState else if if Stop EVaultState IsOpen EVaultState return
C ONC URRE NC Y Tick Ticks 62 to 90: the door is opening VERSE TASK void AVault if Tick float OpenVault EVaultState 1 <suspends> void Play Sleep 2.0 if 0 return 2 SlideOpen StartOpening Await EVaultState else if if Stop EVaultState IsOpen EVaultState return
C ONC URRE NC Y concurrency sync race wins rush branch wins
C ONC URRE NC Y as a race VERSE ChargedAttack player_state <suspends> void # charge up, unless we get hit first race block Sleep true block Await false if FireProjectile else PlayStagger
PERSI ST ENC E survives sessions player_progress class<final><persistable> int 1 int 0 # saved for each player, loaded when the player joins var weak_map player AddCoins player Progress int <transacts> void or player_progress player_progress if set Progress ShowCoins player_progress map
SC ENE GRAPH a tree of entities vault_controller_component door_component pressure_plate_component EP_Vault prefab door_component EP_Vault
SC ENE GRAPH a Verse class hello_component<public> class<final_super> component @editable Message<public> string OnBeginSimulation<override> OnSimulate()<suspends> super "Hello from Verse" void OnBeginSimulation Print OnSimulate<override> <suspends> void loop Sleep 5.0 Print "Still running"
SC ENE GRAPH in Verse pressure_plate_component pressure_plate_component<public> @editable HoldTime<public> float OnSimulate<override> if class<final_super> component 2.0 <suspends> void GetComponent mesh_component
SC ENE GRAPH in Verse pressure_plate_component pressure_plate_component<public> @editable HoldTime<public> float OnSimulate<override> class<final_super> component 2.0 <suspends> void if GetComponent mesh_component loop Await race block Await false block Sleep true
SC ENE GRAPH in Verse pressure_plate_component pressure_plate_component<public> @editable HoldTime<public> float OnSimulate<override> class<final_super> component 2.0 <suspends> void if GetComponent mesh_component loop Await race block Await false block Sleep true if SendUp plate_activated_event
SC ENE GRAPH through the tree plate_activated_event<public> vault_controller_component class scene_event # pressure_plate_component, on the plate SendUp plate_activated_event pressure_plate_component door_component door_component SendUp
SC ENE GRAPH through the tree plate_activated_event<public> vault_controller_component OnReceive class scene_event # pressure_plate_component, on the plate SendUp plate_activated_event pressure_plate_component SendUp # vault_controller_component, on the arena OnReceive<override> if scene_event logic plate_activated_event OpenAllDoors true door_component else false door_component # handled: stop here
SC ENE GRAPH through the tree plate_activated_event<public> vault_controller_component OnReceive class scene_event # pressure_plate_component, on the plate SendUp plate_activated_event pressure_plate_component SendUp # vault_controller_component, on the arena OnReceive<override> if scene_event logic plate_activated_event OpenAllDoors door_component true found # handled: stop here else false OpenAllDoors door_component void FindDescendantComponents door_component found for Open
SC ENE GRAPH a Verse class GENERATED IN ASSETS. DIGEST.VE RSE EP_Vault # simplified: access specifiers and import paths left out class<final><concrete> entity door_component class<final> mesh_component @editable var material external I N YOUR CO DE # the whole prefab AddEntities array # now in the scene
SC ENE GRAPH In design written in Verse I N VERSE (SYNTAX NOT FINAL ) vault prefab class entity Door<entity_field> entity entity Mesh<component_field> door_component Logic<component_field> door_component Alarm<entity_field> entity entity Sound<component_field> sound_component var Loot<entity_field> entity # only some vaults optional
WH AT ' S NEXT Vision massive shared simulations One shared Verse simulation
WH AT ' S NEXT Unreleased reactive code L IVE VARI ABL ES var REACTI NG TO CHANGE int 0 var live int set 5 var 1 int 100 # X now tracks Y # X is now 6 upon 0 # once, when it first holds Print "Player died!" when # every time it changes SetHealthBar await 100 # suspend until healed
WH AT ' S NEXT Unreleased prediction HandleJump <predicts> void StartJumpAnimation # runs now, on the client PlayJumpSound PerformJump # the server validates
WH AT ' S NEXT Forward-looking coming In progress On the roadmap Planned
GO BUI L D learn Verse BO O K DO CS FO RUM S CO M M UNI TY API AL L L I NK S
THAN K YO U