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

前言

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

素材

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是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 离线升级

1. 环境说明 环境 A: jenkins 版本&#xff1a;2.253使用 systemctl 管理的 jenkins 服务 环境 B&#xff1a; 可以上网的机器&#xff0c;装有 docker-compose docker 和 docker-compose 安装&#xff0c;这里都略了。 2. 安装旧版本 2.1 环境 A jenkins 目录打包文件 …

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

作者&#xff1a;俊达 proxysql作为一个程序&#xff0c;本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。 可以在多个节点上部署proxysql&#xff0c;在proxysql之前再加一层负载均衡&#xff08;如使用LVS或其他技术&#x…

Ubuntu 磁盘扩容

1.下载工具 sudo apt-get install gparted 2.调整大小

14、Python之super star:一颗星、两颗星,满天都是小星星

引言 关于Python系列的文章&#xff0c;已经通过两篇文章&#xff0c;介绍了Python中关于函数的简单使用&#xff0c;包括为什么要使用函数&#xff0c;以及函数中带默认值参数的使用注意事项。 之后&#xff0c;岔开函数的主题&#xff0c;通过几篇番外篇&#xff0c;重点谈…

什么是边缘计算技术和边缘计算平台?

随着物联网、5G技术和人工智能的不断发展&#xff0c;数据的规模和种类也在快速增加。在这种背景下&#xff0c;传统的云计算模式面临着一些问题&#xff0c;例如延迟高、网络拥塞等&#xff0c;这些问题限制了数据的处理速度和效率&#xff0c;降低了用户的使用体验。为了解决…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…

ZGC的流程图

GC标记过程 1、初始标记 扫描所有线程栈的根节点&#xff0c;然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程&#xff08;STW&#xff09;&#xff0c;但由于只扫描根对象直接引用的对象&#xff0c;所以停顿时间很短。停顿时间高度依赖根节点的数…

Redis的使用(四)常见使用场景-缓存使用技巧

1.绪论 redis本质上就是一个缓存框架&#xff0c;所以我们需要研究如何使用redis来缓存数据&#xff0c;并且如何解决缓存中的常见问题&#xff0c;缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩&#xff0c;以及如何来解决缓存一致性问题。 2.缓存的优缺点 2.1 缓存的…

JMeter进行HTTP接口测试的技术要点

参数化 用户定义的变量 用的时候 ${名字} 用户参数 在参数列表中传递 并且也是${} csv数据文件设置 false 不忽略首行 要首行 从第一行读取 true 忽略首行 从第二行开始 请求时的参数设置&#xff1a; 这里的名称是看其接口需要的请求参数的名称 这里的变量名称就是为csv里面…

SpringBatch文件读写ItemWriter,ItemReader使用详解

SpringBatch文件读写ItemWriter&#xff0c;ItemReader使用详解 1. ItemReaders 和 ItemWriters1.1. ItemReader1.2. ItemWriter1.3. ItemProcessor 2.FlatFileItemReader 和 FlatFileItemWriter2.1.平面文件2.1.1. FieldSet 2.2. FlatFileItemReader2.3. FlatFileItemWriter 3…

低空经济持续发热,无人机培训考证就业市场及前景剖析

随着科技的不断进步和社会需求的日益增长&#xff0c;低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分&#xff0c;无人机技术因其广泛的应用领域和显著的经济效益&#xff0c;受到了社会各界的广泛关注。为满足市场对无人机人才的需求&#xff0c;无人…

【动态规划1】斐波那契数列模型篇

文章目录 声明动态规划介绍1137.第N个泰波那契数题目描述分析代码 面试题 08.01. 三步问题题目描述分析代码 746.使用最小花费爬楼梯题目描述分析代码 91.解码⽅法题目描述分析代码 声明 本篇博客为动态规的基础篇&#xff0c;从零开始学习动态规划&#xff0c;如有错误&#…

MATLAB quiver矢量图 设置colorbar

给三维矢量图按照不同高度设置箭头颜色 figure clf X surfaceuz(:,1); Y surfaceuz(:,2); Z surfaceuz(:,3); hold onzcolor jet; % qquiver3(X,Y,Z,X,Y,W) for i 1:length(surfaceuz)quiver3(X(i),Y(i),Z(i),X(i),Y(i), Z(i),...Color,zcolor(floor((Z(i) - -0.1) * 2…

408数据结构-图的应用3-有向无环图、拓扑排序 自学知识点整理

前置知识&#xff1a;表达式&#xff0c;图的遍历 有向无环图描述表达式 有向无环图&#xff1a;若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;简称 D A G DAG DAG图 。 &#xff08;图片来自王道考研408数据结构2025&#xff09; 由王道考研-咸鱼学长的讲…

深圳晶彩智能JC3636W518C开箱实现电脑副屏功能

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的&#xff0c;铝合金外壳&#xff0c;价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派&#xff0c;由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

Vulnhub:DC-1

1.环境搭建 靶机下载地址 将下载的靶机导入到Oracle VM VirtualBox中&#xff0c;设置仅主机模式&#xff0c;使用和kali相同的网卡 2.渗透过程 使用nmap工具进行主机发现扫描 nmap -sn 192.168.56.0/24 发现靶机ip地址&#xff0c;使用nmap工具进行靶机端口扫描 nmap -sS…

一文说透Springboot单元测试

你好&#xff0c;我是柳岸花开。 一、单元测试说明 1 单元测试的优点与基本原则 一个好的单元测试应该具备以下FIRST 原则和AIR原则中的任何一条&#xff1a; 单元测试的FIRST 规则 Fast 快速原则&#xff0c;测试的速度要比较快&#xff0c; Independent 独立原则&#xff0c;…

Qt 多窗体、复用窗口的使用

1.继承自QWidge的窗口的呈现&#xff0c;作为tabPage呈现&#xff0c;作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现&#xff0c;作为abPage呈现&#xff0c;作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…

AI绘画入门实践|Midjourney 提示词的使用技巧

提示词长短 尽可能做到简洁明了。 提示词很短 MJ 出图的随机性更高&#xff0c;创造的内容更有想象力&#xff0c;更适合创意发散的图像生成。 a dog 提示词很长 MJ 出图会更加精准&#xff0c;但描述太过详细&#xff0c;有可能出现AI理解不到位的情况。 越到后面的提示词&…

风险评估:IIS的安全配置,IIS安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…