unity3d 巡逻兵小游戏
应用事件订阅与发布模式.
Patrol
关于这个游戏的制作已经有很多大神给了详细的实现和分析, 比如这个, 我在这里就不现丑了, 主要分享我如何 从零开始 做好这个游戏.
准备工作
- 将之前写好的比如 userGUI, Director, FirstController, Singleton, Factory, CCActionManager, SSActionManager, SSAction 这些文件复制到我们新项目的 Scripts 文件夹, 之前写的这些代码很多都可以重复使用, 就不必重新写了.
- 找到合适的模型资源、贴图等(也可以用简单的cube实现).
实现部分
总体来说, 整个过程是可视化+传统Debug来完成的, 所以首先会忽略很多的细节问题, 然后一步一步加以完善.
GUI
就是一些按钮和分数显示, 是之前做过的, 点击 restart 后会重新开始, 这里先忽略细节.
加载资源
将墙壁、平面、玩家、士兵加载到地图, 观察效果
1 | // @FirstController.cs |
这一步通常需要你调整资源到合适的位置, 因为已经可以运行看到效果了, 所以预计你的调整会很快完成. 我这里没有写 加载玩家 的代码, 请自己实现.
玩家移动
利用Unity的Input, 实现可控玩家的移动操作部分. 在这里我实现了行走、跳跃.
完成后请运行测试.
1 | @PlayerMove.cs |
士兵移动
在这里需要暂停一下, 要考虑清楚你想让士兵怎么移动, 矩形? 五边形? 六边形?……
如果是有规律的, 一般可以新建一个 动作类 继承 SSAction
, 然后用CCActionManager
来管理.
在这里, 我把巡逻的矩形区域分成了 上下左右 四个部分(随机取点), 以逆时针的方向巡逻.
1 | @CCActionManager.cs |
1 | // @ Class CCActionManager |
士兵抓捕玩家
巡逻兵在设定范围内感知到玩家,会自动追击玩家;
一种方法是巡逻兵记录它的设定范围, 然后每帧判断玩家是否进入, 然后再修改 PatrolAction, 不过这样类与类之间的关系就会变得十分复杂了, 不便于维护(实际上如果出了什么bug, 修复起来也是十分难受的).
我的方法是将逻辑分层成 玩家->区域->士兵, 玩家在各个区域移动(有一个记录玩家区域的标识), 士兵在设定区域巡逻(它们拥有相同的标识). 当玩家走进一个新区域时, 会触发一个事件, 让巡逻兵检查玩家是否闯进了自己巡逻的区域(根据标识), 以此修改自己状态(巡逻|抓捕).
这样分工后逻辑清晰, 每个类也不至于很臃肿. 那么下面就一步一步实现这个过程.
区域检测玩家
绿色线包围着的就是一个作为触发器的碰撞体, 当玩家进入时可以触发OnTriggerEnter
, 在里面可以根据name
或者tag
判断是否为玩家.
1 | @AreaController.cs |
订阅与发布模式
上面的代码可以看到触发了事件, 再根据更之前的讨论, 是巡逻兵订阅了这个事件, 事件触发, 巡逻兵执行对应函数检查玩家是否在自己的区域中.
1 | @GameEventManager.cs |
1 | @FirstController.cs |
1 | @Patrol.cs |
抓捕行动(Action)
上面已经实现到状态的切换了(巡逻|抓捕), 然后就是动作的切换. 在 PatrolAction 中判断状态来进行相应的动作就OK.
1 | @CCActionManager.cs |
到这里, 这一部分也告一段落了, 接下来就只是一些细节的问题了.
游戏结束
当巡逻兵与玩家发生碰撞时, 游戏结束. 这可以类似玩家进入区域的判定方法, 不过这里用的是碰撞事件OnCollisionEnter
1 | @Patrol.cs |
v1.5.2