[干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计

news2024/9/23 17:22:04

本文师承于唐老师,但是修改了一些代码,采用更加方便理解的方式设计

 1.什么是事件中心

2.可以比喻成冒险者工会的任务板子 

任务板子上面有发布任务和任务完成两种基础情况

2.1 发布任务

来个冒险者发布一个任务,就执行Pulishtask方法

这个方法中包含了任务名字和完成后的需要做的事情(比如:发放奖励,完成任务后的银趴等等)

2.2 任务完成

任务完成的话就执行一下TaskCompelte方法,发布者观察到之后就触发奖励

3.上代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class BulletinBoard : SingleBase<BulletinBoard> {
    /// <summary>
    /// 一个告示板 ,string代表任务名,UnityAction<object>代表交任务后的事件
    /// </summary>
    private Dictionary<string, UnityAction<object>> Task = new Dictionary<string, UnityAction<object>>();

    public void PublishTask(string name, UnityAction<object> unityAction) {
        if (Task.ContainsKey(name)) {
            Task[name] += unityAction;
        }
        else {
            Task.Add(name, unityAction);
        }
    }

    /// <summary>
    /// 任务完成,如果有对应任务就提交并触发后续事件
    /// </summary>
    /// <param name="name">任务名</param>
    /// <param name="param">任务参数</param>
    public void TaskComplete(string name, object param) {

        if (Task.ContainsKey(name)) {
            Task[name].Invoke(param);
        }
        else {
            Debug.LogWarning($"任务 '{name}' 不存在。");
        }
    }
    /// <summary>
    /// 移除(指定)任务
    /// </summary>
    /// <param name="name">任务名</param>
    public void RemoveTask(string name) {
        Task.Remove(name);
    }
    /// <summary>
    /// 清空所有任务
    /// </summary>
    public void ClearBulletin() {
        Task.Clear();
    }
    /// <summary>
    /// 过场景不销毁
    /// </summary>
    /// <param name="obj"></param>
    public void DontDestroyBulletin(GameObject obj) {
        GameObject.DontDestroyOnLoad(obj);
    }
}

4.上例子

比如A发布了一个任务,并且设定好了任务完成后的事件

public class TextBulletin1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        BulletinBoard.Instance.PublishTask("怪物死亡", param=>GetGold(param));
    }

   public void GetGold(object param)
        {
        Debug.Log("得到金币"+"怪物类型为:"+ param);
    }
}

B就去完成任务,触发任务完成函数 

public class TextBulletin2 : MonoBehaviour {
    // Start is called before the first frame update
    void Start() {
        StartCoroutine(DelayedDelivery());
    }

    private IEnumerator DelayedDelivery() {
        yield return new WaitForSeconds(0.1f); // 延迟0.1秒
        MonsterDead();
    }

    public void MonsterDead() {
        Debug.Log("怪物死掉了");
        BulletinBoard.Instance.TaskComplete("怪物死亡","A");
    }
}

得到的结果:
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程】状态转换图 其他图形工具

状态转换图 一、定义 二、符号表示 其他图形工具 一、层次方框图 二、Warmer图 三、IPO图 例题 选择题

【k8s】:DevOps 模式详解

1.什么是DevOps模式&#xff1f; DevOps 是当下非常火爆的一个概念&#xff0c;受到了很多互联网巨头的推崇。那么什么是 DevOps&#xff1f;它的全称是&#xff1a;集成开发与运维。至于它到底是干什么用的&#xff0c;为什么现在这么火爆&#xff0c;还得从源头说起。 1.1 …

无线感知会议系列【4】【基于WiFi和4G/5G的非接触无线感知:挑战、理论和应用-2】

前言&#xff1a; 本篇重点分享一下该论文 《Human Respiration Detection with Commodity Wifi Devices: Do User Location and Body Orientation Matter》 接 2020年北京智源大会 张大庆老师的一个报告 参考&#xff1a; https://blog.csdn.net/chengxf2/article/detai…

17.2 ksm源码讲解

本节重点介绍 : k8s资源对象的 buildStores构造函数注入MetricFamiliesk8s client-go 之 Reflector listAndWatch 方法watchHandler 监听更新&#xff0c;调用add等action 架构图总结 项目地址 地址 go get go get -v -d k8s.io/kube-state-metrics/v2v2.1.1源码分析 m…

uniapp微信小程序用户授权方法

效果 步骤 1&#xff09;div标签 <button type"primary" class"btn-login" click"getUserInfo">一键登录</button>2&#xff09;js方法 methods: {getUserInfo() {console.log("aaaa")uni.getUserProfile({desc: Wexin, …

Python画笔案例-056 绘制正方形金字塔

1、绘制正方形金字塔 通过 python 的turtle 库绘制 正方形金字塔,如下图: 2、实现代码 绘制正方形金字塔,以下为实现代码: """正方形金字塔.py """ import turtledef draw_square(length):for _ in

【Linux】yum、vim、gcc使用(超详细)

目录 yum 安装软件 卸载软件 查看安装包 安装一下好玩的命令 vim vim基本操作 模式切换 命令集 vim批量注释 vim配置 gcc 函数库 小知识点&#xff1a; Linux中常见的软件安装方式 --------- 下载&&安装 a、yum/apt b、rpm安装包安装 c、源码安装 y…

SDK(1.1note)

什么是SDK 控制台程序&#xff08;Console User interface&#xff09;CUI 对于控制台程序&#xff0c;通用&#xff0c;也就是平台无关 图形界面系统 可是如果你想要播放一个音乐&#xff0c;C语言有嘛&#xff1f; 所以需要平台开发&#xff0c;不可以移植性 平台会提供…

摒弃“流量思维”,以精准流量驱动企业发展——基于开源 AI 智能名片、链动 2+1 模式及 O2O 商城小程序的思考

摘要&#xff1a;本文深入探讨在当前竞争激烈的营销环境下&#xff0c;摒弃“流量思维”的紧迫性与必要性。强调做内容营销不能仅仅局限于发文案&#xff0c;而应摆脱一味追求阅读量、推荐量和粉丝数的误区&#xff0c;聚焦于获取精准流量。结合开源 AI 智能名片、链动 21 模式…

如何解决npm下载Puppeteer卡死的问题

亲测有效 export PUPPETEER_DOWNLOAD_BASE_URLhttps://cdn.npmmirror.com/binaries/chrome-for-testingnpm install https://github.com/cnpm/binary-mirror-config/pull/47https://github.com/cnpm/binary-mirror-config/pull/47 PS: 最开始看了下面这两个链接&#xff0c…

网络安全-长亭雷池的sql绕过

一、环境 雷池官网docker安装我的版本是 看官网介绍主要防御top10 二、讲解 我这里只描述通用型绕过&#xff0c;对于事件型不多描述&#xff0c;因为通用型的绕过是通杀的&#xff0c;差异化绕过 正常来说我们是因为没有一个很好的过滤所以造成第11关靶场的绕过 但是现在有了…

Stable Diffusion进阶篇:模型训练(附秋叶模型训练器)

前言 今天就来学习下Stable Diffusion关于微调训练方面的知识点。 今天没多少废话&#xff0c;因为我下午要去玩PTCG&#xff01;让我们冲冲冲 整理和输出教程属实不易&#xff0c;觉得这篇教程对你有所帮助的话&#xff0c;可以点击&#x1f447;二维码领取资料&#x1f618…

k8s介绍-搭建k8s

官网&#xff1a;https://kubernetes.io/ 应用部署方式演变 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计…

Active Directory 实验室设置第二部分- 添加数据到AD域

在之前的文章中&#xff0c;我们已经讨论了AD森林的安装和AD基础知识。在这篇文章中&#xff0c;让我们开始使用 AD 对象&#xff08;如用户对象、计算机对象、组对象、网络共享等&#xff09;填充 AD 环境&#xff0c;以及计算机如何加入域。 #1、添加用户对象 可以使用GUI、…

什么是CPQ?一文讲解什么是CPQ选型配置报价系统

什么是CPQ选型配置报价? CPQ&#xff0c;是英文名 Configure Price Quote的缩写&#xff0c;中文称为配置报价软件。该软件经常出现在销售行业。它是一种可以快速为企业报价的销售工具。企业在报价时&#xff0c;会综合考虑数量、折扣、产品可选功能等。CPQ软件能够整合企业的…

Linux学习之路 -- 线程 -- 互斥

目录 1、概念引入 2、互斥锁 1、pthread_mutex_init && pthread_ mutex_destory 2、pthread_mutex_lock && pthread_mutex_unlock 3、互斥锁原理的简单介绍 1、概念引入 为了介绍线程的同步与互斥&#xff0c;我们以抢票逻辑引入相关的概念。 示例代码…

harmonyOS 原来构建还有这么多弯弯绕绕

随着用户需求的不断增长&#xff0c;我们的 APP 已发展成功能丰富的超级APP&#xff0c;这也导致打包构建变得非常耗时&#xff0c;可能需要数小时&#xff0c;严重影响开发效率和产品迭代。通过采用模块化设计、增量构建、并行处理、缓存机制、优化依赖管理&#xff0c;以及云…

SSM整合步骤

目录 一、Mybatis整合Spring 1、整合后的maven坐标 2、核心配置文件 3、pojo、mapper、service配置 4、单测 二、整合SpringMVC 1、引入springMVC的坐标并配置tomcat 2、核心配置文件 3、controller配置 4、启动项目并测试 SSM SpringMVC Spring Mybatis 整合顺序&#xff1…

Spring AOP - 注解方式实现

前文已经讨论了基于配置文件方式实现Spring AOP&#xff08;Spring AOP - 配置文件方式实现&#xff09;&#xff0c;本文采用注解的方式实现前文相同的功能。配置步骤如下&#xff1a; 1、项目增加aop依赖&#xff08;pom.xml) <dependency><groupId>org.springfr…

大数据:快速入门Scala+Flink

一、什么是Scala Scala 是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”&#xff08;Scalable Language&#xff09;的缩写&#xff0c;意味着它被设计为能够适应不同规模的项目&#xff0c;从小型脚本到大型分布式…