首页 > 其他分享 >[干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计

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

时间:2024-09-24 13:23:53浏览次数:3  
标签:订阅 Task name void 任务 param Unity 干货 public

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

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

得到的结果:
 

 

标签:订阅,Task,name,void,任务,param,Unity,干货,public
From: https://blog.csdn.net/2301_77947509/article/details/142460458

相关文章

  • 【Unity精品源码】JU TPS 3 – 完整的第三人称射击游戏模板
    ......
  • 【Unity】CinemachineVirtualCamera:实现第一人称视角控制
    相机视角的控制,利用CinemachineVirtualCamera插件(在packageManager中下载)实现键盘和鼠标控制第一人称视角。WASD前进后退向左向右,QE左右旋转;鼠标滚轮控制远近、俯仰和升降。另外还支持鼠标靠近边缘移动、鼠标拖拽等控制方式。成果展示Scene部分主相机增加CinemachineBrain组......
  • 干货满满!第二期流程挖掘实践训练营圆满落幕~
    2023年7月14日,望繁信科技第二期流程挖掘实践训练营在上海圆满结束!此次训练营以实战为导向,为大家提供了一个深入学习流程挖掘知识和技巧的专业交流平台,得到了广大学员们的一致好评。产品大咖面对面作为本次训练营的亮点环节,望繁信科技产品负责人曹企闻从“如何开启流程挖掘”这个关......
  • 【unity开发】以OPPO手机为例,如何连接安卓设备并调试unity程序
    1.有线调试下面全程以oppo手机为例:1.打开手机开发者模式设置->关于手机->版本信息->狂点版本号直到弹出提示打开开发者模式即可2.打开USB调试打开开发者模式之后在设置->其他设置->开发者选项->USB调试打开即可3.USB数据线连接使用USB数据线连接你的手机和电脑,并确保USB......
  • Android平台Unity3D下如何同时播放多路RTMP|RTSP流?
    技术背景好多开发者,提到希望在Unity的Android头显终端,播放2路以上RTMP或RTSP流,在设备性能一般的情况下,对Unity下的RTMP|RTSP播放器提出了更高的要求。实际上,我们在前几年发布Unity下直播播放模块的时候,就已经支持了Android多实例播放RTMP|RTSP,随着大家对这块的技术诉求和性能要求越......
  • 【Unity】UI、背景和3D的Camera和Canvas设置
    目前存在需求背景是指定的图片,该图片始终显示在页面中,不会因场景的视角操控发生尺寸等变化;UI内容显示在页面最上层,同样不会因场景的视角操控发生尺寸等变化,但是当软件整个尺寸发生变化时,会跟随变化,UI内容会覆盖3D物体;3D物体可以随着相机视角的变化而变近变远等,3D物体上可能存在......
  • 干货分享!推荐5款AI毕业论文写作软件和网站
    在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。以下是五款推荐的AI毕业论文写作软件和网站,其中特别推荐千笔-AIPassPaper。1.千笔-AIPassPaper千笔-AIPassPa......
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
    技术背景好多开发者跟我们做技术交流的时候,会问我们,为什么有Unity3D的RTMP|RTSP播放模块,还有RTMP推送和轻量级RTSP服务模块,为什么不去支持虚幻引擎?二者区别在哪里?本文就Unity3D和虚幻引擎之间的差异,做个大概的分析,实际上,Unity3D和虚幻引擎(UnrealEngine)在游戏开发及其他相关领域都......
  • 干货整理: 什么软件能够监控电脑? 六大好用监控电脑软件抢手推荐
    想知道你手下的员工在电脑上到底做了什么?是在认真工作,还是在悄悄“刷剧”“逛淘宝”?别担心,科技早已为我们准备好了解真相的秘密武器!今天,我们为你精心挑选了六款抢手的电脑监控软件,每一款都能让你在幕后掌握全局,轻松做到“眼观六路,耳听八方”。准备好一起揭开屏幕背后的秘......
  • unity的移动方式
    关于unity获取外设的输出:Input.GetAxis 或Input.GetAxisRaw是Unity引擎中的一个方法,用于获取用户输入设备(如键盘、鼠标、游戏手柄等)的模拟值。它通常用于处理平滑的输入,比如移动、旋转和缩放。[GetAxis 返回一个介于-1和1之间的浮点数值,表示输入设备的状态。][如果......