Unity 开发者的 Roblox

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处。

此页面包含信息,帮助经验丰富的 Unity 开发者开始使用 Roblox,包括基本的方向、概念比较以及两个平台之间的关键差异。

了解情况

Unity 用户界面,标记显示各种窗口和面板。 Roblox Studio 用户界面,标记显示各种窗口和面板。

Unity 的 层级 窗口和 Roblox Studio 的 资源管理器 是组织 3D 场景中元素的主要窗口:

  • 两者都允许您管理和组织对象(例如,角色和环境资产)。
  • 两者都使用树结构来表示对象之间的父子关系。

然而,层级 窗口没有预定义的结构,而 资源管理器 窗口则有严格的结构。可以将 资源管理器 窗口视为 Unity 的 层级 和 项目 窗口的组合,其中 Workspace 文件夹是最显著的元素。

同样,Roblox Studio 的 资产管理器 和 工具箱 与 Unity 的 项目 窗口重叠。资产管理器 让您管理游戏中的所有资产,而 工具箱 让您访问您发布的任何资产。工具箱 还允许您搜索 创作者商店 中的 Roblox 或社区资产,类似于 Unity 的 资产商店。

哲学差异

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 和一个脚本的组件。在层级窗口中,您会看到一个名为 SpringyFireball 的单一 GameObject。检查器窗口显示组件和属性的集合。

在 Roblox 中,相应的 资源管理器 窗口中的 SpringyFireball 模型可能看起来像这样:

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

Roblox 的默认物理哲学扩展到构建 3D 模型的过程。在 Roblox 中,将多个部件焊接在一起形成一个 组件 是快速构建事物的好方法,因为 Roblox 将焊接的部件视为一个单一的刚体。这种方法在 Unity 中不可用。

Roblox 使用名为 studs 和 Roblox 质量单位 (RMUs) 的名义单位,而不是标准的公制单位来表示长度和质量。有关近似公制转换和使用建议,请参见 单位。

位置很重要

Roblox 游戏默认是多人游戏,因此 Roblox Studio 包含许多具有特定行为的不同存储位置。有关更多信息,请参见 客户端-服务器运行时 和 对象组织。

LocationDescription
Workspace表示游戏的3D世界。可以运行直接附加到对象并控制其行为的服务器脚本。
ReplicatedFirst包含在其他任何对象之前复制到客户端的对象。此位置非常适合显示加载屏幕所需的绝对最小对象和客户端脚本集。
ReplicatedStorage包含复制到客户端和服务器的对象。此位置非常适合具有 Scripts 和 RunContext 为 Client 的客户端 ModuleScripts,以及您希望在服务器和客户端上使用的 ModuleScripts。 LocalScripts 不会从此位置运行。
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 脚本中启用 严格类型检查。

有关脚本语言之间基本语法差异的信息,请参见 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 中,资产导入到您的 Workspace 和 工具箱 或 资产管理器。

Roblox 还提供一个开源的 Blender 插件,以简化导入过程。

变换

Unity 的变换和 Roblox 的 CFrames 在表示对象的 3D 变换方面具有相似的目的:

  • 变换和 CFrames 都表示对象在 3D 空间中的位置和旋转。变换包含缩放,而 Roblox 使用 BasePart.Size 属性,后者不是 CFrame 的一部分。
  • 两者都支持乘法以进行复杂的变换,并具有用于其他操作的内置方法。

协作

在 Unity 中,您可以使用标准版本控制系统或付费服务(如 Unity 版本控制)进行协作。

Roblox 文件存储在云中(尽管您可以导出副本),因此 Roblox Studio 提供内置的协作工作流程,用于同时编辑、组管理、权限、脚本草拟等。请参见 协作。

插件

与 Unity 工具类似,Roblox Studio 支持 插件,可以简化或为您提供对开发过程各个方面的额外控制。插件在 创作者商店 中可用,就像资产一样,许多是免费的。

术语表

UnityRoblox备注
场景地点
GameObjectPart 或 Model请参见 哲学差异。
预制件包
变换CFrameCFrame 不包括缩放信息。请参见 变换。
层级资源管理器
检查器属性
场景视图3D 视口
游戏视图3D 视口当您测试游戏时,视口会转换为游戏视图。
项目窗口资产管理器 或 工具箱
地形检查器地形编辑器
生成点SpawnLocation
控制台输出
资产商店创作者商店
悬浮层工具栏
工具插件
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。