本頁面包含幫助經驗豐富的 Unity 開發者開始使用 Roblox 的資訊,包括基本的概述、概念比較,以及兩個平台之間的主要差異。
了解基本概念


Unity 的 Hierarchy 視窗和 Roblox Studio 的 Explorer 是用於組織 3D 場景中元素的主要視窗:
- 兩者都允許您管理和組織物件(例如角色和環境資產)。
- 兩者都使用樹狀結構來表示物件之間的父子關係。
然而,Hierarchy 視窗沒有預定義的結構,而 Explorer 視窗則有嚴格的結構。可以將 Explorer 視窗視為 Unity 的 Hierarchy 和 Project 視窗的組合,其中 Workspace 文件夾是最顯眼的元素。
類似地,Roblox Studio 的 Asset Manager 和 Toolbox 與 Unity 的 Project 視窗存在重疊。Asset Manager 讓您管理遊戲中的所有資產,而 Toolbox 讓您可以訪問任何您已發佈的資產。Toolbox 也允許您搜索來自 Roblox 或社區的資產,類似於 Unity 的 Asset Store。
哲學差異
Roblox 是一個「模擬引擎」,而非傳統的遊戲引擎。Unity 的 GameObjects 和 Roblox 的 Parts 都是創建 3D 環境中物件的基本構建塊,但實際上,兩者相當不同:
- 表示方式:Unity 中的 GameObjects 是場景中任何物件的高階概念,而 Roblox 中的 Parts 旨在表示實體物件,如木塊和塑膠球,而非類似 Unity 中的原始幾何圖形的抽象幾何。
- 物理:在 Unity 中,要執行物理模擬,您需要將 Rigidbody 和 Collider 等組件附加到 GameObject。在 Roblox 中,物理內置於 Parts 數據類型中;引擎自動處理互動。
如果您創建一個 GameObject 和一個 Part,您將立即看到區別。GameObject 沒有其他資訊,只有位置、旋轉和縮放。Part 具有相同的信息,還有材質和顏色、反射和透明度的值、質量和形狀等更多屬性。將 Part 變成更像一個空的 GameObject 意味著 移除 很多內建屬性。相反,您可以通過向 GameObject 添加 MeshFilter、MeshRenderer、Collider 和 Rigidbody 組件,使其看起來很像一個 Part。
從腳本的角度來看,GameObject 最類似於 Roblox 的 Instance,這是所有其他 Roblox 類的基類,但由於您不(也不能)創建 Instance 類型的物件,因此這種比較並不特別實用。
另一個比較是 Unity 的 GameObject 與 Roblox 的 Model。模型作為一組互相連接的部件的容器,與您可能在 Unity 中建立多個 GameObjects 之間的父子關係相似。您指定模型的一個部件作為其 主要部件 以定義樞紐點。模型還可以包含腳本、動畫、音效、提示、約束、粒子發射器等。
例如,一個 Unity 的 GameObject 可能擁有 ParticleSystem、Physics3D、SpringConstraint 和一個腳本的組件。在 Hierarchy 視窗中,您會看到一個名為 SpringyFireball 的單一 GameObject。Inspector 視窗顯示了組件和屬性的集合。
在 Roblox 中,類似的 SpringyFireball 模型在 Explorer 視窗中可能如下所示:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Roblox 的物理默認哲學擴展到建構 3D 模型的過程。 在 Roblox 中,將多個部件焊接在一起形成 assembly 是快速構建物品的好方法,因為 Roblox 將焊接的部件視為一個單一的剛體。這種方法在 Unity 中不可用。
Roblox 使用稱為「studs」和「Roblox Mass Units (RMUs)」的假想單位,而不是標準公制單位來表示長度和質量。 有關大致公制轉換和使用建議,請參見 Units。
位置事項
Roblox 遊戲預設為多人遊戲,因此 Roblox Studio 包含許多具有特定行為的不同儲存位置。 有關更多資訊,請參見 client-server runtime 和 object organization。
| Location | Description |
|---|---|
| Workspace | 代表遊戲的 3D 世界。這個位置非常適合直接附加到物件並控制其行為的伺服器腳本。 |
| ReplicatedFirst | 包含在其他任何物件之前複製到客戶端的物件。這個位置非常適合顯示載入畫面所需的最少物件和客戶端腳本。 |
| ReplicatedStorage | 包含複製到客戶端和伺服器的物件。這個位置非常適合您想在伺服器和客戶端上使用的 ModuleScripts。 LocalScripts 不會從此位置執行,但具有 RunContext 為 Client 的 Scripts 會執行。 |
| ServerScriptService | 包含伺服器腳本。這個位置非常適合需要訪問伺服器端功能或物件的腳本,例如遊戲邏輯和雲端儲存。 |
| ServerStorage | 包含伺服器端物件。這個位置非常適合不需要在玩家加入遊戲時立即複製到客戶端的大型物件。腳本不會從此位置執行,但您可以在這裡存儲伺服器端的 ModuleScripts。 |
| StarterPlayer ⟩ StarterCharacterScripts | 包含角色生成時執行的 LocalScripts。 |
| StarterPlayer ⟩ StarterPlayerScripts | 包含玩家加入遊戲時執行的一般用途的 LocalScripts。 |
| StarterGui | 包含客戶端在載入遊戲時顯示的 GUI 元素。 LocalScripts 可以從此位置執行。這個位置非常適合修改遊戲使用者介面的腳本,例如添加按鈕、菜單和彈出視窗。 |
| StarterPack | 通常僅包含 Tools,但也可以包括用於設置玩家背包的 LocalScripts。 |
腳本
Roblox 遊戲支援三種不同類型的 Luau 腳本:
客戶端腳本
這些腳本在客戶端運行,伺服器無法看到它們的行為。出於向後相容的原因,這些腳本可以是 LocalScripts 或 Scripts,其 RunContext 值為 Client。客戶端腳本通常位於 ReplicatedStorage、StarterPlayerScripts 或 StarterCharacterScripts 中。
伺服器腳本
這些腳本在伺服器上運行,客戶端無法看到它們的行為。伺服器腳本的 RunContext 值為 Server,並且通常位於 ServerScriptService 中,該服務的內容不會被複製到客戶端。
模組腳本
這些腳本是可重用的程式碼片段,會返回一個值,通常是一個函式或表(或函式的表)。為了避免在客戶端和伺服器腳本中重複程式碼,請使用模組腳本在兩者之間共享程式碼和資料。模組腳本通常位於 ReplicatedStorage 中,但如果你希望在同一客戶端-伺服器邊界上的腳本之間共享程式碼,則可以將其放在其他地方。
Unity 沒有不同腳本類型的概念。如果您選擇製作多人遊戲,Unity 將使用其網路庫來指示何時 GameObject(及其腳本)應僅限於伺服器使用。
在 Unity 中,許多引擎的功能是通過 MonoBehaviour 的方法提供的。例如,若要在渲染循環之前運行代碼,您將代碼添加到 Update() 方法中。要處理物理碰撞事件,您將代碼添加到 OnCollideEnter() 方法中。
Roblox 腳本更具事件驅動性。您可以通過訂閱服務並收聽更新來訪問類似的功能。
C# 和 Luau
對於腳本編寫,Unity 使用 C#。Roblox 使用 Luau,這是一種源自 Lua 5.1 的腳本語言。
相比 C#,Luau 是漸進類型的,且一般語法較不冗長。但是在較大的項目中,漸進類型可能會引入強類型語言(如 C#)所避免的錯誤類別,因此請考慮在 Roblox 腳本中啟用 strict type checking。
有關腳本語言之間基本語法差異,請參見 Luau 和 C# 比較。
Luau 代碼範例
以下的 Luau 代碼範例演示了如何在玩家裝備釣魚竿後,監聽用戶輸入(在這個例子中為 E 鍵)並調用其他函數:
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 從 ReplicatedStorage 獲取一個返回單個函數的模組腳本
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- 假設這個腳本是釣魚竿的子物件
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- 檢查鍵是否按下,然後調用另一個函數
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- 只有在玩家裝備釣魚竿時才啟用這個動作
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- 玩家卸下釣魚竿時禁用這個動作
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)
Roblox 腳本可以相對簡潔,因為 Roblox 有許多內建的假設:有一個與伺服器相連的 Player 和 Humanoid 字元,並且可以裝備 Tools。這些假設在 Unity 中並不存在,因此實現會非常不同。
資產
Unity 和 Roblox 都支持以 .fbx 格式導入自定義網格和模型。某些類型的資產可能需要來自您第三方建模軟件的特定配置和導出設置。更多資訊,請參見以下頁面:
在 Unity 中,物件導入到您的 Assets 目錄,並在 Project 視窗中可見。在 Roblox 中,資產導入到 Workspace 和 Toolbox 或 Asset Manager。
Roblox 還提供了開源的 Blender 插件,以簡化導入過程。
變換
Unity 的轉換和 Roblox 的 CFrames 在表示物件的 3D 轉換方面具有相似的用途:
- 兩者都支援複雜轉換的乘法,並擁有用於其他操作的內建方法。
協作
在 Unity 中,您可以使用標準版本控制系統或像 Unity Version Control 這樣的付費服務進行協作。
Roblox 文件存儲在雲端(儘管您可以導出副本),因此 Roblox Studio 提供了內建的協作工作流程,用於同時編輯、群組管理、權限、腳本起草等。請參見 Collaboration。
插件
類似於 Unity 工具,Roblox Studio 支持 plugins,這可以簡化或讓您更好地控制開發過程的各個方面。插件可在 Creator Store 獲得,就像資產一樣,許多都是免費的。
詞彙表
| Unity | Roblox | 注意事項 |
|---|---|---|
| Scene | Place | |
| GameObject | Part 或 Model | 請參見 Philosophical differences。 |
| Prefab | Package | |
| Transform | CFrame | CFrame 不包括縮放信息。請參見 Transforms。 |
| Hierarchy | Explorer | |
| Inspector | Properties | |
| Scene view | 3D viewport | |
| Game view | 3D viewport | 當您測試遊戲時,視口會轉換為遊戲玩法視圖。 |
| Project window | Asset Manager 或 Toolbox | |
| Terrain Inspector | Terrain Editor | |
| Spawn point | SpawnLocation | |
| Console | Output | |
| Asset Store | Creator Store | |
| Overlays | Toolbar | |
| Tool | Plugin |