[Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
一个简单的单机闯关小游戏,主角到达终点即为胜利,关卡中有两种怪物能够对主角造成伤害,此外还有灯、陷阱、宝箱等场景互动要素,主角从宝箱中获得枪后能够进行射击杀死怪物
游戏逻辑简述
主角
初始有三点血量,被怪物攻击或触发陷阱回收到伤害,血量为零时进行副本结算,成功到达终点后游戏胜利
当获得武器后可以发射子弹,子弹会沿直线飞行,碰到障碍物、怪物、墙壁后,子弹消失
怪物
石像鬼
无法移动,血量无限,攻击到主角会直接将主角杀死
AI:来回探照,探照到主角后将主角杀死
幽灵
初始九点血量,当被子弹攻击后根据角色攻击力扣除血量,血量为0后死亡,3秒后出生点符火
AI:出生后在一定范围内巡逻,被攻击后会追逐主角直到死亡
场景互动物体
灯光
灯每15秒自动亮一次,亮10秒钟自动熄灭,灯亮起时,灯光范围内的怪物死亡
主角操作开关改变当前房间灯的状态(关-》开,开-》关),状态改变后场景机制的灯重新计时。
减速陷阱
主角触发陷阱后会减少主角50%移动速度,主角离开陷阱后依然会持续5秒减速效果。
地刺陷阱
每间隔3秒会伸出尖刺,持续3秒,尖刺缩回,重新开始计时。当尖刺处于伸出状态时,主角在陷阱范围,每秒会受到1点伤害。
宝箱
打开宝箱后主角可以获得一把武器
实现简述
由于实现功能较为简单,因此只简述实现思路
类组织结构
使用彩色建模的思想组织类结构,类图:
SceneObject
所有场景物体包括主角、怪物、互动物体等的抽象基类,仅有init()
抽象方法
Character
拥有血量和攻击力的实体继承自Character,同时实现getATK()
和beDamage()
抽象方法用于处理攻击和受击逻辑
SceneItem
其他场景实体继承自SceneItem,无特殊属性和方法
Scene
场景管理类,能偶根据Json文件生成场景物体,保存了实体预制体,还拥有一个静态List和静态方法用于运行时向场景中添加新实体
InteractionMI
用于处理单个实体无法处理或不属于单个实体的逻辑,包括:
- 幽灵追踪主角时获取角色位置
- 帮助实体初始化定时器组件
- 减速陷阱是否可以回复主角速度
- 主角与灯、宝箱、武器的交互
DamageMI
包含静态方法Damage()
专门用于处理伤害逻辑,方便后续服务器验证等逻辑
逻辑实现
主角
Protagonist类用于处理主角相关逻辑
受击逻辑
当主角不处于无敌状态,播放受击动画,扣除血量并进入无敌状态,定时器定时一秒后关闭无敌状态
交互逻辑
用户输入交互信号后,交由InteractionMI判断交互是否成功,返回交互信息,主角播放对应动画
武器逻辑
当主角获得武器后,主角身上保存武器的引用,与武器交互直接调用武器的对应方法(Drop()
,Fire
())
结算逻辑
当主角HP小于等于0时,调用Scene的静态方法,请求场景结算
怪物
石像鬼
血量无限,没有受击逻辑,当检测组件检测到主角时,调用继承的Attack方法,攻击主角
幽灵
三种状态:die、patrol,chase
死亡状态下三秒后会在第一个导航点复活
巡逻状态下检测到主角会调用继承的Attack方法攻击主角
追逐状态下会每帧获得主角位置追逐主角
其他场景物品
灯光
初始化时添加计时器用于控制自动开关,用户交互后重置计时器
开启时使用一个锥形的检测器检测幽灵是否在范围内,如果在调用Damage对幽灵造成伤害
存在一个Box Collider,当玩家进入时,调用InteractionMI的方法,将InteractionMI保存的静态SwitchableLight
引用置为自己,当玩家交互时这个引用不为null,则调用这个引用的SwitchableLight的ChangeLight
方法完成开关灯的交互
减速陷阱
当玩家进入时,调用InteractionMI的方法,使其内置的静态_slowDownCount
计数加一,并调用玩家的SetSpeedRatio
方法使玩家减速
当玩家离开,设置计时器5秒后调用InteractionMI的方法,使其内置的静态_slowDownCount
计数减一,当计数为零时才可以调用玩家的SetSpeedRatio
方法使玩家回复正常速度
地刺陷阱
初始化时设置计时器,每三秒改变一次状态,当玩家进入,设置计时器每一秒对玩家造成一次伤害,当玩家离开,取消计时器
宝箱
内置public GameObject GWeapon;
用于保存要生成的枪的预制体
当玩家第一次与宝箱交互,播放开宝箱动画,设置计时器1.2秒后根据预制体克隆一个武器,并将武器通过Scene的静态方法加入到Scene维护的SceneObject列表中,自身保存新生成的武器的引用
当武器生成后玩家再与宝箱交互则通过InteractionMI的方法将武器父节点设为玩家,玩家获得武器的引用,自身武器引用置为null
武器
内置private Transform _parent = null;
用于保存父物体
Drop方法被调用时,若父物体不为空,设置自身刚体属性,设置速度使武器有抛出效果,设置计时器1秒后恢复到没有物理效果的状态,父物体置为空
Fire方法被调用,若能够开火,则生成并初始化一个子弹,生成时将保存的父物体的Transform给子弹,保证子弹能够向角色前方发射,开火后设置开火状态为不能开火,设置计时器0.5秒后恢复开火状态
当父物体信息为空,与其他交互逻辑类似,通过InteractionMI完成武器捡起的交互逻辑
子弹
初始化时设置初速度,启动定时器1秒后若没有销毁则自动销毁,若碰撞到幽灵,对幽灵造成伤害,其他碰撞销毁自己