Unity游戏开发:基于Game Creator 2构建可扩展物品管理系统实战指南
1. 项目概述为什么需要一个强大的物品管理系统在Unity游戏开发中物品管理系统Inventory System是RPG、生存、模拟经营乃至动作冒险等众多类型游戏的核心骨架。它远不止是一个简单的背包UI而是连接游戏经济、角色成长、任务流程和玩家体验的枢纽。一个设计良好的物品系统能让玩家清晰地感知资源积累、装备更迭和策略选择的乐趣反之一个混乱的系统则会直接拖垮游戏节奏和玩家耐心。我最近在重构一个中型RPG项目时再次深刻体会到了这一点。项目初期为了赶进度用脚本简单堆砌了一个物品管理逻辑结果随着物品类型消耗品、装备、任务道具、材料增加到几十种代码迅速变成了“屎山”——添加一个新物品要改四五个脚本装备和属性加成逻辑耦合在一起存储和加载更是Bug频出。这迫使我停下来寻找一个更优雅、更可扩展的解决方案。这时Game Creator 2及其强大的Inventory 模块进入了我的视野。它不是一个简单的插件而是一套完整的、可视化与代码驱动相结合的物品管理框架。官方将其称为“Inventory 2”它提供了从物品数据定义、UI交互、到存储、交易、装备等全链路功能。经过一段时间的深度使用和定制开发我发现它几乎完美地解决了我之前遇到的所有痛点。本文将基于我的实战经验为你彻底拆解这套系统手把手带你从零搭建一个功能完备的物品管理系统并分享那些官方文档里不会写的“避坑指南”和高级技巧。2. 核心设计思路与模块拆解在动手之前理解 Game Creator 2 Inventory 2 的设计哲学至关重要。它采用了数据与逻辑分离和高度模块化的设计这让系统既强大又灵活。2.1 核心架构三驾马车驱动整个系统围绕三个核心概念构建我称之为“三驾马车”物品Item这是系统的基石。它不是一个GameObject而是一个ScriptableObject资产。这意味着你可以在项目中像创建材质球一样创建无数种物品的定义如“铁剑”、“治疗药水”它们独立于任何场景存在。每个Item资产定义了物品的静态属性名称、图标、描述、类型、价值、堆叠上限等。库存Inventory这是物品的容器和逻辑执行者。每个拥有背包的角色玩家、商人、箱子都有一个Inventory组件。它负责管理一个物品列表处理物品的添加、移除、排序、堆叠、使用等所有操作逻辑。Inventory是运行时组件挂在具体的GameObject上。装备Equipment这是Inventory的延伸和特化。它本质上也是一个容器但专门用于管理那些可以“穿戴”并影响角色属性的物品如武器、盔甲。Equipment系统与Game Creator的Stats和Attributes模块无缝集成装备物品可以自动修改角色的攻击力、防御力等属性。这种设计的精妙之处在于物品数据Item是唯一的、可共享的。一把“铁剑”的Item资产可以被玩家背包、商店货架、地城宝箱等多个不同的Inventory引用但每个Inventory中这把剑的实例如耐久度、附魔属性可以是独立的。这极大地节省了资源并简化了数据管理。2.2 可视化与脚本的平衡Game Creator 2 的一大优势是其Actions系统。你可以通过可视化的流程图Action Lists来驱动复杂的游戏逻辑比如“按下E键 - 检查玩家是否面对宝箱 - 打开宝箱UI - 将物品从宝箱库存转移到玩家库存”。对于策划或技术美术来说这大大降低了实现游戏功能的门槛。但对于程序开发者而言完全依赖可视化可能会在复杂逻辑时显得笨重。因此Inventory 2 提供了完整的C# API。所有通过Actions能完成的操作都可以通过代码实现并且更灵活、更高效。我的经验是原型和简单逻辑用Actions快速搭建核心循环和复杂业务逻辑用C#脚本实现。本文将同时涵盖这两种方式。3. 从零开始构建你的第一个物品与库存理论说得再多不如动手实践。让我们一步步创建一个最简单的物品系统。3.1 创建你的第一件物品首先在Project窗口中右键Create - Game Creator - Documents - Inventory - Item。这会创建一个新的Item资产我将其命名为Item_HealthPotion。选中这个资产在Inspector面板中你会看到丰富的配置项Basic设置名称Health Potion、描述、图标Sprite。这里的名称是显示给玩家的。GeneralItem Type选择Consumable消耗品。其他选项包括Equipment装备、Weapon武器是Equipment的子类、Key钥匙等。类型决定了物品的默认行为。Max Stack设置为5表示治疗药水最多可以5个堆叠在一格。Price购买/出售价格。Properties这里可以添加自定义属性。例如你可以添加一个Heal Amount属性类型为Number并设置为50代表这瓶药水可以回复50点生命值。这是实现物品差异化功能的关键。注意Item ID是系统自动生成的唯一标识符在代码中通过它来引用物品。不要手动修改它除非你很清楚自己在做什么。3.2 为玩家添加库存组件接下来我们需要让玩家能够携带物品。找到你的玩家角色GameObject通常挂载了Game Creator的Character组件。点击Add Component搜索并添加Inventory组件。在Inventory组件中你会看到Content列表这里将实时显示玩家拥有的物品。关键参数Bag Size这决定了玩家背包的格子数量例如设置为20。现在我们还需要一种方式来与库存交互——通常是打开一个背包UI。Game Creator 2 提供了一个现成的、可高度定制的Inventory UI。在Assets/GameCreator/Inventory/Prefabs/UI路径下找到UIInventory.prefab将其拖入你的场景Canvas中或者通过代码动态实例化。3.3 实现物品的添加与获取两种方式方式一使用 Actions可视化创建一个空GameObject命名为ActionTester为其添加Actions组件。在Actions编辑器中你可以拖拽出这样的逻辑Trigger - On Key Down(Key: E)Inventory - Add Item to Inventory(Target: Player, Item:Item_HealthPotion, Amount: 2)UI - Show Message(Text: “获得了2瓶治疗药水”)运行游戏按E键你会发现玩家的库存中多了2瓶治疗药水。这种方式无需编写一行代码。方式二使用 C# API编程创建一个脚本ItemManager.cs并挂载到任意物体上。using GameCreator.Runtime.Inventory; using UnityEngine; public class ItemManager : MonoBehaviour { // 在Inspector中拖入创建好的Item资产 [SerializeField] private Item m_HealthPotionItem; void Update() { if (Input.GetKeyDown(KeyCode.E)) { // 获取玩家的Inventory组件 Inventory playerInventory GameObject.FindGameObjectWithTag(Player).GetComponentInventory(); if (playerInventory ! null m_HealthPotionItem ! null) { // 添加物品 bool added playerInventory.Add(m_HealthPotionItem, 2); if (added) { Debug.Log(成功添加2瓶治疗药水。); } else { Debug.Log(背包已满添加失败。); } } } } }API调用playerInventory.Add(item, amount)会返回一个布尔值指示是否添加成功例如背包满了就会失败。这种方式让你能更精细地控制逻辑比如在添加前检查条件或者处理添加失败的情况。4. 核心功能深度解析与实现有了基础我们来深入物品系统的几个核心功能使用、装备、存储与交易。4.1 物品的使用消耗品与自定义行为对于我们在3.1中创建的Consumable类型的治疗药水Game Creator 默认已经为其绑定了“使用”行为。在库存UI中右键点击该物品或将其拖到快捷使用栏后按对应数字键即可使用。但它的效果是什么呢默认的“使用”只是从背包中移除一个。要让它真正恢复生命值我们需要为其添加Usage。选中Item_HealthPotion资产在Inspector中找到Usage部分。点击Add Usage。这里就是定义物品使用后触发逻辑的地方。你可以选择Consume默认的消耗行为但为了治疗我们需要创建一个自定义的Action List。在Project中右键Create - Game Creator - Documents - Actions新建一个Action List命名为Action_UseHealthPotion。打开这个Action List编辑逻辑Character - Change Attribute(Target: Player, Attribute:Health, Operation: Add Value, Value:50)。这里的50应该与你在Item的Properties中定义的Heal Amount关联起来会更好。Inventory - Consume Item(Target: Player, Item:Item_HealthPotion, Amount: 1)。这一步执行实际的消耗。回到Item_HealthPotion的Usage配置将On Use设置为这个新创建的Action_UseHealthPotion。现在使用药水时它会先执行你的Action List恢复生命值再消耗物品。你可以用同样的方法为任何物品创建复杂的使用逻辑如投掷炸弹、阅读卷轴学习技能等。4.2 装备系统从数据到视觉表现装备系统是Inventory 2的另一个亮点。首先创建一个装备物品比如Item_IronSword将其Item Type设置为Weapon。装备槽与属性绑定在玩家的GameObject上添加Equipment组件。Equipment组件有一个Slots列表。你需要在这里定义装备槽位例如Head,Body,Hand Right(主手),Hand Left(副手)。每个槽位可以指定允许装备的Item Type例如Hand Right槽只允许Weapon类型。关键一步属性修改。在Item_IronSword资产的Properties中添加一个属性但这次类型选择Attribute。将其指向游戏中的“攻击力Attack”属性并设置修改值如10。当这把剑被装备到Hand Right槽时玩家的Attack属性会自动增加10点。装备的视觉实例化 装备一把剑通常希望它在玩家手上显示3D模型。在Item_IronSword资产的Prefab字段中拖入这把剑的3D模型Prefab。在玩家的骨骼上比如右手添加一个Runtime Item组件。这个组件负责在运行时实例化和管理装备的模型。在Equipment组件中为Hand Right槽位设置其Runtime Item为刚刚添加的组件。当玩家在库存UI中右键点击Item_IronSword并选择“装备”时系统会自动将Prefab实例化到Hand Right槽位对应的Runtime Item位置并作为玩家骨骼的子物体跟随动画移动。4.3 存储系统宝箱、仓库与数据持久化独立的存储容器如宝箱、仓库是扩展游戏玩法的关键。实现一个宝箱非常简单在场景中创建一个宝箱模型为其添加Inventory组件设置Bag Size为10宝箱容量。添加一个Trigger组件Game Creator自带设置其交互事件。在交互事件中使用Action或代码打开一个Merchant UI。没错Game Creator中商店UI (UIMerchant.prefab) 经过简单配置可以完美充当“容器UI”。你需要做的就是将“顾客”设置为玩家库存将“商人”设置为宝箱库存。通过这个UI玩家就可以在两个库存之间拖拽转移物品。数据持久化保存/加载 这是很多开发者头疼的问题。Game Creator 2 的Savable组件提供了优雅的解决方案。为玩家的GameObject添加Savable组件。在Savable组件的Savable Data列表中确保包含了Inventory和Equipment如果之前没自动添加就手动添加进去。当调用Game Creator的保存系统时玩家背包和装备栏的所有数据包括物品ID、数量、属性、耐久度等都会被自动序列化保存。加载时也会自动恢复。实操心得对于宝箱这类场景中的容器你通常也希望保存其状态。为此给宝箱的GameObject也添加Savable和Inventory组件并将其Inventory也标记为可保存。这样每个宝箱的内容都是独立保存的玩家取走物品后宝箱就空了除非游戏重置。4.4 合成、拆解与商店交易这些高级功能都建立在基础的库存系统之上。合成创建一个Crafting系统。你需要定义“配方”Recipe它也是一个ScriptableObject。配方中指定需要的材料Input Items和产出的物品Output Items。然后你可以创建一个合成台UI让玩家将材料从背包拖入合成槽点击合成按钮后检查材料是否充足然后从玩家库存移除材料并添加产物。拆解逻辑与合成相反。为可拆解的物品添加一个“拆解”Usage触发一个Action List从库存移除该物品并添加拆解后的材料。商店交易使用UIMerchant.prefab。你需要设置两个Inventory一个是商人的库存商品列表一个是玩家的库存。在Merchant组件中可以设置价格乘数比如卖价是原价的0.5倍。交易逻辑检查金钱、转移物品由系统自动处理。5. 高级技巧、性能优化与避坑指南经过几个项目的打磨我积累了一些在官方文档中难以找到的实战经验。5.1 性能优化当物品数量庞大时避免每帧查询库存不要在Update()中频繁调用Inventory.FindItem()或遍历所有物品。正确的做法是在物品添加/移除时触发事件Inventory.EventAdd/EventRemove并更新一个缓存变量或UI状态。UI池化库存UI的每个物品格子Cell是一个UI元素。当背包有200格时瞬间创建200个Cell会很卡。修改UIInventory的源码或继承它实现Cell的池化Object Pooling只实例化视野内的格子滚动时复用。简化物品属性不是所有物品都需要复杂的自定义Properties。对于大量同质化物品如“铜币”、“木材”使用基础的Item资产即可避免为每个物品实例存储大量冗余数据。5.2 常见问题与排查技巧实录问题1物品添加了但在UI中不显示。排查首先检查playerInventory.Content在运行时是否真的包含了该物品。可以在代码中添加Debug.Log(playerInventory.Content.Count)。可能原因UI Inventory没有正确绑定到玩家的Inventory组件。确保UIInventory组件中的Target Inventory指向了玩家对象。可能原因物品的Item Type被UI过滤了。检查UIInventory的Filter设置。问题2装备物品后属性没有变化。排查检查装备的Item资产其Properties中定义的Attribute修改是否正确链接到了角色的属性ID如“Attack”。检查角色的Equipment组件上装备槽的Runtime Item是否已正确分配并且槽位允许的Item Type包含了你的装备类型。终极手段打开Game Creator的调试控制台默认快捷键~输入gc.inventory.debug true可以查看详细的物品和装备日志。问题3保存游戏后加载时物品丢失或错乱。排查确保所有需要保存的GameObject玩家、宝箱都有Savable组件并且其Savable Data列表包含了Inventory。检查Item资产本身ScriptableObject是项目资源不需要保存。但每个物品实例在库存中的运行时数据如唯一ID、耐久度、自定义属性值会被保存。确保这些运行时数据没有引用场景中特定的、未保存的GameObject。重要原则用于保存的Item ID必须稳定。不要在开发过程中随意删除Item资产否则加载时因ID找不到对应资产会导致物品丢失。如果必须删除需要编写数据迁移脚本。问题4自定义物品使用逻辑Action List不生效。排查双击物品使用后的控制台报错信息。通常是因为Action List中的某个Action的目标Target设置不正确。在Action List编辑器中确保Target选项是明确的如Player而不是Invoker且在复杂调用链中产生了歧义。建议在复杂的自定义Usage中尽量先使用简单的Debug LogAction来测试逻辑链是否被触发。5.3 扩展与自定义超越默认功能Game Creator 2 Inventory 2 的强大之处在于其可扩展性。当你需要官方未提供的功能时可以继承其核心类。例如我想实现一个“灵魂绑定”物品拾取后无法交易、丢弃。创建一个新的Item属性IsSoulbound(Bool类型)。创建一个继承自Inventory的自定义类MyInventory。重写CanRemove或CanMove方法在方法中检查要操作物品的IsSoulbound属性。如果为true且操作是“移动到非玩家库存”即交易或丢弃则返回false阻止操作。将玩家角色上的Inventory组件替换为你的MyInventory组件。通过这种方式你可以无限扩展系统的功能以适应最独特的游戏设计需求。物品管理系统的构建是游戏开发中一项既基础又复杂的工作。Game Creator 2 Inventory 2 提供了一套工业级的解决方案将你从重复造轮子的泥潭中拉出来让你能更专注于游戏玩法本身的创新。从明确“三驾马车”的数据结构开始逐步实现添加、使用、装备、存储等核心功能再通过事件、API和继承机制去应对复杂需求这条路径在实践中被证明是高效且稳健的。记住好的系统是设计出来的更是调试和优化出来的。多利用调试工具勤写测试用例你的物品管理系统必将成为游戏坚实而流畅的基石。

相关新闻

单片机毕业设计-基于 51/STM32 单片机的自动手动双模式智能台灯控制系统设计 基于 51/STM32 单片机的人体感应光照采集照明控制器设计(011902)

单片机毕业设计-基于 51/STM32 单片机的自动手动双模式智能台灯控制系统设计 基于 51/STM32 单片机的人体感应光照采集照明控制器设计(011902)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/5 14:55:20 阅读更多 →
【单片机毕业设计】基于 51/STM32 单片机的环境光强自适应照明装置开发 基于 51/STM32 单片机的人体红外感应智能照明控制系统研究(011902)

【单片机毕业设计】基于 51/STM32 单片机的环境光强自适应照明装置开发 基于 51/STM32 单片机的人体红外感应智能照明控制系统研究(011902)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/7 13:40:48 阅读更多 →
单片机毕设选题推荐:基于 51/STM32 单片机的参数可调式智能台灯软硬件设计 基于 51/STM32 单片机的双模控制环境感知台灯设计与开发(011902)

单片机毕设选题推荐:基于 51/STM32 单片机的参数可调式智能台灯软硬件设计 基于 51/STM32 单片机的双模控制环境感知台灯设计与开发(011902)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/14 5:01:51 阅读更多 →

最新新闻

OpenClaw高性能自动化框架使用指南与优化技巧

OpenClaw高性能自动化框架使用指南与优化技巧

1. OpenClaw 工具的本质解析OpenClaw 本质上是一个高性能的自动化操作框架,其核心设计理念是通过模块化组件实现复杂任务的流程化处理。这个工具最初是为工业级数据采集与处理场景设计的,但很多用户误将其当作简单的网页抓取工具使用,导致无法…

2026/10/14 12:42:48 阅读更多 →
SpringBoot企业门户网站开发实践与优化

SpringBoot企业门户网站开发实践与优化

1. 项目背景与核心需求 子阳集团作为一家综合性企业,需要构建现代化企业门户网站来展示企业形象、业务板块和最新动态。这个基于SpringBoot的网站项目主要解决三个核心问题: 统一信息发布平台:整合集团各子公司动态 客户服务窗口&#xff1…

2026/10/14 12:42:48 阅读更多 →
神经网络入门:从神经元模型到反向传播的完整学习路线

神经网络入门:从神经元模型到反向传播的完整学习路线

学神经网络这件事,我前后折腾了小半年。一开始跟着一门经典的机器学习公开课走,课听得懂、作业能跑,但总感觉缺了一块——代码能跑通,可一旦把隐藏层从一层改成三层,或者换个损失函数,我就说不清楚到底发生…

2026/10/14 12:42:48 阅读更多 →
SpringBoot企业官网开发实践与架构设计

SpringBoot企业官网开发实践与架构设计

1. 项目背景与核心需求 子阳集团作为一家综合性企业集团,需要一个能够展示企业形象、发布动态信息并提供基础服务的官方网站。这个基于SpringBoot的Web项目正是为此而开发,主要解决以下三个核心需求: 企业形象展示 :需要完整呈现…

2026/10/14 12:42:48 阅读更多 →
产品试制通知单怎么填?管好试制流程、版本与追溯

产品试制通知单怎么填?管好试制流程、版本与追溯

简介:《产品试制通知单》是一份面向制造型企业研发、生产、质量、供应链等岗位的常用管理表格,主要用于新产品试制阶段明确型号、数量、时间与部门分工,帮助项目团队提前统筹资源、减少沟通遗漏。资源为单个doc格式文件,压缩包仅4…

2026/10/14 12:42:47 阅读更多 →
命令行待办事项工具开发实战:Python实现高效任务管理

命令行待办事项工具开发实战:Python实现高效任务管理

1. 为什么选择命令行待办事项应用 在图形界面应用泛滥的今天,命令行工具依然保持着独特的魅力。作为一个常年与终端打交道的开发者,我发现命令行待办事项应用有几个不可替代的优势: 首先,它的启动速度极快。不需要等待臃肿的GUI加…

2026/10/14 12:41:47 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →