對於 Unity 開發人員的 Roblox

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

此頁包含幫助經驗豐富的 Unity 開發人員開始使用 Roblox 的信息:基本方向、概念比較和兩個平台之間的關鍵差異。

取得方向

Unity 的層級視窗和 Roblox Studio 的 導航器 是在 3D 場景中整理元素的主要窗口:

  • 兩者都讓你管理和整理對象(例如,角色和環境資產)。
  • 兩者都使用樹狀結構來實現對物件之間的父子關係。

然而,層級視窗沒有預定義結構,而探索器視窗卻有嚴格的結構。可能有助於將 Explorer 視窗視為 Unity 的階層和項目視窗的結合,工作區資料夾是最容易辨識的元素。

相同地,Roblox Studio 資產管理器工具箱 與 Unity 項目窗口重疊。資產管理員讓你管理體驗中的所有資產,而工具箱讓你存取已發布的任何資產。工具箱也讓您可以在 Roblox 或社群尋找資產,與 Unity 資產商店類似。

哲學差異

Roblox 是一個「模擬引擎」,而不是傳統遊戲引擎。Unity GameObjects 和 Roblox Parts 兩者都作為在 3D 環境中創建對象的基本構建方塊,但在實踐中,兩者相當不同:

  • 表示 : GameObjects 在 Unity 中對場景中的任何對象來說是更高級別的概念,而 Parts 在 Roblox 中設計用於代表物理對象,例如木塊和塑膠球,而不是 Unity 中原始對象的抽象幾何圖形。
  • 物理 :在 Unity 中執行物理模擬,您會將組件如 RigidbodyCollider 附加到 GameObject 上。在 Roblox 中,物理學被建立到 Parts 數據輸入中;引擎會自動處理互動。

如果你創建了 GameObjectPart,你可以立即看到差異。GameObject 沒有更多的位置、比例轉和縮放。Part 有相同的資訊—加上材料和顏色、反射率和透明度、質量和形狀等等。將 Part 轉換為更接近空白 GameObject 的東西意味著 移除 大量預設屬性。相反地,您可以通過添加 GameObjectPartMeshFilterMeshRenderer 組件來製作一個看起來非常像 ColliderRigidbody

從腳本角度來看,GameObject 最接近 Roblox 的 Instance 基礎類別所有其他 Roblox 類別,但因為您不能(也不能)創建類型 Instance 的對象,因此比較並不特別實用。

另一個比較是 Unity GameObject 與 Roblox Model 的比較。模型以相同於您在 Unity 中建立父子關係的方式作為一個容器來容納連接到一起的零件集。您指定模型的零件之一作為其 主要零件 來定義旋轉點。模型也會保存腳本、動畫、音效、提示、限制、粒子發射器等等。

例如,一個 Unity GameObject 可能會有 ParticleSystemPhysics3DSpringConstraint 和一個腳指令碼。在階層窗口中,你看到一個單獨的 GameObject 被命名為 SpringyFireball 的 。檢查器窗口顯示組件和屬性的集合。

在 Roblox 中,在探索器窗口中相似的 SpringyFireball 模型可能會看起來像這樣:


Model
|- ParticleEmitter
|- MeshPart
|- SpringConstraint
|- ClickDetector
| |- Script

Roblox 的預設物理學理念延伸到建立 3D 模型的過程。在 Roblox 中,將多個零件焊接在一起形成 裝配 是一種快速構建物品的優良方法,因為 Roblox 將焊接的零件視為單一剛性身體。此方法在 Unity 中無法使用。

而不是使用標準公制單位來測量長度和質量,Roblox 使用稱為螺柱和 Roblox 質量單位 (RMU) 的想像單位。對於大約的公制轉換和使用建議,請參閱單位

位置很重要

Roblox 體驗的多人模式為預設狀態,因此 Roblox Studio 包含許多不同的儲存位置和特定行為。例如,一個腳本可能在 ReplicatedStorage 中運行,但不會在 StarterPlayerScripts 中運行。了解更多信息,請參閱客戶端-服務器運行時對象組織

位置|說明:---|---工作區|代表遊戲世界。這個位置很適合直接附加到對象並控制其行為的服務器腳本。複製第一 | 包含複製到客戶端之前的任何東西的對象。此位置最適合顯示載入屏幕所需的絕對最小集合對象和客戶端腳本。複製儲存 | 包含被複製到客戶端和伺服器的對象。這個位置非常適合 Class.ModuleScript\|ModuleScripts 你想在服務器和客戶端上使用的東西。Class.LocalScript\|LocalScripts不從這個位置執行,但Class.Script\|Scripts帶有Client執行上下文的運行。服務器腳本服務 | 包含服務器腳本。這個位置非常適合需要存取伺服器端功能或物件的腳本,例如遊戲邏輯和雲端儲存。服務器儲存 | 包含服務器側對象。這個位置非常適合那些不需要在體驗加入時立即複製給客戶的大型對象。腳本不從此位置運行,但您可以在此儲存服務器端 Class.ModuleScript\|ModuleScripts 。新手玩家.新手角色腳本 | 包含 Class.LocalScript\|LocalScripts 在角色生成時運行的腳本。新手玩家.新手玩家腳本 | 包含通用的 Class.LocalScript\|LocalScripts 腳本,當玩家加入體驗時運行。新手導覽 | 包含客戶端在載入遊戲時顯示的 GUI 元素。Class.LocalScript\|LocalScripts這個位置非常適合修改遊戲用戶介面的腳本,例如添加按鈕、選單和彈出窗口。新手包 | 通常只包含 Class.Tool\|Tools ,但也可以包含 Class.LocalScript\|LocalScripts 來設置玩家背包。

腳本

Roblox 體驗支持三種不同類型的 Luau 腳本:

  • 客戶端腳本

    這些腳本在客戶端運行,伺服器無法看到它們的行為。為了舊版本的原因,這些腳本可以以 LocalScriptsScripts 的形式出現,並具有 RunContext 值的 Client 。客戶端腳本通常生活在 ReplicatedStorageStarterPlayerScriptsStarterCharacterScripts

  • 伺服器腳本

    這些腳本在伺服器上運行,客戶端沒有能見到它們的行為。伺服器腳本有 RunContext 值的 Server 並通常住在 ServerScriptService 中,其內容不會複製到遊戲客戶端。

  • 模組腳本

    這些腳本是可重複使用的代碼片段,會返回一個準確值,通常是一個函數或表 (或一組功能表)。而不是在客戶端和服務器腳本中複製代碼,使用模組腳本來在兩者之間共享代碼和數據。模組腳本經常住在 ReplicatedStorage ,但如果您想在客戶端-伺服器邊界相同側面上分享代碼,可以住在其他地方。

團結沒有不同腳本類型的概念。如果您選擇製作多人遊戲,Unity 使用其網路圖庫來指示何時 GameObject (以及其腳本) 應專屬於服務伺服器。

在 Unity 中,引擎的功能大部分可以通過 MonoBehaviour 的方法獲得。例如,要在渲染循環之前執行代碼,您將代碼添加到 Update() 方法。要處理物理碰撞事件,您將代碼添加到 OnCollideEnter() 方法。

Roblox 腳本更多地使用事件驅動模型。您可以通過訂閱服務並聆聽更新來訪問相似功能。

C# 和 Luau

對於指令碼化,Unity 使用 C#。Roblox 使用 Luau,一種從 Lua 5.1 衍生的腳本語言。

與 C# 相比,Luau 逐漸輸入並通常具有較少的詳細語法。然而,在更大的項目中,逐步輸入可能會導入強烈類型化語言,例如 C#,避免的類別錯誤,因此考慮在 Roblox 腳本中啟用 嚴格類型檢查

有關腳本語言之基本語法差異,請參閱 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 目錄中,可在項目視窗中看到。在 Roblox 中,資產會匯入您的工作區和 工具箱庫存 部分的 資產管理器

Roblox 也提供開源 Blender 插件 來加快進口流程。

變形

props.engine 的變形和 Roblox 的 CFrames 用於代表物體的 3D 變形有相似的用途:

  • 兩種變形和 CFrames 都代表在 3D 空間中對象的位置和旋轉。變形包括比例放,而 Roblox 使用的是一個 BasePart.Size 屬性,這不是 CFrame 的一部分。
  • 兩者都支持複合(即組合)對複雜變形的多次乘法,並內置其他操作方法。

合作

在 Unity 中,您與標準版本控制系統或付費服務,例如 Unity 版本控制,進行合作。

Roblox 檔案住在雲端(雖然您可以匯出副本),因此 Roblox Studio 提供內建的協作工作流程,用於同時編輯、群組管理、權限、腳本草稿和更多。請參閱協作

插件

與 Unity 工具類似,Roblox Studio 支持 插件,這可以簡化或給您額外控制各種開發過程方面。插件可以在創作者商店中使用,與資產一樣,大多數是免費的。

術語表

| 團結 | Roblox | 筆記 | | :--- | :--- | :--- | | 場景 | 放置 | | | 遊戲對象 | PartModel | 看到 哲學差異 。| | 預製 | 包裝 | | | 變形 | CFrame | CFrame 不包含縮放信息。請參閱變形。| | 階層窗口 | 探索器窗口 | | | 檢查員 | 屬性窗口 | | 場景視圖 | 視窗 | | 遊戲視圖 | 視窗 | 視窗在測試您的體驗時會轉換為遊戲視圖。| | 項目窗口 | 資產管理器工具箱 | | | 地形檢查員 | 地形編輯器 | | | 生成點 | SpawnLocation | | | 控制台 | 輸出 | | | 資產商店 | 創作者商店 | | | 重疊 | 選單欄 | | | 工具 | 插件 | |