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


虚幻的 Outliner 和 Roblox Studio 的 Explorer 是组织三维空间中元素的主要窗口。两者都显示对象和文件夹的层次结构。然而,Outliner 结构平坦且定义较少,仅显示 Actors。Explorer 窗口具有深层嵌套且严格的结构,显示所有对象作为层次结构的一部分,即使是虚幻中被认为是组件的对象。
Roblox Studio 的 Asset Manager 和 Toolbox 与虚幻的 Content Browser 重叠。Asset Manager 让您管理游戏中的所有资产,而 Toolbox 则让您访问您已发布的任何资产。Toolbox 还允许您搜索 Creator Store 中来自 Roblox 或社区的资产,类似于虚幻引擎的 Marketplace,但可直接通过 Studio 用户界面访问。
哲学差异
Roblox 是一个“模拟引擎”,而不是传统的游戏引擎。虚幻的 Actors 和 Roblox 的 Parts 都作为基本构建块,但在实践中,两者相当不同:
- 物理: 在虚幻中执行物理模拟,您需要在特定组件(如 StaticMeshComponent)中启用物理,或通过向 Actors 添加组件(如物理约束)来实现。在 Roblox 中,物理内置于 Parts 数据类型中;引擎自动处理交互。
如果您创建一个 Actor 和一个 Part,您会立即看到差异。Actor 只有位置、旋转和缩放的基本信息。Part 拥有相同的信息,此外还有材料和颜色、反射率和透明度的值、质量和形状等等。这两者只有在您将虚幻中的 StaticMeshActor 与 Roblox 中的 MeshPart 进行比较时,才开始共享类似的属性。


另一个有用的比较是虚幻的 Actor 和 Roblox 的 Model。模型充当一个容器,用于包含一组互连的部件,就像虚幻中的 Actors 是组件的容器一样。您可以指定模型的一个部件作为其 主部件 来定义枢轴点。模型还包含脚本、动画、音效、提示、约束、粒子发射器等。
例如,一个虚幻的 Actor 可能有一个 NiagaraComponent,它使用多个发射器来实现所需的视觉效果,一个用于形状的网格、一个增加弹性的物理约束,以及一个用于玩家交互的脚本。在 Outliner 中,您会看到一个名为 SpringyFireball 的单一 Actor。
在 Roblox 中,一个类似的 SpringyFireball 模型在 Explorer 窗口中可能看起来像这样:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Roblox 的默认物理哲学扩展到 3D 模型的构建过程。在 Roblox 中,将多个部件焊接到一起形成一个 装配 是快速构建事物的好方法,因为 Roblox 将焊接的部件视为一个刚体。这种方法在虚幻中并不实用。
与标准公制单位(长度和质量)相比,Roblox 使用称为 stud 和 Roblox 质量单位 (RMUs) 的名义单位。有关近似公制转换和使用建议,请参见 单位。
位置重要
Roblox 游戏默认是多人游戏,因此 Roblox Studio 包含许多具有特定行为的不同存储位置。有关更多信息,请参见 客户端-服务器运行时 和 对象组织。
| 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 中,但如果您想在客户端和服务器之间共享代码,它们也可以放在其他地方。
虚幻没有不同脚本类型的概念。如果您选择制作多人游戏,您需要编写额外的代码以在服务器和客户端之间同步游戏状态。
在虚幻中,引擎的大部分功能可以通过扩展内置类(如 UObject、ACharacters、ULevel 和 UWorld)在 C++ 或 Blueprint 中使用。虚幻支持自定义事件,但许多类包含引擎在关卡的自然生命周期中自动调用的事件。
与虚幻的“滴答”系统相比,Roblox 脚本更加事件驱动。您通过订阅服务并监听更新来访问类似的引擎功能。
C++ 和 Luau
对于脚本,虚幻使用 C++。Roblox 使用 Luau,这种脚本语言源于 Lua 5.1。
与 Luau 相比,C++ 在整体性能上具有优势,这对您希望构建的游戏类型可能或可能不相关。Luau 是逐步类型的,并且语法不那么冗长。然而,在较大的项目中,逐步类型可能会引入严格类型语言(如 C++)避免的错误类别,因此请考虑在 Roblox 脚本中启用 严格类型检查。
虚幻还包括一个称为 Blueprints 的可视化脚本系统。Roblox 有第三方插件提供类似的功能,但没有内置的可比系统。
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。这些假设在虚幻中不存在,因此实现会非常不同。
资产
虚幻和 Roblox 都支持以 .fbx 格式导入自定义网格和模型。某些类型的资产可能需要来自您的第三方建模软件的特定配置和导出设置。有关更多信息,请参见以下页面:
在虚幻中,资产导入到您的 Content 目录中,在 Content Browser 中可见。在 Roblox 中,资产导入到您的工作区和 Toolbox 或 Asset Manager 中。
Roblox 还提供一个开源的 Blender 插件,以简化导入过程,类似于 Blender Tools 的 发送到虚幻 功能。
变换
Unreal Engine 的变换和 Roblox 的 CFrames 在表示对象的 3D 变换方面具有相似的目的:
- 两者都支持乘法以进行复杂的变换,并具有用于其他操作的内置方法。
协作
在虚幻中,您可以通过版本控制系统(如 Perforce 或 SVN)进行协作,通常通过虚幻的内置用户界面。这些版本控制系统使用集中式“检出”模型,在一个人工作时锁定文件。
Roblox 文件存储在云中(尽管您可以导出副本),因此 Roblox Studio 提供内置的协作工作流程以便同时编辑、组管理、权限、脚本草拟等。请参见 协作。
插件
与虚幻类似,Roblox Studio 支持 插件,这些插件可以简化或为您提供开发过程中各个方面的更多控制。插件可在 Creator Store 中获得,许多是免费的。
术语表
| 虚幻 | Roblox | 注释 |
|---|---|---|
| 关卡 | 地点 | |
| Actor | Part 或 Model | 请参阅 哲学差异。 |
| Blueprint 类 | 软件包 | |
| 变换 | CFrame | CFrame 不包括缩放信息。请参见 变换。 |
| Outliner | Explorer | |
| 细节面板 | Properties | |
| 关卡视口 | 3D 视口 | |
| Content Browser | Asset Manager 或 Toolbox | |
| 地形模式 | Terrain Editor | |
| PlayerStart | SpawnLocation | |
| 输出日志 | Output | |
| Marketplace | Creator Store | |
| 菜单栏 | Toolbar | |
| 插件 | Plugin |