Unity 3D项目转2D实战:两种核心路径与混合架构详解
1. 项目概述为什么3D到2D的转换是个技术活在Unity开发中我们经常会遇到一个看似简单、实则暗藏玄机的需求将一个3D项目或场景转换成2D风格或完全适配2D渲染管线。这可不是简单地在编辑器里把“Default Behavior Mode”从3D改成2D就完事了。我见过太多项目初期为了快速验证玩法用3D搭了个原型美术资源也是3D的等到想做成2D像素风或手绘风时直接切换模式结果场景一片漆黑、光照诡异、摄像机对不上焦Sprite渲染不出来性能还莫名其妙地掉。这背后是两套截然不同的渲染体系、资源管线和工作流在打架。从3D到2D的转换本质上是在项目中期进行的一次“架构重构”。它不仅仅是视觉风格的改变更涉及到渲染管线、资源管理、物理系统、UI适配乃至整个项目工作流的调整。处理得好项目能平滑过渡焕发新生处理不好就会留下一堆技术债务和诡异的显示Bug。今天我就结合自己趟过的坑系统拆解从3D转向2D的两种核心路径“编辑器模式切换流”和“混合渲染架构流”并告诉你在不同实战场景下该如何做出最经济、最稳妥的选择。2. 核心路径深度解析两种思维的碰撞2.1 路径一编辑器模式切换流官方推荐但非万能这是Unity手册里明确写出的方法也是大多数人第一时间会尝试的。通过Edit Project Settings Editor将Default Behavior Mode从3D改为2D。这个操作会触发一系列编辑器层面的全局预设变更。它的核心逻辑是“重置默认值” 当你新建一个2D项目时Unity会帮你配置好一整套适合2D开发的默认设置。这个切换操作就是试图将你现有的3D项目强行“对齐”到那套2D默认配置上。我们来看看它具体动了哪些关键部分以及为什么这常常会出问题渲染与相机摄像机主摄像机的Projection从Perspective透视变为Orthographic正交。这是2D视觉的基石消除了近大远小的透视感。但问题来了你原有的3D场景是按透视相机布局的切换后物体的视觉比例和层次关系会完全错乱。一个放在00-10的物体在透视相机里可能正常显示在正交相机里可能就跑到屏幕外了。Scene视图从3D自由视角切换到2D的XY平面锁定视角。方便了2D编辑但如果你想微调一个残留的3D模型的Z轴位置会非常别扭。光照系统这是最大的雷区。切换后Lighting窗口的设置会被强制更改Skybox Material被禁用场景背景直接变纯色通常是深灰色。Ambient Source从Skybox变为Color环境光变成单一颜色。Realtime Global Illumination和Baked Global Illumination被关闭。Auto-Building关闭。后果如果你原来的3D场景依赖了天空盒、实时光照或烘焙光照切换后所有光照信息瞬间消失场景会变得一片死黑或极度平淡所有依赖光照的Shader如Standard Shader都可能显示异常。资源导入与处理新导入的图片会被默认设置为Sprite (2D and UI)纹理类型并启用Sprite Packer。但对于项目中已有的3D纹理如Albedo贴图、法线贴图这个设置不会自动追溯应用。你需要手动批量修改否则它们可能无法被Sprite Renderer正确使用。Sprite Packer的启用是为了优化2D精灵的绘制调用但如果你的项目里还有3D模型用的纹理可能会引起不必要的打包冲突或内存浪费。注意这个“模式切换”是一个单向的、针对未来操作的默认设置。它不会智能地帮你转换已有的场景内容。它只保证“从现在开始新东西按2D的来”而“旧有的3D烂摊子”需要你自己收拾。适用场景项目初期刚建好3D空场景还没放入什么复杂的3D资产和光照。彻底转型你确定要做一个纯2D游戏且愿意花时间手动调整所有现有场景、重做光照、替换所有渲染组件MeshRenderer - SpriteRenderer。学习测试快速感受2D与3D项目设置的差异。实操心得 如果你决定走这条路切换模式后第一件事不是看Game视图而是打开Lighting窗口和每个关键场景。你必须像对待一个新项目一样重新配置场景光照对于纯2D通常只需一个简单的环境光颜色并逐一检查每个游戏对象特别是摄像机和渲染器组件。2.2 路径二混合渲染架构流渐进式重构推荐这是更稳健、更专业也是我在实际生产环境中更常用的方法。其核心思想是不改变项目的3D根模式而是在3D项目内部构建一个独立的2D渲染子系统。让2D内容在一个受控的环境下运行。它的核心优势是“隔离与可控”项目设置保持3DDefault Behavior Mode保持为3D。这意味着天空盒、光照系统、后期处理等3D特性可以完全保留。这对于需要2D角色在3D背景上活动或者需要3D灯光特效的2D游戏如《纸片马里奥》风格至关重要。创建专用的2D渲染相机我们不修改原有的主摄像机可能仍用于3D背景或UI。而是新建一个摄像机专门用于渲染2D内容。将Projection设置为Orthographic。调整Depth值确保它渲染在3D背景之上、UI之下例如背景相机Depth-12D游戏相机Depth0UI相机Depth1。使用Camera Culling Mask来精细控制这个相机只渲染属于2D层的对象如新建一个“2D” Layer。分层管理游戏对象将所有2D对象SpriteRenderer放入专门的Layer如“2D”。将2D相机的Culling Mask设置为只渲染这个Layer。这样3D背景和2D角色就实现了完美的视觉分离互不干扰。处理光照2D Sprite通常使用Unlit类别的Shader如Sprites/Default它们不受场景实时光照影响只受自身颜色和材质影响。这就完美避开了3D光照系统的干扰。如果你需要2D物体有光影效果可以通过脚本模拟如生成投影Sprite或使用专门的2D光照系统如Unity 2D Lighting。物理系统3D项目默认使用3D物理引擎。对于2D游戏你需要明确使用Rigidbody 2D和Collider 2D系列组件。它们与3D物理 (Rigidbody,Collider) 是两套独立系统互不冲突可以共存于同一项目。适用场景2.5D游戏背景是3D的角色和交互是2D的。UI与特效在3D游戏中加入复杂的2D精灵动画UI或特效。渐进式改造大型3D项目需要逐步加入2D小游戏或特定2D界面。技术验证不确定最终方向需要在保留3D功能的前提下尝试2D玩法。实操心得 这条路径的关键在于“规划”。在动手前就要规划好相机的渲染顺序、Layer的划分、以及2D资源的管理目录。我通常会建立这样的结构Assets/ ├── _3D/ # 所有3D相关资源 ├── _2D/ # 所有2D相关资源Sprites, 2D Prefabs ├── _Scenes/ │ ├── 3D_Background.unity │ └── 2D_Gameplay.unity (可叠加加载) └── _Scripts/ ├── Runtime/ │ ├── 3D/ │ └── 2D/ # 专门的2D管理器和组件这种结构清晰也便于团队协作。3. 实战选择指南如何根据你的项目下决策了解了两种路径我们该如何选择这绝不是拍脑袋而是基于项目状态、团队能力和最终目标的综合决策。你可以通过下面这个决策流程图来梳理思路flowchart TD A[开始3D项目转2D需求] -- B{核心需求是br纯2D还是2.5D/混合}; B -- 纯2D -- C{项目处于哪个阶段}; B -- 2.5D/混合 -- D[**毫不犹豫选择路径二br混合渲染架构**]; C -- 早期/原型阶段 -- E[**推荐路径一br编辑器模式切换**]; C -- 中期/已有大量内容 -- F{是否依赖复杂br3D光照与后期}; F -- 是 -- G[**强烈建议选择路径二**br避免光照灾难]; F -- 否 -- H[**可考虑路径一br但需做好重调准备**]; D -- I[成功实施]; E -- I; G -- I; H -- I;除了流程图中的核心判断在做最终决定前请务必用下面这个清单进行快速审计审计项如果回答“是”较多倾向路径一如果回答“是”较多倾向路径二项目阶段处于原型验证期场景简单资产很少。项目已开发一段时间有多个复杂场景和大量资产。美术资产3D资产可以废弃或容易重制为2D精灵。3D资产如背景、道具需要保留或作为2.5D元素。光照依赖场景未使用或仅使用最简单的平行光。场景使用了天空盒、光照探头、烘焙光照、体积雾等高级光照。特效与后期未使用或很少使用粒子系统、后处理堆栈。大量依赖粒子系统3D、后处理效果Bloom SSAO。团队技术栈团队更熟悉纯2D工作流愿意重新学习。团队熟悉3D希望渐进式过渡降低风险。未来扩展性确定项目最终就是纯2D无3D回归可能。可能未来需要3D与2D混合表现或方向可能再次调整。我的经验之谈 对于绝大多数已有一定规模的3D项目我都强烈推荐路径二混合架构。原因很现实成本与风险。路径一看似一步到位但引发的“沉默成本”极高——那些隐藏的光照设置、材质球属性、相机参数问题会在开发中后期以各种诡异Bug的形式爆发调试成本远超重建。而路径二虽然前期需要一些设计工作如相机分层但它提供了最大的灵活性允许你并行开发和测试2D内容同时保持3D部分的完整可用是一种风险可控的重构方案。4. 混合渲染架构流核心环节实现详解假设我们选择了更稳健的路径二下面就来一步步搭建这个混合渲染架构。我会以在一个已有的第三人称3D冒险游戏项目中加入2D横版过关小游戏为例。4.1 第一步场景与相机分层设置我们不在原3D场景上直接修改而是采用叠加加载Additive Load或单独场景的方式。创建专用2D场景新建一个场景2D_Minigame.unity。在这个场景里我们将只放置2D游戏所需的物件。设置2D专用相机删除新建场景自带的摄像机如果有。创建一个新的Camera重命名为Camera_2D。关键参数设置// 在Inspector中设置 Projection: Orthographic Size: 5 // 根据你的精灵像素大小和PPU调整这决定了可视范围 Depth: 0 // 假设3D背景相机Depth为-1UI相机Depth为1 Culling Mask: 取消选择所有然后只勾选我们即将创建的“2D”层。创建与管理Layer打开Edit Project Settings Tags and Layers。在Layers列表的空白处如User Layer 8添加一个新层命名为“2D”。将场景中所有2D对象精灵、2D碰撞体等的Layer都设置为“2D”。将Camera_2D的Culling Mask设置为仅渲染“2D”层。4.2 第二步2D资源导入与Sprite渲染器配置这是将3D资产思维转换为2D资产思维的关键。纹理导入设置对于你的2D精灵图如角色精灵表必须正确设置。将图片拖入Assets/_2D/Sprites文件夹。在Inspector中将Texture Type设置为Sprite (2D and UI)。如果是一张包含多个动作帧的精灵表将Sprite Mode设置为Multiple然后点击Sprite Editor进行切片。重要Pixels Per Unit (PPU)这个值至关重要。它定义了游戏世界中一个单位对应图片的像素数。例如PPU100意味着一个100x100像素的精灵在游戏中宽高各占1个单位。确保你项目中所有2D精灵的PPU一致否则会出现尺寸错乱。通常根据你的美术资源分辨率来定100或128是常见值。创建2D预制体创建一个空游戏对象命名为Player_2D将其Layer设为“2D”。添加Sprite Renderer组件将切好的精灵拖入Sprite属性。添加Rigidbody 2D注意是2D设置Body Type为Dynamic。添加Box Collider 2D或其他2D碰撞体调整大小匹配精灵。将这个对象拖入Assets/_2D/Prefabs文件夹制成预制体。材质与ShaderSprite Renderer默认使用Sprites/DefaultShader这是一个无光照Shader完美契合我们的需求。除非有特殊效果如溶解、外发光否则不要轻易更换。4.3 第三步2D物理与3D物理的共存这是混合架构中最容易混淆的点。Unity的2D物理和3D物理是完全独立的系统。组件不通用Rigidbody不会与Collider 2D相互作用反之亦然。坐标系2D物理在XY平面内运算Z轴被忽略。你的2D游戏对象应保持在同一个Z坐标例如0。碰撞矩阵需要单独设置2D物理的碰撞层。打开Edit Project Settings Physics 2D。在Layer Collision Matrix中你可以精细控制哪些2D层之间可以发生碰撞。例如你可以设置“2D”层只与“2D_Enemy”层碰撞而不与“2D_Item”层碰撞。一个常见坑点如果你不小心给一个2D对象添加了Rigidbody3D和Collider 2D那么这个碰撞体永远不会被物理引擎检测到因为它需要一个Rigidbody 2D来驱动。务必检查组件后缀。4.4 第四步光照与渲染管线的处理在混合架构中我们巧妙地避开了光照冲突。2D对象无视3D光照由于使用Sprites/Default等无光照Shader场景中的3D平行光、点光源都不会影响2D精灵的颜色。精灵的颜色完全由Sprite Renderer组件的Color属性控制。如果需要2D光影Unity提供了独立的2D Lighting系统。你可以在Window Rendering 2D Lighting中打开它。你可以添加Light 2D组件如Freeform Light 2D,Sprite Light 2D来专门影响2D层级的精灵。这套系统与3D光照并行不悖互不干扰。渲染管线适配内置渲染管线上述方法直接可用。URP通用渲染管线需要确保你的2D精灵使用的Shader是URP兼容的。URP提供了Universal Render Pipeline/2D/Sprite-Lit-Default等Shader可以与URP的2D Renderer配合实现更复杂的2D光照效果。你需要在URP Asset中配置2D Renderer并将其分配给2D相机的Renderer列表。核心原则在URP/HDRP下务必通过创建专用的Render Feature或使用Render Objects块来将2D渲染与3D渲染区分开避免后期处理效果错误地应用到2D精灵上。5. 常见问题与排查技巧实录在实际转换过程中你一定会遇到各种奇怪的问题。下面是我总结的“血泪”排查清单问题现象可能原因排查步骤与解决方案2D精灵在Game视图中不显示1. 相机Culling Mask未包含精灵所在Layer。2. 精灵的Z轴位置在相机裁剪平面之外。3. 纹理导入类型不是Sprite。1. 检查Camera_2D的Culling Mask。2. 确保精灵Z轴为0检查相机Clipping Planes的Near/Far值是否包含0。3. 在Project窗口选中图片查看Inspector中Texture Type。2D精灵显示为粉色Missing MaterialSprite Renderer使用的Material或Shader丢失或不兼容当前渲染管线。1. 检查Sprite Renderer的Material属性是否为None。2. 如果是URP/HDRP确保使用URP提供的2D Sprite Shader如Sprites-Unlit。2D碰撞体不起作用1. 游戏对象缺少Rigidbody 2D。2. 碰撞体Is Trigger被勾选但代码未处理触发事件。3. 2D物理层碰撞矩阵中对应层被取消勾选。1. 添加Rigidbody 2D组件。2. 根据需求选择物理碰撞或触发并编写相应的OnCollisionEnter2D或OnTriggerEnter2D脚本。3. 检查Physics 2D设置中的层碰撞矩阵。2D对象看起来模糊1. 纹理压缩格式不合适。2. 精灵的Pixels Per Unit设置过小导致精灵被过度拉伸放大。1. 对于像素风游戏将纹理的Filter Mode设为Point (no filter)Compression设为None。2. 调高精灵的PPU值或减小正交相机的Size值。3D背景与2D角色渲染顺序错乱相机Depth值设置错误或2D/3D对象在同一个Layer被同一个相机渲染。1. 确保3D背景相机Depth最低如-12D游戏相机Depth中等0UI相机Depth最高1。2. 使用相机的Culling Mask严格分离2D和3D对象到不同层。切换场景后光照变黑使用了路径一切换编辑器模式导致原3D场景的光照设置被覆盖或禁用。1. 检查Lighting窗口确认Environment中的Skybox Material是否被清空Ambient Source是否被改为Color。2. 重新烘焙光照如果之前是烘焙的或重新设置场景光源。这是路径一的典型后遗症回退困难。独家避坑技巧“锚点”对象管理在混合场景中创建一个空的“2D World”游戏对象作为所有2D内容的父节点。这样如果你需要整体移动、旋转或缩放2D世界例如实现关卡平移只需要操作这个父节点即可非常方便。Z轴战斗即使是在正交投影下Sprite Renderer的渲染顺序也由Sorting Layer和Order in Layer控制但物体的Z轴位置依然会影响它与某些后期处理效果的交互。一个最佳实践是将所有纯2D游戏对象的Z轴统一设置为0然后完全依靠Sorting Layer来管理前后遮挡关系。性能监控在混合项目中要同时关注2D和3D的Draw Call。使用Frame Debugger工具分别观察仅渲染2D层和仅渲染3D层时的批次情况。2D精灵的合批Batching依赖于Sprite Atlas精灵图集务必合理打包。

相关新闻

终极3DS游戏格式转换指南:5分钟掌握3dsconv从入门到精通

终极3DS游戏格式转换指南:5分钟掌握3dsconv从入门到精通

终极3DS游戏格式转换指南:5分钟掌握3dsconv从入门到精通 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 还在为…

2026/10/6 5:55:30 阅读更多 →
抖音批量下载工具终极指南:去水印、多模式、自动化完整解决方案

抖音批量下载工具终极指南:去水印、多模式、自动化完整解决方案

抖音批量下载工具终极指南:去水印、多模式、自动化完整解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…

2026/10/7 15:05:43 阅读更多 →
ServerAgent与nmon:分布式系统性能监控黄金组合

ServerAgent与nmon:分布式系统性能监控黄金组合

1. 性能监控工具选型与核心价值 在分布式系统和高并发场景成为主流的今天,性能监控早已从"可有可无"变成了"生死攸关"的基础设施。我经历过太多凌晨三点的性能救火现场,深刻体会到:没有可靠的监控数据,性能优…

2026/10/12 5:50:07 阅读更多 →

最新新闻

Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

每年毕业设计的选题库里,“旅游网站”几乎是大热门,但说实话,十个里面至少有八个做成了标准的增删改查演示——用户注册登录、景点列表、后台维护,顶多再加一个关键字搜索。答辩的时候老师问一句“技术亮点在哪里”,很…

2026/10/13 23:01:16 阅读更多 →
PyBullet物理仿真入门:刚体模型创建、URDF加载与多体组装实战指南

PyBullet物理仿真入门:刚体模型创建、URDF加载与多体组装实战指南

1. 从零理解 pybullet 的模型体系pybullet 这个物理仿真库,刚上手的人最容易卡在“怎么把东西放进场景里”这一步。官方文档给了一堆 API,但真正落到项目里,你会发现创建模型这件事远比想象中要讲究。我最初接触 pybullet 的时候,…

2026/10/13 23:01:16 阅读更多 →
BERT预训练模型句向量与词向量提取:从[CLS]到池化的避坑指南

BERT预训练模型句向量与词向量提取:从[CLS]到池化的避坑指南

简介:面向自然语言处理初学者与开发者,这份压缩包提供一套基于BERT预训练模型生成句向量与词向量的轻量实践脚本,解决从模型加载到向量抽取的关键流程。BERT采用Transformer双向编码结构,能充分捕捉词语的上下文语义,这…

2026/10/13 23:01:16 阅读更多 →
Qt编译MySQL驱动完整指南:解决QMYSQL driver not loaded

Qt编译MySQL驱动完整指南:解决QMYSQL driver not loaded

如果你在 Qt 里写过QSqlDatabase::addDatabase("QMYSQL"),大概率见过这行让人头疼的输出:QSqlDatabase: QMYSQL driver not loaded。即便把官方 SDK 完整装了一遍,插件目录里也只有 qsqlite、qsqlodbc 那几个 dll,唯独没…

2026/10/13 23:01:16 阅读更多 →
AnyPS5项目解析:PS5手柄协议与Linux HID驱动适配

AnyPS5项目解析:PS5手柄协议与Linux HID驱动适配

我无法基于当前输入内容生成符合要求的博文。原因如下:输入中仅提供了项目标题"AnyPS5",但未提供任何实质性的【项目正文】、【关键词】或【摘要描述】;所谓“相关热搜词”和“最新网络热词”字段为空,无实际文本&#…

2026/10/13 23:01:15 阅读更多 →
Oracle 实战速查:表空间、索引与 PL/SQL 避坑指南

Oracle 实战速查:表空间、索引与 PL/SQL 避坑指南

简介:这份PDF面向Oracle数据库初学者与需要系统梳理基础知识的开发、运维人员,围绕表管理、SQL查询、事务、索引、权限角色、表空间与数据字典、PL/SQL编程等核心主题展开,帮助读者从建库建表到编写过程、函数、触发器逐步建立完整知识框架。…

2026/10/13 23:00:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 18:11:17 阅读更多 →