虚幻开发者的 Roblox

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

该页包含有助于经验丰富的 Unreal Engine 开发人员开始使用 Roblox 的信息:基本方向、概念对比以及两个平台之间的关键差异。

获得定向

Unreal 的轮廓和 Roblox Studio 的 探索者 是在 3D 空间中组织元素的主窗口。两者都显示对象和文件夹的层次。但是,概述者有更平坦、更少被定义的结构,只显示 Actors。探索器窗口具有深层次、严格的结构,并将所有对象视为层次结构的一部分,即使是在 Unreal 中被认为是组件的对象。

Roblox Studio 资产管理器工具箱 与 Unreal 内容浏览器重叠。资产管理器让你管理体验内的所有资产,而工具箱让你访问你发布的任何资产。工具箱还允许您从 Roblox 或社区的创作者商店搜索资产。创作者商店与 Unreal Engine 市场类似,但您可以直接从工作室用户界面访问它。

哲学差异

Roblox 是一种“模拟引擎”,而不是传统的游戏引擎。虚幻 Actors 和 Roblox Parts 都作为基础积木服务,但在实践中,两者相差甚多:

  • 表示 : Actors 在 Unreal 是任何等级的对象的更高级概念,而 Parts 在 Roblox 设计用于代表物理对象,例如木块和塑料球。
  • 物理学 : 要在 Unreal 中执行物理模拟,您需要在特定组件 (例如 StaticMeshComponent ) 或添加组件到 Actors 中 (例如物理约束) 来启用物理。在 Roblox 中,物理已集成到 Parts 数据类型中;引擎自动处理交互。

如果你创建了一个 Actor 和一个 Part,你可以立即看到差异。Actor 有少于一个位置、旋转和缩放。该 Part 具有相同的信息—加上材料和颜色、反射率和透明度、质量和形状等等。当您在 Unreal 中比较 StaticMeshActor 时,两者才开始共享相似属性 (例如一个立方体)到Roblox中的一个MeshPart

An example Unreal actor in the Details panel.
虚幻编辑器详情面板
An example Roblox part in the Properties window.
Roblox Studio 属性窗口

另一个有用的比较是 Unreal Actor 与 Roblox Model 。模型以同样的方式作为一个容器来容纳相互连接的零件集,就像在 Unreal 中 Actors 是容器来容纳组件一样。您指定模型的零件之一为其主要部分来定义旋转点模型还存储了脚本、动画、音效、提示、约束、粒子发射器等内容。

例如,虚幻 Actor 可能会有一个 NiagaraComponent 使用多个发射器实现所需的视觉效果、形状网格、物理约束添加弹性,以及玩家互动的脚本。在概述器中,你看到一个单独的 Actor 名为 SpringyFireball 的。

在 Roblox 中,在 Explorer 窗口中相似的 SpringyFireball 模型可能看起来像这样:


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

Roblox 的默认物理学理念延伸到 3D 模型构建的过程。在 Roblox 中,将多个零件焊接在一起形成 装配 是一种很好的快速建造东西的方法,因为 Roblox 将焊接的零件视为单个刚性体。在 Unreal 中,这种方法不实用。

而不是使用标准公制单位来计算长度和质量,Roblox 使用称为螺柱和 Roblox 质量单位 (RMU) 的概念单位。有关大约的公制转换和使用周围的建议,请参阅单位

位置很重要

Roblox 体验默认为多人游戏,因此 Roblox Studio 包含许多具有特定行为的不同存储位置。例如,当你将它放入 ReplicatedStorage 时,脚本可能会运行,但不会当你将它放入 StarterPlayerScripts 。了解更多信息,请参阅客户端-服务器运行时对象组织

位置 | 描述 :--- | :--- 工作区 | 代表游戏世界。这个位置对直接附加到对象的服务器脚本很有用,可以控制其行为。复制第一个 | 包含在客户端之前复制的对象。该位置非常适合显示加载屏幕所需的绝对最小集合对象和客户端脚本。复制存储 | 包含被复制到客户端和服务器的对象。这个位置非常适合 Class.ModuleScript\|ModuleScripts 你想要在服务器和客户端上使用的东西。Class.LocalScript\|LocalScripts不从这个位置运行,但Class.Script\|Scripts使用Client运行上下文运行。服务器脚本服务 | 包含服务器脚本。此位置非常适合需要访问服务器端功能或对象的脚本,例如游戏逻辑和云存储。服务器存储 | 包含服务器端对象。这个位置非常适合那些不需要在加入体验时立即复制给客户的大型对象。脚本不从这里运行,但您可以在此处存储服务器端 Class.ModuleScript\|ModuleScripts 。StarterPlayer.StarterCharacterScripts | 包含 Class.LocalScript\|LocalScripts 在角色生成时运行的脚本。StarterPlayer.StarterPlayerScripts | 包含通用的 Class.LocalScript\|LocalScripts 脚本,当玩家加入体验时运行。新手指南 | 包含客户端在加载游戏时显示的图形用户界面元素。Class.LocalScript\|LocalScripts这个位置非常适合修改游戏用户界面的脚本,例如添加按钮、菜单和弹出窗口。新手包 | 一般只包含 Class.Tool\|Tools ,但也可以包含 Class.LocalScript\|LocalScripts 用于设置玩家背包。

脚本

Roblox 体验支持三种不同类型的 Luau 脚本:

  • 客户端脚本

    这些脚本在客户端运行,服务器无法看到它们的行为。由于历史原因,这些脚本可以采取 LocalScriptsScripts 形式,并具有 RunContextClient 。客户端脚本通常生活在 ReplicatedStorage , StarterPlayerScripts , 或 StarterCharacterScripts .

  • 服务器脚本

    这些脚本在服务器上运行,客户端无法看到它们的行为。服务器脚本有一个 RunContext 值为 Server ,通常生活在 ServerScriptService 中,其内容不会复制到游戏客户端。

  • 模块脚本

    这些脚本是可重复使用的代码片段,返回一个准确值,通常是函数或表(或一组函数的表)。 rather than 复制代码在客户端和服务器脚本, 使用模块脚本来共享代码和数据之间.模块脚本经常生活在 ReplicatedStorage ,但如果您想在客户端-服务器边界相同一侧之间共享代码,可以生活在其他地方。

Unreal没有不同脚本类型的概念。如果你选择制作多人游戏,你会写额外的代码来同步服务器和客户端之间的游戏状态。

在虚幻中,大部分引擎功能可通过扩展内置类型,例如 UObject , ACharacters , ULevel , 和 UWorld 在 C++ 或蓝图中实现。虚幻支持自定义事件,但许多类包含与等级自然生命周期的一部分的事件,引擎会自动调用。

与虚幻的“滴答”系统相比,Roblox 脚本更多地采用事件驱动。您通过订阅服务并收听更新来访问类似的引擎功能。

C++ 和 Luau

对于脚本,Unreal 使用 C++。Roblox 使用 Luau,一种从 Lua 5.1 衍生的脚本语言。

与 Luau 相比,C++ 具有整体性能优势,可能或不可能与你想要构建的体验类型无关。Luau逐渐输入并具有更少的语法。但在更大的项目中,逐渐输入可能会导入类似于 C++ 强类型语言避免的错误类别,因此考虑在 Roblox 脚本中启用 严格类型检查

Unreal 还包括一个名为蓝图的视觉脚本系统。Roblox 有第三方插件提供类似功能,但没有相应的系统内置。

Luau 代码示例

以下 Luau 代码示例显示了玩家装备钓竿后,如何收听用户输入(在这里是 E 键)并调用额外函数:


-- 获取必需的游戏服务
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("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 。这些假设在 Unreal 中不存在,因此实现将大不相同。

资产

Unreal 和 Roblox 都支持导入自定义网格和模型在 .fbx 格式。某些类型的资产可能需要从第三方建模软件中导出特定配置和输出设置。了解更多信息,请参阅以下页面:

在 Unreal 中,资产导入到你的 Content 目录,在内容浏览器中可见。在 Roblox 中,资产导入到您的工作区和 工具箱库存 部分的 资产管理器

Roblox 还提供开源 Blender 插件 来优化导入过程,与 Blender 工具的 发送到 Unreal 功能类似。

变形

props.engine 的转换和 Roblox 的 CFrames 用于表示对象的 3D 变形具有相似目的:

  • 两种变形和 CFrames 都代表在 3D 空间中对象的位置和旋转。变形包括缩放,而 Roblox 使用的是不属于 BasePart.SizeCFrame 属性。
  • 两者都支持复杂变形的乘法(即组合),并内置了其他操作的方法。

协作

在虚幻中,您与 Perforce 或 SVN 等版本控制系统合作,通常通过虚幻内置用户界面进行。这些版本控制系统使用集中的“检查”模型,在一个人工作时锁定文件。

Roblox 文件生活在云端(虽然您可以导出副本),因此 Roblox Studio 为同时编辑、组管理、权限、脚本草稿等提供内置协作工作流程。请参阅协作

插件

与 Unreal 类似, Roblox Studio 支持 插件,这可以简化或给你更多控制各个方面的开发过程。插件可以在 创作者商店 中找到,与资产类似,许多是免费的。

术语表

| 虚幻 | Roblox | 笔记 | | :--- | :--- | :--- | | 等级 | 放置 | | | 演员 | PartModel | 看到 哲学差异 。| | 蓝图类 | 包装 | | | 转换 | CFrame | CFrame 不包含缩放信息。请参阅变形。| | 概述者 | 探险家窗口 | | | 详情面板 | 属性窗口 | | | 等级视窗 | 视窗 | | | 内容浏览器 | 资产管理器 或 工具箱 | | | 景观模式 | 地形编辑器 | | | 玩家开始 | | | | 输出日志 | 输出 | | | 市场地图 | 创作者商店 | | | 菜单栏 | 菜单栏 | | | 插件 | 插件 | | | 输出记录 | 输出 | | | 目录目录 | | |