cubes实体与组件

All Out 游戏围绕实体(世界中的事物)和组件(附加到实体的行为/数据)构建。

如果你用过 Unity:想象为“GameObject + 组件”。如果你用过 Roblox:想象为“Instance + 脚本/组件”。核心思想是相同的: 你通过向实体添加组件来组合游戏玩法。

实体

实体以两种常见方式存在:

  • 在编辑器中放置:它们在启动时已存在于场景中。

  • 在运行时创建:你从脚本中生成它们。

创建和销毁实体

entity := Scene.create_entity();
entity->set_local_position({10, 20});
entity->set_local_scale({2.5, 2.5});
entity->set_local_rotation(0);

// 当你完成时:
entity->destroy();
circle-exclamation

遍历实体

组件

组件是行为单元。组件“附着于”实体并且可以读取/修改该实体。

获取和添加组件

遍历组件

你会经常使用的内置组件

Sprite_Renderer

预制件 (Prefab_Asset)

预制件必须在编辑器中创建。在脚本中,你实例化它们。

Spine (Spine_Animator)

如果你使用 2D 动画角色,你通常会使用 Spine_Animator。参见 Spine.

编写自定义组件

在专用文件中创建新组件(例如 orbiter.csl)并将它们附加到实体,方式为:

  • 在编辑器中手动,或

  • 在运行时 使用 entity->add_component(...)

组件可以实现生命周期回调:

  • ao_start()

  • ao_update(dt)

  • ao_late_update(dt) (在所有更新之后)

  • ao_end() (当被销毁时)

示例:

circle-info

全局脚本的生命周期方法(ao_start, ao_update,...)在下面讨论: 游戏/帧 生命周期.

可序列化字段 (@ao_serialize)

使用 @ao_serialize 以在编辑器中公开字段(并且在适用时通常启用保存/持久化)。

查找附近的组件(邻近查询)

CSL 没有碰撞回调。一个常见模式是“查询附近的组件并检查距离”。

有用的辅助函数:

示例:

最佳实践

  • 每个玩家的状态应放在 Player. 避免使用会在多玩家情况下出问题的全局变量。

  • 优先使用组件来实现游戏玩法行为。 你最终会得到可重用的组件块,可附加到不同的实体上。

  • 将视觉/外观工作保持本地化。 UI/粒子通常应在 is_local() 检查之后运行。

最后更新于