Unity进阶-消息框架的理论知识与实际操作学习笔记

news2024/10/5 19:13:28

文章目录

  • Unity进阶-消息框架的理论知识与实际操作学习笔记

Unity进阶-消息框架的理论知识与实际操作学习笔记

笔记来源课程:https://study.163.com/course/courseMain.htm?courseId=1212756805&_trace_c_p_k2_=8c8d7393c43b400d89ae94ab037586fc
在这里插入图片描述

这种框架其实就是分层管理了很多脚本,防止脚本调用产生的耦合性问题。

它的基础部分分为三个部分 脚本基础类,管理层基础类 ,以及命令类。

  • 脚本基础类:一切功能脚本的模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZFBybQj-1689861770827)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720091438.png)]

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

public class MoonBase : MonoBehaviour
{
    public virtual void ReceiveMessage(Message message){
        
    }
}

  • 管理层类:所有管理层都来自于此

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wku9sHdm-1689861719422)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720093919.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVjDmZaE-1689861719424)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720093933.png)]

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

public abstract class ManagerBase : MyrSingletonBase<ManagerBase>
{
   public List<MoonBase> Monos = new List<MoonBase>();

   public void Register(MoonBase mono){
    if (!Monos.Contains(mono)){
        Monos.Add(mono);
    }
   }
   
   public virtual void ReceiveMessage(Message message){
    if (message.Type != GetMessageType()){
        return;
    }
    foreach (var mono in Monos){
        mono.ReceiveMessage(message);
    }
   }
   
   public abstract byte GetMessageType();
}

  • 命令基类:所有的命令都来自于此

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdRLGVHX-1689861719424)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720090818.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmlSHRaP-1689861719425)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720091245.png)]

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

public class Message 
{
   public byte Type;
   public int Command ;
   public object Content;
   public Message() {}
   
   public Message(byte type, int command, object content) {
       Type = type;
       Command = command;
       Content = content;
   }
}
//消息类型
public class MessageType
{
    //类型
    public static byte Type_Audio = 1;
    public static byte Type_UI = 2;
    public static byte Type_Player = 3;
//声音命令
    public static int Audio_PlaySound = 100;
    public static int Audio_StopSound = 101;
    public static int Audio_PlayMusic = 102;
//UI命令
    public static int UI_ShowPanel = 200;
    public static int UI_AddScore = 201;
    public static int UI_ShowShop = 202;

}

DLC:泛型的单例类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSG3uab4-1689861719426)(C:/Users/86188/Desktop/QQ%E6%88%AA%E5%9B%BE20230720093200.png)]

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

public class MyrSingletonBase<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance {
        get
        {
            return instance;
        }
    }

    protected virtual void Awake() {
        instance = this as T;
    }

    protected virtual void OnDestroy() {
        instance = null;
    }
}

实际操作:使用消息框架制作吃金币功能

  • 创建消息中心

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWETV35X-1689861719427)(QQ%E6%88%AA%E5%9B%BE20230720094300.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MessageCenter : MyrSingletonBase<MessageCenter>
    {
        public List<ManagerBase> Managers = new List<ManagerBase>();
    
        public void Register(ManagerBase manager){
            if (!Managers.Contains(manager)){
                Managers.Add(manager);
            }
        }
    
        public void SendCustomMessage(Message message){
            foreach(var manager in Managers){
                manager.ReceiveMessage(message);
            }
        }
    }
    
    

    随便找个对象绑定上

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzSxfgW7-1689861719427)(../AppData/Roaming/Typora/typora-user-images/image-20230720212824307.png)]

    • 管理层–UI管理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f8bFbyIH-1689861719428)(QQ%E6%88%AA%E5%9B%BE20230720102806.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UiManager : ManagerBase
    {
        void Start()
        {
            MessageCenter.Instance.Register(this);
        }
    
      public override byte GetMessageType()
        {
            return MessageType.Type_UI;
        }
        
    }
    
    

    绑定到canvas上

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDTOy3qr-1689861719428)(../AppData/Roaming/Typora/typora-user-images/image-20230720212922833.png)]

  • 功能脚本–控制页面显示

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLWKtfg1-1689861719429)(QQ%E6%88%AA%E5%9B%BE20230720103250.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Panel : MoonBase
    {
        public Text text;
    
        void Start() {
            UiManager.Instance.Register(this);
        }
        
        public override void ReceiveMessage(Message message){
            base.ReceiveMessage(message);
            
            if(message.Command == MessageType.UI_AddScore){
                int score = (int)message.Content;
                text.text = "分数" + score;
            }
        }
    }
    绑定到panel上
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P1c4mK7h-1689861719429)(../AppData/Roaming/Typora/typora-user-images/image-20230720212946609.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rf3oaifv-1689861719430)(../AppData/Roaming/Typora/typora-user-images/image-20230720213232311.png)]

    • 控制玩家触发

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNw38Wk0-1689861719430)(QQ%E6%88%AA%E5%9B%BE20230720205232.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apDxyOXK-1689861719430)(QQ%E6%88%AA%E5%9B%BE20230720103839.png)]

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

public class PlayerManager : MonoBehaviour
{
    int score = 0;
    void Start()
    {
        
    }

    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 dir = new Vector3(horizontal, 0, vertical);
        if (dir != Vector3.zero){
            transform.Translate(dir * 5 * Time.deltaTime);
        }
    }

    private void OnTriggerEnter(Collider other) {
        if(other.tag == "Coin"){
            score += 1;
            Destroy(other.gameObject);
            MessageCenter.Instance.SendCustomMessage(new Message(MessageType.Type_UI, MessageType.UI_AddScore, score));
        }
    }
}

绑定到主角胶囊上:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lj1pWb9l-1689861719431)(../AppData/Roaming/Typora/typora-user-images/image-20230720212617176.png)]

功能就完成了!!

复盘:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kH03RACn-1689861719431)(../Downloads/%E6%9C%AA%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.jpg)]

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

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

相关文章

实现锂电池形状的数据可视化css+js

1.效果图 2.需求根据后端返回数据改变里面的高度 HTML&#xff1a; <div class"dianchichi"><div class"limian" id"divElementId"></div></div> css: .dianchichi {width: 84px;height: 146px;display: flex;justify-…

Two Days wpf 分享 分页组件

迟来的wpf分享。 目录 一、序言 二、前期准备 三、前端界面 四、后台代码部分 1、先定义些变量后面使用 2、先是按钮事件代码。 首页按钮 上一页按钮 下一页按钮 末尾按钮 画每页显示等数据 每页显示多少条 判断是否为数字的事件 分页数字的点击触发事件 跳转到…

Docker安装Nexus并配置Maven私服

1 准备工作 1 服务器已安装docker, docker各命令无报错 2 通过dockerhub查看nexus的版本信息&#xff0c;此次使用的镜像为&#xff1a;sonatype/nexus3&#xff0c;可以看到latest版本更前的的是3.58.0&#xff0c;我们这次就使用这个版本的nexus3. 2 开始安装 # 下载镜像 do…

springcloudAlibaba之springboot如何加载nacos配置文件

配置文件想必大家都很熟悉&#xff0c;无论什么架构 都离不开配置&#xff0c;虽然spring boot已经大大简化了配置&#xff0c;但如果服务很多 环境也好几个&#xff0c;管理配置起来还是很麻烦&#xff0c;并且每次改完配置都需要重启服务&#xff0c;nacos config出现就解决了…

【JavaEE】Servlet常用的API

目录 前言 一、HttpServlet类 1、Servlet的生命周期 ✨tomcat的两个端口 ✨设置告诉浏览器使用那种字符集解析响应 ✨Java中Unicode和utf8字符集的使用 二、HttpServletRequest类 1、获取请求的信息 2、 前端给后端传递数据的三种方式 2.1、通过query string传递 2.2…

unity--2d( A*寻路)

目录 一.网格式寻路 1.创建一个A*寻路脚本&#xff0c;命名为"AStarPathfinding.cs"。 2.创建一个人物控制的脚本&#xff0c;命名为"CharacterController2D.cs"。 3.创建一个游戏管理脚本&#xff0c;命名为"GameManager.cs"。 二.UGUI下的…

《零基础入门学习Python》第063讲:论一只爬虫的自我修养11:Scrapy框架之初窥门径

上一节课我们好不容易装好了 Scrapy&#xff0c;今天我们就来学习如何用好它&#xff0c;有些同学可能会有些疑惑&#xff0c;既然我们懂得了Python编写爬虫的技巧&#xff0c;那要这个所谓的爬虫框架又有什么用呢&#xff1f;其实啊&#xff0c;你懂得Python写爬虫的代码&…

基于半监督算法的工业图像缺陷检测方法:MemSeg

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2205/2205.00908.pdf 代码&#xff1a;https://github.com/TooTouch/MemSeg 主要贡献 提出了一个精心设计的异常模拟策略&#xff0c;用于模型的自监督…

缓存雪崩问题及解决思路

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。为了解决这个问题&#xff0c;我们可以采取以下几种方案。 1. 给不同的Key的TTL添加随机值 在设置缓存的过期时间&#xff08;TTL&#xff09;时…

PhpStudy靶场首页管理

PhpStudy靶场首页管理 一、源码一二、源码二三、源码三四、源码四 一、源码一 index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>靶场访问首页</title><style>body {background-color: #f2f2f2;colo…

一个月学通Python(二十三):RESTful架构和DRF入门

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

【字符流】案例:集合到文件(改进版)

案例&#xff1a;集合到文件&#xff08;改进版&#xff09; 1.需求&#xff1a; 把ArrayList集合中的学生数据写入到文本文件。要求&#xff1a;每一个学生对象的数据作为文件中的一行数据 ​ 格式&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;居住地 2.思…

python与深度学习(五):CNN和手写数字识别

目录 1. 说明2. 卷积运算3. 填充4. 池化5. 卷积神经网络实战-手写数字识别的CNN模型5.1 导入相关库5.2 加载数据5.3 数据预处理5.4 数据处理5.5 构建网络模型5.6 模型编译5.7 模型训练、保存和评价5.8 模型测试5.9 模型训练结果的可视化 6. 手写数字识别的CNN模型可视化结果图7…

HideSeeker论文阅读

文章目录 3.1 Overview of Our System HideSeeker3.2 Visual Information Extraction3.3 Relation Graph Learning3.4 Hidden Object Inference 4 EVALUATIONS4.7 Summary 6 DISCUSSIONS AND CONCLUSION 3.1 Overview of Our System HideSeeker 我们设计了一种名为“HideSeeke…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

保护数字世界的壁垒

随着科技的不断发展和互联网的普及&#xff0c;我们的生活日益依赖于数字化的世界。然而&#xff0c;随之而来的是网络安全威胁的不断增加。网络攻击、数据泄露和身份盗窃等问题已经成为我们所面临的现实。因此&#xff0c;网络安全变得尤为重要&#xff0c;我们需要采取措施来…

MySQL常见的几种约束

系列文章目录 后续补充 文章目录 系列文章目录前言一、主键约束二、非空约束三、唯一约束四、检查约束五、默认值约束六、字段值自动增加约束七、外键约束总结 前言 为防止不符合规范的数据存入数据库&#xff0c;在用户对数据进行插入、修改、删除等操作时&#xff0c;MySQL提…

新架构网易云音乐UI风格大变身,更像Apple Music?

继QQ的NT版本出来后&#xff0c;掀起了一番热潮&#xff0c;不少科技资讯的UP开始评测采用全新架构的QQ的性能以及内存占用情况&#xff0c; 文末中&#xff0c;苏音也提到了&#xff0c;是否在QQ新版本的发布下&#xff0c;会有越来越多的产品向Electron架构靠近&#xff1f;…

优雅的使用CLion开发STM32 2023最新版本~

1.下载资料 一共需要的资料如下 ✈代表需要魔法 没有标注可直接访问 Clion下载链接 cubemx下载链接 mingw 下载连接 ✈安装完直接解压到文件夹 并且把bin文件的路径存入path环境变量 gcc下载链接✈安装完直接解压到文件夹 并且把bin文件的路径存入path环境变量 openocd下…

详细解析黑马微信小程序视频--【思维导图知识范围】

其实总目录集链接在此&#xff1a; 如何0元学微信小程序–【浅入深出系列000】 先列前几辑&#xff0c;后面的更新在 系列000里 专辑及链接难度&#xff08;五星制&#xff09;详细解析黑马微信小程序视频–【浅入深出系列-001】难度★✫✰✰✰让别人的小程序长成自己的样子…