游戏概念
本章介绍蛋仔游戏的基础概念。熟悉蛋码与编辑器的玩家可跳过部分。
单位与类型
单位是 游戏运行时 对游戏中对象的抽象,包括障碍物、机关、物理区域和角色等。每个单位都有对应的类型。
使用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中您可以注册帧回调:
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 统一延后处理。
物理系统
目前物理功能通过内置组件提供,以支持更方便的可视化编辑。以下是一些常见的物理功能:
组件 | 功能 |
---|---|
普通组件 | 物理碰撞、反弹 |
关节 | 软约束(绳子、合页等) |
水体 | 浮力效果 |
载具 | 自定义物理形状的载具运动 |
重力场 | 区域性重力效果 |