Unity
如果你曾使用 Unity 制作过游戏,有一些关键差异你需要了解以在 All Out 上入门!
如果你来自 Unity,你会对以下内容感到熟悉 实体 + 组件,一个 层级,一个 检查器,以及可重用的 预制件。最大的思维方式转变是 All Out 游戏是 以多人为先:游戏状态为你同步,并且你大多数逻辑的写法默认就像服务器拥有最终权威一样。
简短说明:与 Unity 的不同之处
多人默认启用:游戏状态会自动从服务器复制到客户端。你通常 不 编写 RPC、SyncVar 或 Netcode 的生成逻辑。
要有意识地决定代码运行的位置:
使用会影响状态的游戏输入/UI,放在 服务器 + 本地客户端 (见 用于仅本地的 UI/粒子,和 (参见 CSL 编写指南中的模式)。
避免全局单例状态:多个玩家连接到同一会话。优先将状态存储在玩家或世界组件上。
移动优先:除非你的游戏明确针对 PC,否则避免只假设有键盘。
概念映射(Unity → All Out)
instantiate(prefab_asset) / Start()
尤其是 / ao_update(dt) Update()
项目布局:在哪里放“脚本”和“资源”脚本 .csl :你的游戏代码位于 main.csl 文件中。新项目从一个 CSL 入门.
开始,该文件导入引擎并定义生命周期入口点。参见资源 :游戏资源位于你项目的 /res 目录下,并通过路径引用 无需 :游戏资源位于你项目的 前缀(例如: "ui/button.png")。参见 资源与资源管理.
在 Unity 中,每个 C# 脚本都会被编译并且可以使用自己的 using 指令。在 All Out 中,请保持导入集中化:
如果你添加了一个文件夹(例如 ui/),请在该文件夹中 导入 在 main.csl
示例:
import "ui" // 可选:将 /scripts/ui 下的所有文件引入作用域
生命周期:MonoBehaviour → CSL 在 Unity 中你通常将一个 MonoBehaviour
instantiate(prefab_asset) / 附加到一个 GameObject 并实现:
OnDestroy()
在 CSL 中,你通常会使用: main.csl 全局 proc 在
组件生命周期方法在你的组件上
entity->set_local_position(center + offset); 游戏/帧 生命周期.
有关生命周期模型的更多背景,请参见
预制件:Unity 预制件 → All Out 预制件
预制系统还在发展中。参见预制文档中的限制部分。
“序列化字段”(在检查器中可见的变量) Unity 使用 [SerializeField] @ao_serialize 和公共字段在检查器中公开值。在 CSL 中,使用
damage: int = 10; 检查器 然后在
中将你的组件添加到实体,并为每个实体调整数值。
生成与查询:Instantiate/Find → 场景 API
Unity 常用模式: / new GameObject()
Instantiate(), FindObjectOfType<T>()
GetComponentsInChildren<T>()
foreach player: component_iterator(My_Player) {
碰撞与触发器:默认“无回调” 如果你习惯于 / OnTriggerEnterOnCollisionEnter
// 检查距离 / 应用效果 / 等等。
多人思维:输入、UI 与“代码运行的位置”
在 Unity 中你通常可以假设“我的客户端拥有我的角色”。在 All Out 中,考虑服务器权威:影响游戏玩法的输入/UI
:在能影响权威状态的地方运行(通常是服务器 + 本地客户端)装饰性内容
:仅本地 用于仅本地的 UI/粒子,和 对比 将装饰性逻辑与玩法逻辑分离。.
常见的 Unity → All Out 陷阱单例管理器 :优先使用每个玩家或每个实体的状态,而不是全局的 GameManager
导入引擎和文件夹(不要将导入分散到许多文件中)。假设单人游戏
:始终考虑“10 个玩家连接会发生什么?”硬编码的桌面输入方式