为 Unity 开发者提供 Roblox

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

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

获得定向

Unity 的等级窗口和 Roblox Studio 的 Explorer 是在 3D 场景中组织元素的主窗口:

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

但是,等级窗口没有预定义的结构,而探索器窗口有一个严格的结构。它可能有助于将 Explorer 窗口视为 Unity 的层次结构和项目窗口的组合,工作区文件夹是最易识别的元素。

同样,Roblox Studio 资产管理器工具箱 与 Unity 项目窗口重叠。资产管理器让你管理体验内的所有资产,而工具箱让你访问已发布的任何资产。工具箱还允许您从 Roblox 或社区搜索资产,与 Unity 资产商店类似。

哲学差异

Roblox 是一种“模拟引擎”,而不是传统的游戏引擎。Unity GameObjects 和 Roblox Parts 都作为 3D 环境中创建对象的基本积木,但在实践中,两者相差甚多:

  • 表示 : GameObjects 在 Unity 中对场景中的任何对象都是更高级别的概念,而 Parts 在 Roblox 中设计用于代表物理对象,例如木块和塑料球,而不是 Unity 中抽象几何图形的原始对象。
  • 物理学 : 要在 Unity 中执行物理模拟,您将组件如 RigidbodyCollider 附加到 GameObject 。在 Roblox 中,物理已集成到 Parts 数据类输入中;引擎自动处理交互。

如果你创建了一个 GameObject 和一个 Part,你可以立即看到差异。GameObject 没有更多的位置、旋转和缩放。该 Part 具有相同的信息—加上材料和颜色、反射率和透明度、质量和形状等等。将 Part 转换为更接近于空的 GameObject 意味着 移除 大量内置属性。相反,您可以通过添加 GameObjectPartMeshFilterMeshRenderer 组件来制作一个看起来非常像 ColliderRigidbody

从脚本角度来看, GameObject 最接近 Roblox Instance ,是所有其他 Roblox 类别的基础类型,但因为你不能(也不能)创建类型 Instance 的对象,所以比较并不特别实用。

另一个比较是 Unity GameObject 与 Roblox Model 的比较。模型以同样的方式作为容器来容纳一系列相互连接的零件集,就像你在 Unity 中可能建立父子关系一样多 GameObjects 在 Unity 中。您指定模型的零件之一为其主要部分来定义旋转点模型还存储了脚本、动画、音效、提示、约束、粒子发射器等内容。

例如,一个 Unity GameObject 可能有 ParticleSystemPhysics3DSpringConstraint 和一个脚本。在等级结构窗口中,你看到一个单独的 GameObject 被命名为 SpringyFireball 的 。检查器窗口显示组件和属性的集合。

在 Roblox 中,在 Explorer 窗口中相似的 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 。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 ,但如果您想在客户端-服务器边界相同一侧之间共享代码,可以生活在其他地方。

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")
-- 从复制存储中获得一个模块脚本,返回单个函数
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.SizeCFrame 属性。
  • 两者都支持复杂变形的乘法(即组合),并内置了其他操作的方法。

协作

在 Unity 中,您与标准版本控制系统或像 Unity 版本控制一样的付费服务合作。

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

插件

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

术语表

| 统一 | Roblox | 笔记 | | :--- | :--- | :--- | | 场景 | 放置 | | | 游戏对象 | PartModel | 看到 哲学差异 .| | 预制 | 包装 | | | 转换 | CFrame | CFrame 不包含缩放信息。请参阅变形。| | 等级窗口 | 探险家窗口 | | | 检查器 | 属性窗口 | | 场景视图 | 视窗 | | 游戏视图 | 视窗 | 在测试您的体验时,视窗会转变为游戏视图。| | 项目窗口 | 资产管理器工具箱 | | | 地形检查器 | 地形编辑器 | | | 生成点 | SpawnLocation | | | 控制台 | 输出 | | | 资产存储 | 创作者商店 | | | 覆盖 | 菜单栏 | | | 工具 | 插件 | |