Skip to content

游戏概念

本章介绍蛋仔游戏的基础概念。熟悉蛋码与编辑器的玩家可跳过部分。

单位与类型

单位是 游戏运行时 对游戏中对象的抽象,包括障碍物、机关、物理区域和角色等。每个单位都有对应的类型。

使用LuaAPI.get_value_type(unit)或者更通用的type(unit) 获取单位类型名称。

注意,为了与其他类型区分,这里返回的单位类型会附带一个前缀"L"。

常见单位类型:

类型描述
Obstacle碰撞体(墙、门等)
LifeEntity生命体(玩家角色、生物等)
Trigger触发器
Character玩家角色
Creature生物
Equipment装备

其中一些类型之间有继承关系,部分类型还包含一些特定的部件(Comp)。对于一个单位,您可以调用的API包括:

  • 单位类型直接提供的接口
  • 继承类型提供的接口
  • 包含部件提供的接口

提示:查看VSCode工程中生成的 EggyAPI.lua 了解类型继承关系和部件信息。

类型继承示例

预设

预设是 游戏编辑期 的单位模板,在预设编辑器中创建和编辑。

预设编辑器

组件

组件是 游戏编辑期 摆放在游戏场景中的物体。组件指明了物体所使用的预设,以及物体所在的位置、旋转、缩放等属性。

通常在游戏开始时,组件实例化为单位,并继承预设的属性。如果组件上对预设的属性进行了修改,则以修改为准。

组件性能优化

您可以在组件面板中看到“组件性能优化”选项。

组件面板

优化后的组件在创建游戏场景时,仅仅作为场景中的 静态障碍物,不被实例化为对应的单位。它们拥有基础的物理碰撞,不会触发任何事件,也无法通过lua访问

当您想在场景中放置一些纯景观物或者纯障碍物时,可以使用组件性能优化功能。这将大大减少游戏运行时事件的触发次数,从而提高游戏性能。但是当您想 引用其中一些放置单位,或者接收这些单位上的事件时,请务必关闭此开关

值得注意的是,在某些情况下,即使“组件性能优化”开关被开启,这个物体也不会被优化:

  • 被蛋码使用
  • 有运动器或者表现器
  • 有交互组件数据
  • 有关节或者被关节链接
  • ……

这些规则可能会随游戏版本有所变动,请不要依赖这些规则。当您需要在lua中引用场景内的单位时,请关闭此开关。

数学设定

蛋仔世界使用 左手坐标系,Y轴竖直向上。每个轴的坐标范围为:(-1000.0, 1000.0)。当单位坐标过大、缩放过大或者表面距离过近时,可能会出现:

  • 渲染精度不足导致的闪烁
  • 碰撞体边界与物体表面有明显偏移

您可以通过调整物体的摆放、调整缩放数值来避免这类问题。

逻辑帧

蛋仔里的游戏逻辑是按每秒30帧的速率执行的,这个速率与玩家设备实际画面的帧率无关。除非特别说明,本文所提及的所有“帧”,皆指此处的逻辑帧。

在Lua中您可以注册帧回调:

lua
LuaAPI.set_tick_handler(pre_tick_handler, post_tick_handler)

回调的时机分别位于帧前与帧后。

警告:频繁使用帧回调执行重度逻辑可能导致性能问题。请尽可能优先使用事件回调。

事件

事件是单位间通信和驱动游戏逻辑的主要手段。 您既可以使用luaAPI.unit_register_trigger_event() 或者 global_register_trigger_event() 监听事件,也可以使用 luaAPI.unit_send_custom_event() 或者 global_send_custom_event() 来发送自定义事件。

以下是一些典型的事件:

典型事件:

  • 游戏初始化/结束
  • 玩家操作(跳跃、前扑、滚动等)
  • 单位进入/退出区域
  • 单位被攻击

警告:不要依赖同一帧内事件的执行顺序。如果您在某单位事件的回调中对其他单位进行操作,可能会与其他单位自身的事件回调相冲突。

建议:您可先将事件数据收集到临时列表中,然后使用帧回调或 LuaAPI.call_delay_frame 统一延后处理。

物理系统

目前物理功能通过内置组件提供,以支持更方便的可视化编辑。以下是一些常见的物理功能:

组件功能
普通组件物理碰撞、反弹
关节软约束(绳子、合页等)
水体浮力效果
载具自定义物理形状的载具运动
重力场区域性重力效果