游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
程序设计要求:
基本思路分析:
模式基础
- 订阅与发布模式:定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。
- 工厂模式:在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。明确地计划不同条件下创建不同实例。
- 单例模式:单一的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
架构设计
使用正常的导演、场记、动作管理员、用户操作处理器、游戏对象工厂框架,添加游戏事件处理器(用于处理外设输入事件,提供玩家运动功能)。
具体脚本和游戏对象设计:使用Maze场景作为基本游戏对象,在其上添加GameEventManager游戏事件处理器脚本、StuffFactory游戏物品工厂脚本、PatrolActionManager巡逻兵动作管理员脚本、PatrolFactory巡逻兵工厂脚本、SceneController场景控制器脚本、UserInterface用户界面和操作设计脚本;为 Player、Patrol、Stuff 设计Animation Controller
,控制在用户操作下游戏对象的动画切换(通过.GetComponent<Animator>().SetBool("isRun", true)
对Animation Controller
的转换条件参数进行设计,进而影响动画切换);为 Player、Patrol、Stuff、Maze的每个unit 添加Collider和碰撞检测器,参考博文,为这些游戏对象的子对象添加包含OnCollisionEnter
方法的脚本,并添加collider组件
,为 Patrol、Stuff、Maze的每个unit 勾选isTrigger
。
碰撞检测:为 Player 设置Inspector的Tag,根据Tag在OnCollisionEnter方法和OnTriggerEnter方法中进行碰撞检测和操作设置。
关键模块
动画的设计:需要考虑到如何使动画的切换受代码控制,在特定条件下完成动作切换,主要通过为Animation Controller的动画切换添加数值型条件,再在代码中利用Set函数设置该值,从而切换动画。
巡逻兵寻道方式:为巡逻兵设置较大的Collider,视作嗅觉范围,只有在该范围内才能检测到玩家,根本在于检测碰撞事件,当该范围的碰撞器被触发,立即获取对方碰撞器的position,并且向该地址运动,连续不间断的寻址。
碰撞检测的触发条件:与碰撞双方是否具有刚体性质密切相关。
遇到的问题
碰撞检测无法完成,根据OnCollisionEnter方法和OnTriggerEnter方法需要获得碰撞体实例,但是始终无法获得。
资源地址
github地址
视频地址