Unity设计模式之观察者模式

这篇具有很好参考价值的文章主要介绍了Unity设计模式之观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  在平常玩游戏的时候会遇到这种情况,以简单的Rpg举例。 勇者击杀了怪物,怪物死了,勇者摆出胜利姿势,系统提示怪物死亡 。如果按照一般逻辑可能会在怪物死亡的方法中去获取Player、Dialog,这样看上去其实也不太难。但如果需要去关联的事件很多,就需要在类中去获取各种各样的对象,非常麻烦而且也会使程序耦合性变高,这时就需要使用到观察者模式。

  观察者模式其本质就是通过委托将各个类中的方法都关联到一个固定的类上去,由该管理类去统一决定是否调用。由于很像是管理类去观察着各个类的情况,所以我们管这种设计模式叫做观察者模式,下面是观察者模式的简单实现。

  首先我们假定有三个对象分别是勇者(Player)、怪物(Monster)、提示框(Dialog)

 

public class Dialog : MonoBehaviour
{
    private void DialogSay(object info) {
        Debug.Log("叮咚!怪物已经寄了!");
    }
}

public class Player : MonoBehaviour
{
    
    private void Victor(object info) {
        Debug.Log("玩家摆出胜利姿势");
    }      
}
public class Monster : MonoBehaviour
{
    
    private void Start()
    {
        Dead();
    }
}

其中各自的类有各自的方法,完成不同的事情。

接下来使用统一的管理类起个名字叫做事件中心,代码如下

public class EventCenter : ISingleton
    {
        public static EventCenter Instance => Singleton<EventCenter>.Instace;

        /// <summary>
        /// 事件容器
        /// </summary>
        private Dictionary<string,UnityAction<object>> eventDic=new Dictionary<string, UnityAction<object>>();
        public void Init()
        {

        }

        /// <summary>
        /// 添加事件监听
        /// </summary>
        /// <param name="name">事件名字</param>
        /// <param name="action">准备用来处理事件的委托函数</param>
        public void AddEventListener(string name ,UnityAction<object> action) {
            if (eventDic.ContainsKey(name))
            {
                eventDic[name] += action;
            }
            else
            {
                eventDic.Add(name, action);
            }
        }

        /// <summary>
        /// 事件触发
        /// </summary>
        /// <param name="name"></param>
        public void EventTrigger(string name,object info) {
            if (eventDic.ContainsKey(name))
            {
                eventDic[name].Invoke(info);
            }
        }

        /// <summary>
        /// 移除事件监听
        /// </summary>
        /// <param name="name">事件名字</param>
        /// <param name="action">委托函数</param>
        public void RemoveEventListener(string name,UnityAction<object> action) {
            if (eventDic.ContainsKey(name))
                eventDic[name]-=action;        
        }

        /// <summary>
        /// 清空事件中心
        /// </summary>
        public void Clear() { 
            eventDic.Clear();
        }
    }

事件中心里,首先是有一个Dict事件容器Dictionary<string,UnityAction<object>>,用于存放各类事件,字典的键是事件的名字、值该事件委托。然后为了能够使在挂载事件的时候也能进行参数的传递,使用了泛型委托。然后中心对外提供四个方法,添加事件 AddEventListener、移除事件RemoveEventListener、事件触发器EventTrigge以及清空事件Clear。整个程序流程基本是,发生了某件事情,然后事件中心告知各个类对这个事件的响应。所以需要让各个类与事件中心关联起来。代码入下

    public class Player : MonoBehaviour
{
    private void Start()
    {
        EventCenter.Instance.AddEventListener("MonsterDie", Victor);
    }
    private void Victor(object info) {
        if (diedMonsterType == 1)
        {
            Debug.Log("死的是史莱姆");
        }
        Debug.Log("玩家摆出胜利姿势");
    }

    private void OnDestroy()
    {
        EventCenter.Instance.RemoveEventListener("MonsterDie", Victor);
    }             
}
    public class Dialog : MonoBehaviour
{
    private void Start()
    {
        EventCenter.Instance.AddEventListener("MonsterDie", DialogSay);
    }

    private void DialogSay(object info) {
        Debug.Log("叮咚!怪物已经寄了!");
    }
}
    public class Monster : MonoBehaviour
{
    /// <summary>
    /// 怪物类型(转发事件时参数的传递)
    /// </summary>
    public int monsterType = 1;
    private void Start()
    {
        Dead();
    }

    public void Dead()
    {
        Debug.Log("怪物已经死了");
        EventCenter.Instance.EventTrigger("MonsterDie",this.monsterType);
    }

}

当Monster被挂载到游戏对象上,游戏运行Start函数被调用,执行Dead方法,打印出“怪物已经死了”,然后事件中心触发名为“MonsterDie”事件并传入monsterType怪物类型,事件中心根据字典中的委托调用各个应该响应类中的函数。并且将monsterType作为参数传递到各个函数中,让响应类能够针对type不同做出判断,最终打印。Unity设计模式之观察者模式

 以上就是观察者模式的简单实现。文章来源地址https://www.toymoban.com/news/detail-461755.html

到了这里,关于Unity设计模式之观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(59)
  • 重温设计模式 --- 观察者模式

    观察者模式 是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色: 观察

    2024年02月13日
    浏览(59)
  • 设计模式(11)观察者模式

    一、概述: 1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2、结构图: 实现  调用

    2024年02月11日
    浏览(53)
  • 设计模式——14. 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含以

    2024年02月07日
    浏览(45)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(54)
  • 观察者设计模式

    行为型模式(Behavioral Patterns):这类模式主要关注对象之间的通信。它们 分别是: 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略

    2024年01月24日
    浏览(51)
  • 设计模式-观察者

    观察者模式是一种广泛应用于软件开发中的行为设计模式,尤其是在面向对象编程(OOP)中。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 在观察者模式中,存在两个主要角色: 主题(Subject) 或 被

    2024年01月22日
    浏览(48)
  • 设计模式:行为型模式 - 观察者模式

    定义: 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察

    2023年04月22日
    浏览(97)
  • 设计模式之二:观察者模式

    假定我们需要为Weather-O-Rama公司建立一个气象站系统,除已有的WeatherData有数据源类,还需要更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。  1 以下是一个可能的实现 上述实现有以下问题存在: 针对具体实现编程,而非针对接口(currentCon

    2024年02月13日
    浏览(39)
  • 设计模式行为型——观察者模式

    目录 观察者模式的定义 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用         观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包