文章目录
写在前面
- 实验参考博客,感谢指导!:
游戏规则与要求
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
以上只是老师课程网站的基本要求,可是仅仅把躲避巡逻兵作为目标来获取高分未免太过单调了,所以我还添加了一点胜利的条件:
- 地图共分为9个单元(9宫格形式),玩家所在的初始格子为安全区,对角线上的格子为目标区。达到目标区为胜利。
- 目标区开始的时候封闭,只有触发条件才能开启缺口:
条件就是需要获取场景内的3个红球,获取方式是触碰加鼠标点击。
游戏实现
订阅发布模式
首先是课上讲到的订阅发布模式(观察者模式)的应用:
首先是需要定义一个信息发布者,也就是类似于现在的公众号、报刊中心等等。
我的理解是它只是作为一个平台去发布消息,但是真正消息的拥有者或者说触发者是别的类。一旦消息被触发,他就会发出一个通知,所有订阅了消息的人都会收到通知,然后去执行相应的动作。
所以说这个发布者可以看作是一个被动的角色,所有需要发布消息的类都通过发布者来实现。举个例子,某粉丝关注了微博大V,相当于订阅了该事件,当大V发微博的时候就会通过这个微博平台发布,粉丝就可以获取信息。注意的是,微博平台并不会替大V编辑消息内容,它只负责传递,真正通信的其实是除了发布平台的双方。
处理逻辑方面,就是当平台发布了消息,那么订阅者就会采取相应的措施,比如这个游戏中,平台发布了游戏结束的信息,那么订阅者可能就会停止工作,等待下一轮游戏开始。
发布者代码:
public class GameEventManager : MonoBehaviour
{
// 玩家逃脱事件
public delegate void EscapeEvent(GameObject patrol);
public static event EscapeEvent OnGoalLost;
// 巡逻兵追击事件
public delegate void FollowEvent(GameObject patrol);
public static event FollowEvent OnFollowing;
// 游戏失败事件
public delegate void GameOverEvent();
public static event GameOverEvent GameOver;
// 游戏胜利事件
public delegate void WinEvent();
public static event WinEvent Win;
// 玩家逃脱
public void PlayerEscape(GameObject patrol) {
if (OnGoalLost != null) {
OnGoalLost(patrol);
}
}
// 巡逻兵追击
public void Fo