cubes实体和组件

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

如果你以前用过 Unity:可以把它理解为“GameObject + Components”。如果你以前用过 Roblox:可以把它理解为“Instance + Scripts/Components”。核心思想是一样的: 你通过向实体添加组件来组合游戏玩法。

实体

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

  • 在编辑器中放置:它们在启动时就已经在场景中了。

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

创建和销毁实体

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() 检查之后运行。

最后更新于