由于之前好几次作业都没有写过博客了,所以这次对之前所学的做一个整体的总结
游戏要求
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
游戏设计
- 动作管理类————上次博客时,我们是通过在每个游戏对象中添加一个Move函数,即自己控制自己的移动过程。添加动作管理类后,我们则是将游戏对象的行为单独分离了出去,剥夺了游戏对象自己调用动作的能力。通过场景控制器将游戏对象传递给动作管理器,让动作管理器去移动游戏对象。当动作很多或是需要做同样动作的游戏对象很多的时候,使用动作管理器可以让动作很容易管理,也提高了代码复用性。
- SSAction————所有动作的基类,受Unity引擎场景管理。格式固定,一般来说不需要改动
- SSActionManager————动作管理器的基类,为动作基类传递游戏对象,让游戏对象完成动作或进行动作切换。该类会继承ISSActionCallback接口,以得到动作是否完成的信息
- PatrolFollowAction、GoPatrolAction————继承动作的基类,实现追捕玩家和巡逻的动作
- PatrolActionManager————继承动作管理器的基类,实现对巡逻兵动作的创建和销毁
- 工厂模式————工厂模式实现了对象创建与表示的分离。利用一个List仓库来储存我们利用预制所创建的游戏对象,并在游戏运行时控制其初始位置,颜色等基本属性
- PatrolData————保存巡逻兵所需的属性数据,在工厂进行赋值。
- PropFactory————控制每一个巡逻兵的出现位置和其他一些基本的属性,并在不需要用到巡逻兵时将其销毁。
- 订阅与发布模式————即观察者模式,通过定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- GameEventManager————专门发布事件的类,订阅者可以订阅该类的事件,当其他类发生改变的时候,会使用GameEventManager的方法发布消息,触发相应事件。
- AreaCollide————将不同区域定义不同的标示,这样巡逻兵可以了解到了解到玩家是否处于自己所巡逻的区域内。
- PatrolCollide————实现在玩家到达巡逻兵周围一定区域内是,巡逻兵去追捕玩家的事件
- PlayerCollide————实现当玩家与该巡逻区域的巡逻兵碰撞后死亡的事件
- 最后实现玩家动作的控制以及记分员的类
- UserGUI————显示玩家的界面,并向场景控制器传递消息玩家的UI信息
- FirstSceneController————通过接受动作管理类,工厂类,发布事件的类、以及记分员类所发出的信息,对场景信息进行创建、修改和移动。
UML图
部分关键的代码
- 巡逻兵追捕玩家的动作————巡逻兵朝着玩家的位置移动,当玩家离开了巡逻兵触发器的范围或是玩家已经不在该区域内则停止追捕的动作
1 | public class PatrolFollowAction : SSAction |
- 巡逻兵巡逻的动作————随机选择方向,当起始点与当前点距离大于某一个值,或者不能继续前行的时候改变方向.并随时检测在自己巡逻的区域内是否有追捕的对象,若果有则停止巡逻的动作。
1 | void Gopatrol() |
- 创建巡逻兵的工厂
1 | public class PropFactory : MonoBehaviour |
- 检测玩家是否撞到巡逻兵————通过返回Collide的属性之来确认
1 | public class PlayerCollide : MonoBehaviour |
- 检测玩家是否应该被追赶————通过挂载在子物体上的Collide的属性值来确定,自己是否应该向玩家方向移动
1 | public class PatrolCollide : MonoBehaviour |
- 检测玩家是否在自己的区域内
1 | public class AreaCollide : MonoBehaviour |
总结
这次游戏算是涉及了之前所有学到过的模式和知识点,做起来感觉比较困难,不过对照老师所给的优秀博客的介绍思路和关键代码还是可以慢慢理解,然后实现。
源代码的github地址:
https://github.com/626zdysdq/Unity3D/tree/master/Patrols
视频链接(如果播放不了,可以试试将清晰度改为超清):
http://v.youku.com/v_show/id_XMzYwMTY1Nzk5Ng==.html?spm=a2h3j.8428770.3416059.1