Unity3D制作巡逻兵小游戏

Github上的项目代码和视频链接

一、主体代码架构说明

作用
GameController 场记,加载资源,管理得分和游戏状态
PatrolFactory 巡逻兵工厂
PatrolEventManager 事件发布者(抓捕成功和逃跑成功的事件)
PlayerController 玩家控制器,负责玩家的移动、碰撞检测、动画调用
PatrolController 巡逻兵控制器,负责检测巡逻兵的状态,动画调用
PatrolBody 检测巡逻兵的近距离碰撞,并告知PatrolController
PatrolAction 巡逻兵动作
PatrolActionManager 巡逻兵动作管理器
UserGUI 接收用户输入,传递给场记;显示得分

其中GameController.csUserGui.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();
        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值