一、主体代码架构说明
类 | 作用 |
---|---|
GameController | 场记,加载资源,管理得分和游戏状态 |
PatrolFactory | 巡逻兵工厂 |
PatrolEventManager | 事件发布者(抓捕成功和逃跑成功的事件) |
PlayerController | 玩家控制器,负责玩家的移动、碰撞检测、动画调用 |
PatrolController | 巡逻兵控制器,负责检测巡逻兵的状态,动画调用 |
PatrolBody | 检测巡逻兵的近距离碰撞,并告知PatrolController |
PatrolAction | 巡逻兵动作 |
PatrolActionManager | 巡逻兵动作管理器 |
UserGUI | 接收用户输入,传递给场记;显示得分 |
其中GameController.cs和UserGui.cs挂载在Main Camera上。
其余代码为基类或接口,和门面模式、动作管理器模式等有关,在此不作介绍。
二、发布与订阅模式
本周使用了发布与订阅模式。
相关类图
C#中的实现:delegate委托类型和event事件机制
在C#中,可以通过delegate委托类型和event事件机制来实现。
就我个人的粗浅理解来看,事件相当于一个列表,它可以存放多个有类似的签名、定义在不同类内的方法。定义某个委托类型,并用它创建事件,就是给这个列表指定方法的签名类型。这些方法内部可以有不同的实现/事件处理。
比如说,有一个要求,篮子里的苹果必须是绿色的。苹果是方法,“绿色”是方法的签名,这个要求是一个委托。由这个要求指定的篮子,就是由这个委托定义的事件。深绿色、浅绿色、黄绿色等等,就是加到这个事件上的不同的事件处理程序了。它们有类似的签名(“绿色”),但是有不同的方法体(颜色的深浅等)。
那么,在C#里,delegate相当于以上设计模式类图里的接口AttackHandle,event相当于Subject下的List< AttackHandle >。包含这个event的类就是Publisher,往这个event上添加自己的事件处理程序的类,就是Subscriber.
意义
那么这种模式有什么意义呢?我觉得有以下几点好处:
- 在有多个类需要处理某个事件时,可以只用一个事件就通知到它们,让它们各自作出反应,而不必在这些类里分别检测事件并处理。这样可以将事件源与事件处理者解耦。
- 允许有不同的处理方法。
在本次游戏中的具体应用
PatrolEventManager.cs 发布者
public class PatrolEventManager : MonoBehaviour {
public static PatrolEventManager instance;
public delegate void HuntAction(); //巡逻兵抓获成功
public static event HuntAction OnHuntAction;
public delegate void FleeAction(); //玩家逃跑成功
public static event FleeAction OnFleeAction;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void flee()
{
if (OnFleeAction != null)
{
OnFleeAction();
}
}
public void hunt()
{
if (OnHuntAction != null)
{
OnHuntAction();
}
}
public static void Hunt()
{
instance.hunt();
}
public static void Flee()
{
instance.flee();
}
}
GameController.cs 订阅者
//注册事件处理程序
public void