选题描述
主要内容:基于Unity3D引擎的一个2D平台跳跃类游戏。玩家可以在多个地图之中活动,每个地图上会存在一些对应的功能或物体。例如某个地图中存在商店,可以给玩家提供升级武器或购买道具的选项。一些地图中则存在怪物,打败怪物后会掉落金币,用于商店物品的购买。玩家可以随时存档,存档会保存当前玩家的状态数据和位置信息等,下次进入会读取上次的信息,继续游戏。
策划(旧)(地图设计太难)
总目标
- 复刻空洞骑士
- 类银河恶魔城游戏设计
- 项目通过GitHub来管理
- 资源先通过免费素材代替
系统设计分析
玩家模块设计
- 移动
- 正常左右移动
- 冲刺
- 游玩过程中获得
- 只能水品方向冲刺
- 跳跃
- 通过按键时间的长短控制跳跃高度
- 二段跳需要游玩过程中获得
- 攻击
- 攻击分为 上下左右 四个方向
- 攻击在一些特定的物体(无法破坏的物体,例如地面尖刺、怪物护盾等)上,会将自己击退
- 基础属性
- 血量:血量降到零时,玩家或死亡。可以通过血瓶回复血量,通过商店购买对应的物品提升上限
- 攻击力:可以通过购买对应物品升级攻击力(升级武器)
- 基础物品
- 血瓶:需要从NPC中购买(或地图中探索获得),血瓶可以重复使用,只存在使用次数的限制。玩家每次 存档或复活都会使使用次数回满。商店处可以购买使次数提升的物品
敌人模块设计
- AI逻辑
- 采用状态机来实现敌人的移动和攻击。目前考虑:普通怪物的状态机可以复用(移动,攻击、防御、死亡等),BOSS的状态机单独设计(二阶段的模式设计)
- 动画
- 动画采用帧动画,先找免费素材
地图模块设计
- 敌人刷新
- 游戏每次重新加载,地图中的敌人便会进行刷新。(重新加载包括:死亡后复活、存档后读档、传送等)
- 地图传送
- 一些地图当中存在传送点,玩家可以在所有已经激活的传送点之间进行传送
- 商店
- 商店即为NPC,地图中会存在NPC,他们会出售一些增益物品(武器升级,功能升级等)
- 地图总览
- 玩家所有探索过的地图区域都可以在其中预览
- 特定NPC出可以购买地图,能让玩家提前预览未探索的区域
- 地图探索
- 地图中存在一些特殊物体,可以通过攻击互动
- 地图中存在隐藏路径,有一些奖励
- 地图设计
- 钥匙与锁
- 能力锁:一些地图的点需要获得某些能力之后才能到达。一些高度需要二段跳才能跳上去,一些坑需要冲刺才能通过
- 挑战锁:有些地方需要打败特殊敌人才能解锁(打包BOSS)
- 物品锁:可以通过钥匙打开一些门,开通近路
- 回路探索:
- 钥匙与锁
NPC模块设计
- NPC为地图中功能的载体(或许有任务系统),可以通过和NPC对话来调用相关的功能
流程
(新)
改为类死亡细胞
随机地图设计
使用 Edgar插件,采用预先设计模板和随机连接的方式生成地图
Edgar
制作地图模板(包括房间和连接),通过Level Graph对设计房间连接规则
- 普通的Level Graph中房间节点无房间类型,若需要特殊房间则要为此节点单独添加模板
- 通过Custom Input Task 可以对其进行拓展,新增类需要继承DungeonGeneratorInputBaseGrid2D。例如新增房间类型,每种类型有对应的模板,这样就无需对每个房间单独添加,只需要选择类型即可
- 在room templates中,每个tile必须至少于两个tile连接
Dungeon generator(地图生成器)/ Platformer generator
- 它是一个组件,存在Level Graph字段和Post Processing字段等
- 定义了地图的生成规则
后处理(Post Processing)
- 用户后处理脚本需继承DungeonGeneratorPostProcessingGrid2D,并重载Run函数,后处理逻辑由Run执行
- 后处理的逻辑在地图生成后执行。例如将角色的位置移动至出生点、生成敌人等
地图案例
现阶段问题
- 地图模板设计
- 后处理逻辑
角色控制
基础控制(走、跑、跳(二段)、冲刺),可添加额外控制(蹲、爬、滑墙、滑铲、蹬强跳等)
跳跃
- 跳跃检测和跳跃实现分开判断
- 在地面状态时重置跳跃次数
滑墙
- 通过射线检测,判断角色前方是否存在墙体,当角色不在地面且前方存在墙体时进入滑墙状态
- 当x轴输入方向和墙的方向一致时才进入滑墙
- 在滑墙状态下重置跳跃次数
蹬墙跳:
在滑墙的基础下实现
当角色在滑墙状态时,用户可以通过直接跳跃落下墙体或者通过方向加跳跃进行蹬墙跳
两种跳跃通过预设定的方向和力实现
设置canMove和canFlip两个参数,优化蹬墙跳的手感。即当在滑墙状态下输入反方向时的一小段时间内使角色无法移动和转向
问题:
- 跳跃感觉在月球
- 调整重力大小
- 跳跃直接修改速度而非添加力
- 冲刺有bug
- 设置其他条件,当碰到墙壁或时间结束都结束冲刺
- 冲刺过程中屏蔽跳跃和移动
- 攻击等需要设计
- 跳跃感觉在月球
有限状态机
敌人状态控制
Entity
敌人实体的基类
FiniteStateMachine
管理Entity当前状态,执行对应的逻辑
State
状态类,每个状态有对应的逻辑
状态转换图
enemy1:近战
enemy2:远程
Player 状态机(分层状态机)
Ledge Climb:
分为三个状态,在动画状态机中用sub-state machine完成动画状态转换
Input System
- Descirption:The Input System package implements a system to use any kind of Input Device to control your Unity content. It’s intended to be a more powerful, flexible, and configurable replacement for Unity’s classic Input Manager (the
UnityEngine.Input
class). - InputSystem对大部分常用的输入设备都定义了详细的控制类,其中具体的控制项则基于InputControl基类派生出的各种处理类,包括但不仅限于AxisControl,ButtonControl,TouchControl等。可以很方便的对多个设备的输入进行处理
Animator
- 子状态机(Sub-State Machine)
战斗系统
目标是一个框架,能够方便的装备和取消装备,且敌人也能如此
武器
让武器成为有限状态机的一个完全独立的实体,每个武器对应一个单一的攻击状态
每个武器类决定攻击状态如何和武器交互
武器结构如图
分为角色(base)和武器(weapon),base控制角色动画,weapon控制武器动画,并添加有碰撞器,用于攻击检测
sprite 切换回调
SpriteRenderer.RegsiterSpriteChangeCallback(UnityAction<SpriteRenderer> callback);
Entity重构
将所有Entity公用的方法和变量抽象成另一个类,其他Entity中增加一个对其的引用,增加代码复用性,并方便管理
- Movement:控制移动
- CollisionSenses:控制物理检测部分
- Combat:控制战斗和受伤部分,继承IDamageable、IKnockbackable等接口,并有collider用于被攻击的触发检测
- Stats:用于记录所有的数据状态,如health、mana等
- ParticleManagert:例子效果管理
- Death:死亡