Unity3D制作巡逻兵小游戏

本文介绍了使用Unity3D制作的巡逻兵小游戏,重点讲解了发布与订阅模式在C#中的应用,通过delegate和event实现事件处理。游戏核心行为包括巡逻兵的路径规划、碰撞检测以及玩家交互。代码架构中,GameController和UserGui挂载在Main Camera上,PatrolEventManager作为发布者,GameController作为订阅者。文章还详细解析了巡逻兵的行为逻辑,如遇到障碍物的转向、追捕玩家的条件等。
摘要由CSDN通过智能技术生成

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();
        }
    }

    public void hunt()
    {
        if (OnHuntAction != null)
        {
            OnHuntAction();
        }
    }

    public static void Hunt()
    {
        instance.hunt();
    }

    public static void Flee()
    {
        instance.flee();
    }
}

GameController.cs 订阅者

//注册事件处理程序
public void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值