Roblox
如果你曾在 Roblox 上制作过游戏,那么在开始使用 All Out 时,你需要了解一些关键差异!
如果你来自 Roblox Studio + Lua,这一页将帮助你把你的思维模型转换到 All Out + CSL(All Out 的脚本语言)。
主要区别(快速概览)
实体 + 组件(不是 Instances + Services):世界由中的实体构成 层级,而行为则来自添加组件(内置或脚本编写的)。
多人游戏是“内建”的:CSL 的设计目标是让大多数游戏代码可以像单机一样编写,同时引擎会同步相关状态。
CSL 是静态类型的:它会让你感觉更像 Go/Odin,而不是 Lua。(见 CSL 入门.)
Roblox → All Out 对照速查表
Place / Experience
All Out 游戏项目
你的本地项目文件夹包含一个 scripts 目录,用于 .csl 文件。
Explorer / Workspace
层级
层级会显示当前世界/场景中的所有实体。
属性窗口
检查器
你可以在这里编辑实体/组件字段并添加组件。
属性
序列化的组件字段
使用 @ao_serialize 向编辑器公开字段(见下面示例)。
Touched / Region3 / GetPartsInPart
范围查询(目前)
碰撞进入/退出回调还没有暴露出来;请使用 Scene.get_all_components_in_range (见 导航网格与碰撞).
你的第一个小时(推荐路线)
脚本思维模型(Lua → CSL)
在 Roblox 中,你通常会编写一个 Script/LocalScript 去查找对象(Workspace.Foo.Bar)并连接事件。在 All Out 中,你通常会:
编写 组件类 ,使用 CSL(行为逻辑)。
在编辑器中将它们附加到实体上(或者在运行时生成实体并添加组件)。
把可调参数存储在组件上,使用
@ao_serialize(这样你就可以在检查器中按实体调整)。
下面是一个小示例,它的感觉就像“挂在对象下的 Script”,但这里用 CSL 组件来表达:
如果你想要一个“游戏脚本”在每个服务器/会话中只运行一次,通常会把它放在主生命周期过程里(ao_start, ao_update等等)。请参见中的模板 CSL 入门.
你会认得的交互方式(以及它们如何转换)
ProximityPrompt → Interactable
如果你在 Roblox 中使用过 ProximityPrompt.Triggered ,最接近的对应物是一个 Interactable派生组件。从这里开始:
“Touched”拾取物 / 触发区域
Roblox 的 BasePart.Touched 是一个非常常见的模式,用于拾取物、伤害区域和检查点。在 All Out 中, 碰撞进入/退出回调目前还没有在 CSL 中实现,因此标准做法是:
查询附近的玩家/组件
做一个简单的距离检查
如果需要进入/退出事件,则跟踪上一帧谁“在里面”
参见中的“伪碰撞行为”:
玩家操作(工具 / 键位绑定 / 移动端控制)
如果你习惯 Roblox 的“工具”脚本,或者手写输入 + 冷却系统,请改用 技能 。它们专为移动端和 PC 都能良好工作而设计,并具有一致的 UI。
保存数据(DataStoreService → 保存系统)
对于持久化数据(货币、解锁内容、进度、外观),从这里开始:
UI(ScreenGui → All Out UI)
Roblox UI 通常从 ScreenGui 和 Frame/TextButton 层级开始。在 All Out 中,从这里开始:
Roblox 开发者常见的移植陷阱
没有“workspace services”树:不要去找
ReplicatedStorage/ServerScriptService对应物——请使用编辑器的层级 + 你项目的scripts文件夹。不要等待 Touched 事件:在 CSL 的碰撞回调可用之前,请使用范围查询(上面链接)。
预制体实例目前还没有完全参数化:如果你需要很多带不同数值的副本,可能需要“解除链接”或手动创建唯一实体(见 预制体).
把“组件”理解为“标签”:在你会使用 CollectionService 标签的地方,通常会改为添加一个标记/行为组件。
下一步去哪里
最后更新于