【unity实战】使用unity制作一个红点系统

news2024/9/22 23:38:41

前言

注意,本文是本人的学习笔记记录,这里先记录基本的代码,后面用到了再回来进行实现和整理

素材

https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050
在这里插入图片描述

框架:

RedPointSystem.cs

using System.Collections.Generic;
using UnityEngine;

namespace RedpointSystem
{
    public class RedPointNode
	{
	    public int redNum; // 红点数量
	    public string strKey; // 节点关键字
	    public Dictionary<string, RedPointNode> children; // 子节点字典
	    public delegate void RedPointChangeDelegate(int redNum); // 红点变化委托
	    public RedPointChangeDelegate OnRedPointChange; // 红点变化事件
	
	    public RedPointNode(string key)
	    {
	        strKey = key;
	        children = new Dictionary<string, RedPointNode>();
	    }
	}
	
	public class RedPointSystem
	{
	    private static RedPointSystem instance = new RedPointSystem(); // 单例实例
	    public static RedPointSystem Instance // 单例访问属性
	    {
	        get { return instance; }
	    }
	    public RedPointNode root; // 根节点
	    private RedPointSystem()
	    {
	        this.root = new RedPointNode(RedPointKey.Root); // 根节点初始化
	    }
	
	    // 添加节点
	    public RedPointNode AddNode(string key)
	    {
	        if (FindNode(key) != null)
	        {
	            return null; // 如果节点已存在,则返回空
	        }
	        string[] keys = key.Split('|'); // 按'|'分割关键字
	        RedPointNode curNode = root;
	        curNode.redNum += 1; // 根节点红点数量加一
	        curNode.OnRedPointChange?.Invoke(curNode.redNum); // 触发红点变化事件
	        foreach (string k in keys)
	        {
	            if (!curNode.children.ContainsKey(k))
	            {
	                curNode.children.Add(k, new RedPointNode(k)); // 如果子节点不包含该关键字,则添加新节点
	            }
	            curNode = curNode.children[k];
	            curNode.redNum += 1; // 子节点红点数量加一
	            curNode.OnRedPointChange?.Invoke(curNode.redNum); // 触发红点变化事件
	        }
	        return curNode;
	    }
	
	    // 查找节点
	    public RedPointNode FindNode(string key)
	    {
	        string[] keys = key.Split('|'); // 按'|'分割关键字
	        RedPointNode curNode = root;
	        foreach (string k in keys)
	        {
	            if (!curNode.children.ContainsKey(k))
	            {
	                return null; // 如果子节点不包含该关键字,则返回空
	            }
	            curNode = curNode.children[k];
	        }
	        return curNode;
	    }
	
	    // 删除节点
	    public void DeleteNode(string key)
	    {
	        if (FindNode(key) == null)
	        {
	            return; // 如果节点不存在,则返回
	        }
	        DeleteNode(key, root);
	    }
	
	    // 递归删除节点
	    private RedPointNode DeleteNode(string key, RedPointNode node)
	    {
	        string[] keys = key.Split('|'); // 按'|'分割关键字
	        if (key == "" || keys.Length == 0)
	        {
	            node.redNum = Mathf.Clamp(node.redNum - 1, 0, node.redNum); // 调整节点红点数量
	            node.OnRedPointChange?.Invoke(node.redNum); // 触发红点变化事件
	            return node;
	        }
	        string newKey = string.Join("|", keys, 1, keys.Length - 1); // 获取新的关键字
	        RedPointNode curNode = DeleteNode(newKey, node.children[keys[0]]); // 递归删除子节点
	
	        node.redNum = Mathf.Clamp(node.redNum - 1, 0, node.redNum); // 调整节点红点数量
	        node.OnRedPointChange?.Invoke(node.redNum); // 触发红点变化事件
	
	        // 移除红点数量为零的子节点
	        if (curNode.children.Count > 0)
	        {
	            foreach (RedPointNode child in curNode.children.Values)
	            {
	                if (child.redNum == 0)
	                {
	                    child.children.Remove(child.strKey);
	                }
	            }
	        }
	        return node;
	    }
	
	    // 设置回调函数
	    public void SetCallBack(string key, RedPointNode.RedPointChangeDelegate cb)
	    {
	        RedPointNode node = FindNode(key);
	        if (node == null)
	        {
	            return; // 如果节点不存在,则返回
	        }
	        node.OnRedPointChange += cb; // 设置红点变化事件的回调函数
	    }
	
	    // 获取红点数量
	    public int GetRedpointNum(string key)
	    {
	        RedPointNode node = FindNode(key);
	        if (node == null)
	        {
	            return 0; // 如果节点不存在,则返回0
	        }
	        return node.redNum; // 返回节点的红点数量
	    }
	}


   public class RedPointKey
	{
	    // 根节点关键字
	    public const string Root = "Root";
	
	    // Play节点及其子节点关键字
	    public const string Play = "Play";
	    public const string Play_LEVEL1 = "Play|Level1";  // Play节点下的Level1节点
	    public const string Play_LEVEL1_HOME = "Play|Level1|HOME";  // Level1节点下的HOME子节点
	    public const string Play_LEVEL1_SHOP = "Play|Level1|SHOP";  // Level1节点下的SHOP子节点
	    public const string Play_LEVEL2 = "Play|Level2";  // Play节点下的Level2节点
	    public const string Play_LEVEL2_HOME = "Play|Level2|HOME";  // Level2节点下的HOME子节点
	    public const string Play_LEVEL2_SHOP = "Play|Level2|SHOP";  // Level2节点下的SHOP子节点
	}

}

使用案例

RootPanel.cs

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

public class RootPanel : MonoBehaviour
{
    public GameObject Canvas; // UI画布对象
    public MenuPanel menuPanel; // 菜单面板对象
    public LevelPanel levelPanel; // 关卡面板对象

    private void Awake()
    {
        // 在Awake方法中初始化红点节点,表示需要显示红点的条件
        // 示例:如果跨过每月最后一天的0点,则显示Play|Level1|HOME节点的红点
        RedPointSystem.Instance.AddNode(RedPointKey.Play_LEVEL1_HOME);

        // 示例:如果任务完成,可以领奖,则显示Play|Level1|SHOP节点的红点
        RedPointSystem.Instance.AddNode(RedPointKey.Play_LEVEL1_SHOP);

        // 其他条件类似,根据具体逻辑添加不同的红点节点
        RedPointSystem.Instance.AddNode(RedPointKey.Play_LEVEL2_HOME);
        RedPointSystem.Instance.AddNode(RedPointKey.Play_LEVEL2_SHOP);
    }

    private void Start() {
        // 在Start方法中设置菜单面板可见,关卡面板不可见
        menuPanel.gameObject.SetActive(true);
        levelPanel.gameObject.SetActive(false);
    }
}

MenuPanel.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using RedpointSystem;

public class MenuPanel : MonoBehaviour
{
    public GameObject playBtn; // 播放按钮对象
    public GameObject continueBtn; // 继续按钮对象
    public GameObject optionsBtn; // 选项按钮对象
    public GameObject QuitBtn; // 退出按钮对象
    public LevelPanel LevelPanel; // 关卡面板对象

    void Start()
    {
        // 在Start方法中为播放按钮添加点击事件监听器,绑定到OnPlay方法
        playBtn.GetComponent<Button>().onClick.AddListener(OnPlay);
        
        // 初始化红点状态
        InitRedPointState();
    }

    void OnPlay()
    {
        // 点击播放按钮后,隐藏菜单面板,显示关卡面板
        this.gameObject.SetActive(false);
        LevelPanel.gameObject.SetActive(true);
    }

    void InitRedPointState()
    {
        // 获取Play节点的红点数量
        int redNum = RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play);
        
        // 根据红点数量更新红点状态
        RefreshRedPointState(redNum);
        
        // 设置回调函数,当Play节点的红点数量发生变化时刷新红点状态
        RedPointSystem.Instance.SetCallBack(RedPointKey.Play, RefreshRedPointState);
    }

    void RefreshRedPointState(int redNum)
    {
        // 查找播放按钮下的红点和数字对象
        Transform redPoint = playBtn.transform.Find("RedPoint");
        Transform redNumText = redPoint.transform.Find("Num");
        
        // 根据红点数量决定是否显示红点
        if (redNum <= 0)
        {
            redPoint.gameObject.SetActive(false);
        }
        else
        {
            redPoint.gameObject.SetActive(true);
            redNumText.GetComponent<Text>().text = redNum.ToString(); // 更新红点数字文本
        }
    }
}

LevelPanel.cs

using RedpointSystem;
using UnityEngine;
using UnityEngine.UI;

public class LevelPanel : MonoBehaviour
{
    // UI元素引用
    public GameObject Back1Btn; // 返回按钮
    public MenuPanel menuPanel; // 菜单面板引用
    public GameObject Level1Btn; // 关卡1按钮
    public GameObject Level1Container; // 关卡1容器
    public GameObject Level1HomeBtn; // 关卡1的主页按钮
    public GameObject Level1ShopBtn; // 关卡1的商店按钮

    public GameObject Level2Btn; // 关卡2按钮
    public GameObject Level2Container; // 关卡2容器
    public GameObject Level2HomeBtn; // 关卡2的主页按钮
    public GameObject Level2ShopBtn; // 关卡2的商店按钮

    void Start()
    {
        // 初始时隐藏关卡容器
        Level1Container.SetActive(false);
        Level2Container.SetActive(false);

        // 给返回按钮添加点击事件监听器
        Back1Btn.GetComponent<Button>().onClick.AddListener(OnBackClick);
        // 给关卡1按钮添加点击事件监听器
        Level1Btn.GetComponent<Button>().onClick.AddListener(OnLevel1Click);
        // 给关卡2按钮添加点击事件监听器
        Level2Btn.GetComponent<Button>().onClick.AddListener(OnLevel2Click);
        // 给关卡1主页按钮添加点击事件监听器
        Level1HomeBtn.GetComponent<Button>().onClick.AddListener(OnLevel1HomeBtn);
        // 给关卡1商店按钮添加点击事件监听器
        Level1ShopBtn.GetComponent<Button>().onClick.AddListener(OnLevel1ShopBtn);
        // 给关卡2主页按钮添加点击事件监听器
        Level2HomeBtn.GetComponent<Button>().onClick.AddListener(OnLevel2HomeBtn);
        // 给关卡2商店按钮添加点击事件监听器
        Level2ShopBtn.GetComponent<Button>().onClick.AddListener(OnLevel2ShopBtn);

        // 初始化红点状态
        InitRedPointState();
    }

    // 返回按钮点击事件处理
    void OnBackClick()
    {
        // 隐藏当前关卡面板,显示菜单面板
        this.gameObject.SetActive(false);
        menuPanel.gameObject.SetActive(true);
    }

    // 关卡1按钮点击事件处理
    void OnLevel1Click()
    {
        // 切换显示关卡1容器的可见性
        Level1Container.gameObject.SetActive(!Level1Container.gameObject.activeSelf);
    }

    // 关卡2按钮点击事件处理
    void OnLevel2Click()
    {
        // 切换显示关卡2容器的可见性
        Level2Container.gameObject.SetActive(!Level2Container.gameObject.activeSelf);
    }

    // 关卡1主页按钮点击事件处理
    void OnLevel1HomeBtn()
    {
        // 删除关卡1主页红点
        RedPointSystem.Instance.DeleteNode(RedPointKey.Play_LEVEL1_HOME);
    }

    // 关卡1商店按钮点击事件处理
    void OnLevel1ShopBtn()
    {
        // 删除关卡1商店红点
        RedPointSystem.Instance.DeleteNode(RedPointKey.Play_LEVEL1_SHOP);
    }

    // 关卡2主页按钮点击事件处理
    void OnLevel2HomeBtn()
    {
        // 删除关卡2主页红点
        RedPointSystem.Instance.DeleteNode(RedPointKey.Play_LEVEL2_HOME);
    }

    // 关卡2商店按钮点击事件处理
    void OnLevel2ShopBtn()
    {
        // 删除关卡2商店红点
        RedPointSystem.Instance.DeleteNode(RedPointKey.Play_LEVEL2_SHOP);
    }

	void InitRedPointState()
	{
	    // 初始化关卡1按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL1),
	        Level1Btn.transform.Find("RedPoint")
	    );
	    // 设置关卡1红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL1, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level1Btn.transform.Find("RedPoint"));
	    });
	
	    // 初始化关卡2按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL2),
	        Level2Btn.transform.Find("RedPoint")
	    );
	    // 设置关卡2红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL2, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level2Btn.transform.Find("RedPoint"));
	    });
	
	    // 初始化关卡1主页按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL1_HOME),
	        Level1HomeBtn.transform.Find("RedPoint")
	    );
	    // 设置关卡1主页红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL1_HOME, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level1HomeBtn.transform.Find("RedPoint"));
	    });
	
	    // 初始化关卡1商店按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL1_SHOP),
	        Level1ShopBtn.transform.Find("RedPoint")
	    );
	    // 设置关卡1商店红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL1_SHOP, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level1ShopBtn.transform.Find("RedPoint"));
	    });
	
	    // 初始化关卡2主页按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL2_HOME),
	        Level2HomeBtn.transform.Find("RedPoint")
	    );
	    // 设置关卡2主页红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL2_HOME, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level2HomeBtn.transform.Find("RedPoint"));
	    });
	
	    // 初始化关卡2商店按钮的红点状态
	    RefreshRedPointState(
	        RedPointSystem.Instance.GetRedpointNum(RedPointKey.Play_LEVEL2_SHOP),
	        Level2ShopBtn.transform.Find("RedPoint")
	    );
	    // 设置关卡2商店红点回调
	    RedPointSystem.Instance.SetCallBack(RedPointKey.Play_LEVEL2_SHOP, (int redNum) =>
	    {
	        RefreshRedPointState(redNum, Level2ShopBtn.transform.Find("RedPoint"));
	    });
	}
	
	void RefreshRedPointState(int redNum, Transform redPoint)
	{
	    Transform redNumText = redPoint.transform.Find("Num");
	    // 如果红点数小于等于0,隐藏红点图标
	    if (redNum <= 0)
	    {
	        redPoint.gameObject.SetActive(false);
	    }
	    else
	    {
	        // 否则显示红点图标,并更新红点数显示
	        redPoint.gameObject.SetActive(true);
	        redNumText.GetComponent<Text>().text = redNum.ToString();
	    }
	}
}

源码

整理好了会放上来

参考

https://www.bilibili.com/video/BV1jx4y1t7Uz/?spm_id_from=333.999.0.0&vd_source=2526a18398a079ddb95468a0c73f126e
https://www.bilibili.com/read/cv35873128/

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

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

相关文章

Jmeter关联

案例脚本实现&#xff1a;选择商品加入购物车 客户端发送一个登录的HTTP请求&#xff0c;服务端返回一个带着token的响应&#xff0c;后续发出一个带token信息的加入购物车的HTTP请求&#xff0c;返回响应。 关联&#xff1a;当请求直接由依赖关系的时候&#xff0c;比如一个请…

好玩的动作单机游戏:鬼泣4 游戏安装包

Devil May Cry 4让玩家沉醉于哥德式的超自然世界之中&#xff1b;体验一个新主角与熟悉的英雄发生冲突的故事。玩家操作新主角Nero&#xff0c;利用游戏独特的新系统──强大的「恶魔之手」能释放令人难以置信的攻击和製作出不间断的连续技。 凭藉PC的高效能图形显示功能&…

【PostgreSQL】PostgreSQL 教程

博主介绍&#xff1a;✌全网粉丝20W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

k8s核心操作_存储抽象_K8S中使用ConfigMap抽取配置_实现配置热更新---分布式云原生部署架构搭建032

现在有个问题,是上面我们利用pv和pvc 就是持久卷 以及 持久卷申请,实现了对存储的,pod删除以后,对其使用的存储空间也进行了删除,那么还有个问题,对于redis这种我们希望,他的配置也管理起来. 比如这个redis的配置文件. 以后其他的配置文件也是这样. 使用配置文件的存储在k8s中…

HTML2048小游戏(最新版)

比上一篇文章的2048更好一点。 控制方法&#xff1a;WASD键&#xff08;小写&#xff09;或页面上四个按钮 效果图如下&#xff1a; 源代码在图片后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset&…

idea Apipost 插件导出接口文档字段类型全部是string

idea版本&#xff1a;2023.2.1 Apipost-Helper-2.0插件版本&#xff1a; 联系官方客服后&#xff0c;更换插件版本&#xff0c;问题解决。更换后的插件版本为&#xff1a; 插件链接放在文章首部了&#xff0c;可直接下载&#xff0c;使用idea直接安装这个zip包&#xff0c;无需…

内容安全(深度行为检测技术、IPS、AV、入侵检测方法)

1、深度行为检测技术 深度行为检测技术&#xff1a;是一种基于深度学习和机器学习的技术&#xff0c;它通过分析用户在网络中的行为模式&#xff0c;识别异常或潜在威胁行为&#xff0c;从而保护网络安全和内容安全 分类&#xff1a; 深度包检测技术&#xff08;Deep Packet…

uniapp转小程序,小程序转uniapp方法

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

【数据结构】单链表 双向链表

目录 链表链表的分类单链表单链表接口的实现内部类头插法尾插法任意位置插入查找是否包含关键字key是否在单链表当中删除第一次出现关键字为key的节点删除所有值为key的节点得到单链表的长度清空链表单链表的优缺点 双向链表双向链表接口的实现内部类头插法尾插法任意位置插入查…

0602STM32定时器输出比较

STM32定时器输出比较 PWM简介 主要用来输出PWM波形&#xff0c;PWM波形又是驱动电机的必要条件&#xff0c;所以如果想用STM32做一些有电机的项目&#xff0c;比如智能车&#xff0c;机器人等。那输出比较功能就要认真掌握 1.PWM驱动LED呼吸灯 2.PWM驱动舵机 3.PWM驱动直流电机…

5.5 软件工程-系统测试

系统测试 - 意义和目的 系统测试 - 原则 系统测试 - 测试过程 系统测试 - 测试策略 系统测试 - 测试方法 真题 系统测试 - 测试用例设计 黑盒测试 白盒测试 真题 系统测试 - 调试 系统测试 - 软件度量 真题

轨道交通AR交互教学定制公司优选深圳华锐视点

在寻找上海AR开发制作公司作为合作伙伴的过程中&#xff0c;选择一家既技术深厚又具备丰富经验的AR开发企业&#xff0c;成为了众多客户与合作伙伴的共同追求。华锐视点上海AR开发制作公司作为业界的佼佼者&#xff0c;凭借其卓越的公司规模、丰富的行业案例以及顶尖的ar增强现…

华为的热机备份和流量限制

要求&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW4&#xff0c;生产区和办公区的流量走FW5 13&#xff0c;办公区上网用户限制流量不超过100M&#xff0c;…

好玩的调度技术-场景编辑器

好玩的调度技术-场景编辑器 文章目录 好玩的调度技术-场景编辑器前言一、演示一、代码总结好玩系列 前言 这两天写前端写上瘾了&#xff0c;顺手做了个好玩的东西&#xff0c;好玩系列也好久没更新&#xff0c;正好作为素材写一篇文章&#xff0c;我真的觉得蛮好玩的&#xff…

vscode+SSH连接Ubuntu

目录 问题引入 基本思路 Permission denied, please try again 修改用户名与密码 新建用户 最终成功方案 问题引入 ssh 用户名ip地址。用户名是远端服务器的用户名&#xff0c;ip地址也是远端服务器的地址。linux虚拟机的ip地址与windous主体不一样&#xff0c;所以还需要…

Python、Rust与AI的未来展望

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

基于modbus tcp通讯的雷赛导轨控制器调试软件

0.前言 之前工作遇到了雷赛电机驱动器设备&#xff0c;主要是用来控制光学导轨移动。雷赛的调试软件用的时串口通讯&#xff0c;还要他们定制的串口线&#xff0c;在现场都是485转网络的接口&#xff0c;调试起来也很不方便。所以我就照着他们的说明书&#xff0c;写了一个简易…

Git 用法

基本介绍 版本控制工具用处&#xff1a; 备份代码还原协同开发追溯 版本控制工具 1、集中式版本控制工具 版本库是集中存放在中央服务器的&#xff0c;team 里每个人 work 时从中央服务器下载代码&#xff0c;是必须联网才能工作&#xff0c;局域网或互联网。个人修改后然后…

推荐一款处理TCP数据的架构--EasyTcp4Net

EasyTcp4Net是一个基于c# Pipe,ReadonlySequence的高性能Tcp通信库,旨在提供稳定,高效,可靠的tcp通讯服务。 基础的消息通讯 重试机制 超时机制 SSL加密通信支持 KeepAlive 流量背压控制 粘包和断包处理 (支持固定头处理,固定长度处理,固定字符处理) 日志支持Pipe &…

[RK3588-Android12] 关于如何取消usb-typec的pd充电功能

问题描述 RK3588取消usb-typec的pd充电功能 解决方案&#xff1a; 在dts中fusb302节点下usb_con: connector子节点下添加如下熟悉&#xff1a; 打上如下2个补丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…