UE5 PCGSettings模块化场景生成:告别复制粘贴,实现高效复用
1. 项目概述告别“复制粘贴”用PCG重塑场景构建思维如果你和我一样在UE5里做过稍微复杂点的开放世界或者大型室内场景肯定对“复制粘贴”和“手动对齐”这两件事深恶痛绝。一个城堡里上百个结构相似的房间一片森林里成千上万棵需要自然分布的树木靠手动摆放不仅效率低下后期想做个整体调整更是噩梦。传统的模块化Modular资产拼接虽然解决了部分复用问题但本质上还是“乐高式”的手工活缺乏规则和逻辑难以生成真正有机、多变且符合设计意图的大规模场景。这就是UE5.2引入的程序化内容生成框架Procedural Content Generation Framework简称PCG要解决的核心痛点。而PCGSettings在我看来是PCG工具链中那颗被严重低估的“瑞士军刀”。它不是一个单一的节点而是一个可自定义、可参数化、可嵌套的规则容器。简单来说你可以把一整套复杂的场景生成逻辑比如生成一座山并在山上合理分布植被、路径和岩石打包成一个PCGSettings资产。之后在任何需要的地方你只需像拖拽一个预制件Prefab一样把这个PCGSettings拖进场景调整几个暴露出来的参数如大小、密度、植被类型一套完整的、带逻辑的场景模块就瞬间生成了。这不仅仅是效率的提升更是工作流的革命。它让我们从“场景美术师”向“场景规则设计师”转变。本次实战我们就来深入拆解如何利用PCGSettings像搭积木一样高效、灵活地组合关卡实现真正的模块化场景设计与极致复用。2. PCGSettings核心概念与设计哲学解析在深入实操前必须理解PCGSettings的设计哲学否则很容易把它用成一个复杂的“大杂烩”节点失去其模块化的精髓。2.1 PCGSettings是什么不仅仅是节点的集合在PCG图表编辑器中你熟悉的是PCG Graph它由一系列节点如Surface Sampler,Transform Points,Spawn Actor连线构成。而PCGSettings是一个资产Asset它的核心内容是一个PCG Graph的实例并且额外封装了接口Interface功能。你可以这样理解PCG Graph图表是蓝图类定义了生成逻辑。PCG Component组件是场景中的实例执行某个Graph来生成内容。PCGSettings设置资产是一个特殊的、可重用的“预制Graph”它自带参数化接口可以被多个PCG Component引用。它的强大之处在于三点封装与抽象将复杂的生成逻辑隐藏起来对外只暴露几个关键参数如Seed,Density,Scale Min/Max。场景搭建者无需理解内部复杂的节点网络只需调节参数即可。嵌套与组合一个PCGSettings内部可以引用另一个PCGSettings。这意味着你可以构建多层级的模块系统。例如一个Forest_ModuleSettings内部引用了一个Tree_ClusterSettings和一个Rock_ScatterSettings。动态配置通过蓝图或Sequencer可以在运行时动态修改PCGSettings暴露的参数实现场景的动态变化如树木生长、建筑逐渐显现。2.2 为何要使用PCGSettings对比传统模块化的优势传统模块化场景设计依赖于手动摆放网格体Static Mesh演员。它的优势是直观、控制力强但劣势明显对比维度传统模块化资产拼接基于PCGSettings的模块化生成复用效率中。需要手动复制、对齐、调整。极高。拖拽Settings资产调整参数即可生成整个模块。变化性低。依赖美术制作大量变体资产组合方式有限。极高。通过程序化规则如随机变换、按表面分布自然产生无限变体。迭代成本高。修改基础模块后所有使用该模块的地方都需要手动更新。低。修改核心PCGSettings资产所有引用它的地方自动更新。逻辑关联弱。资产间关系靠美术师手动设计难以维护如灯必须放在墙上。强。规则内可定义关联如“在生成的每个房子旁自动放置一盏路灯”。关卡文件大小大。每个实例都是独立的Actor数据。小。只存储PCG Component的引用和参数数据实例是动态生成的。学习曲线低。直观易上手。中高。需要理解程序化思维和节点逻辑。注意PCGSettings并非要完全取代手动摆放。对于需要精确控制、具有独特艺术性的关键区域如主线任务房间、标志性建筑依然需要美术师亲手打磨。PCGSettings的核心战场是需要大量重复、但要求自然变化和逻辑关联的背景环境如地形植被、城市街区、洞穴系统、废墟群等。3. 实战构建一个可复用的“森林地块”PCGSettings模块让我们通过一个具体案例从零开始构建一个名为BP_ForestPatch_Settings的PCGSettings资产。目标是创建一个可以随意放置、通过参数控制大小、树木密度和岩石数量的森林地块模块。3.1 步骤一创建与初始化PCGSettings资产在内容浏览器中右键选择“PCG” - “PCG Settings”。命名为BP_ForestPatch_Settings。双击打开你会进入一个熟悉的PCG图表编辑器但此时你编辑的正是这个Settings资产本身的逻辑。关键操作暴露参数。这是Settings的灵魂。在图表空白处右键选择“Add Parameter”。我们先添加三个Patch_Radius(Float): 控制森林地块的圆形半径。Tree_Density(Float): 控制树木的密度单位个/平方米。Rock_Count(Integer): 控制岩石生成的数量。将这些参数节点拖入图表它们就是外部可调节的入口。3.2 步骤二构建内部生成逻辑图现在我们在Settings内部构建森林的生成逻辑。思路是生成一个圆形区域 - 在该区域表面生成树木点 - 生成岩石点 - 分别生成对应Actor。// 逻辑节点链示意非实际代码 [Start] - [Create Points in a Circle] (半径绑定 Patch_Radius) - (输出点集A) - [Surface Sampler] (以点集A为范围密度绑定 Tree_Density) - (输出树木点集B) - [Spawn Actor] (将点集B实例化为树木静态网格体) - [Apply Variation] (随机旋转、缩放) | - [Density Filter] (从点集A中按 Rock_Count 数量筛选) - (输出岩石点集C) - [Spawn Actor] (将点集C实例化为岩石静态网格体) - [Apply Variation] (随机旋转、缩放)核心节点详解与参数绑定创建圆形范围使用Point Generator节点选择Circle模式。将其Radius引脚与Patch_Radius参数节点连接。生成树木添加Surface Sampler节点。将其Target Actor连接到Self表示以PCG组件自身位置为原点。Points per Squared Meter每平方米点数连接到Tree_Density参数。这样密度就由外部参数控制了。将Surface Sampler的In引脚连接到Point Generator的Out引脚限定采样范围在圆形内。添加Static Mesh Spawner节点选择你的树木网格体。连接到Surface Sampler的输出。添加Transform Points节点为其设置随机的Rotation和Scale使用Uniform Scale Min/Max如0.8-1.2让树木看起来更自然。生成岩石岩石我们想要固定数量而非密度。添加Density Filter节点。将其Target Density模式改为By Number of Points并将Target Number of Points连接到Rock_Count参数。将Density Filter的In引脚连接到Point Generator的Out引脚与树木共享同一套原始点集。添加另一个Static Mesh Spawner节点选择岩石网格体并连接类似的随机变换节点。实操心得“Self”引用的重要性在PCGSettings内部Self节点代表将来在场景中放置的那个PCG组件本身。所有以Self为目标的采样、生成操作都会以该组件的变换位置、旋转、缩放为基准。这是实现“模块随处放置”的关键。参数绑定技巧不是所有内部变量都需要暴露。只暴露那些不同实例间最可能需要差异化调整的参数。过于复杂的参数面板会吓退使用者。本例中Patch_Radius大小、Tree_Density疏密、Rock_Count点缀物数量是最核心的维度。3.3 步骤三在关卡中实例化与测试保存BP_ForestPatch_Settings资产。打开你的关卡从内容浏览器中将BP_ForestPatch_Settings直接拖拽到视口中。你会发现它自动创建了一个PCG Component并且其Settings属性已经指向了你刚创建的资产。选中这个PCG Component在细节Details面板中你会看到一个“Parameters”折叠栏。点开它里面赫然出现了我们定义的三个参数Patch_Radius,Tree_Density,Rock_Count。尝试拖动Patch_Radius滑块场景中的森林范围实时变化。调整Tree_Density树木数量随之增减。修改Rock_Count岩石的数量立即更新。复制这个PCG Component粘贴到场景的另一处。分别调整两片森林的参数一个可以是茂密的大森林另一个可以是稀疏的小树林。逻辑完全复用表现各不相同。至此一个最基本的可复用PCGSettings模块就完成了。你已经体验到了“搭积木”的便捷性。4. 进阶嵌套组合与层级化场景构建单个森林地块还不够酷。真正的威力在于嵌套。假设我们现在要构建一个“山区环境”模块它应该包含地形、多个森林地块分布在山腰、一条山路、和一些散落的巨石。4.1 创建子模块山路PCGSettings首先我们创建一个生成山路的子模块BP_MountainPath_Settings。新建PCGSettings。逻辑使用Spline节点定义路径走向这可以暴露一个Spline数据参数或内部固定。沿Spline采样点使用Box类型的Point Generator生成路面点再通过Static Mesh Spawner生成路面网格。可以在路径两侧再添加Offset节点生成点用于放置护栏或路灯。暴露关键参数如Path_Width路径宽度、Should_Spawn_Rails是否生成护栏Bool类型。4.2 创建父模块山区环境PCGSettings现在创建主模块BP_MountainBiome_Settings。新建PCGSettings。生成基础地形可以使用Landscape节点读取关卡中的地形或者使用Height Field节点程序化生成一个简单山体。这里我们假设关联到关卡地形。嵌套森林子模块在图表中添加“PCG Settings”节点注意是节点不是创建资产。在该节点的属性中将Settings赋值为我们之前创建的BP_ForestPatch_Settings。这个节点现在就代表了整个森林生成逻辑。我们需要控制在哪里生成这些森林。添加一个Point Generator例如用Grid模式在山腰区域生成几个点将其输出连接到PCG Settings节点的In引脚。关键步骤传递参数。PCG Settings节点上有与子Settings资产对应的输入引脚如Patch_Radius,Tree_Density。你可以直接连接常量值所有森林地块统一参数。连接一个Attribute节点为每个生成点设置不同的属性值从而实现同一模块在不同位置参数不同如山脚森林茂密山腰稀疏。嵌套山路子模块同样添加一个PCG Settings节点引用BP_MountainPath_Settings。用一条Spline数据可以暴露为参数控制其路径走向并连接Path_Width等参数。生成散落巨石可以直接在父Settings内部用简单的Surface Sampler和Spawn Actor完成作为环境的补充细节。在父Settings中你可以暴露高层级参数如Forest_Count控制生成几个森林点、Overall_Vegetation_Density整体植被密度系数可以乘到子模块的密度参数上。4.3 在关卡中使用顶级模块将BP_MountainBiome_Settings拖入关卡。调整Forest_Count和Overall_Vegetation_Density你会发现它内部自动生成了多个参数各异的森林地块和一条蜿蜒的山路。整个复杂的山区环境通过调整几个顶层参数就完成了布局和风格控制。这种嵌套结构的优势分工协作资深技术美术TA负责开发底层、稳定的子模块如BP_ForestPatch_Settings,BP_MountainPath_Settings。关卡设计师直接使用顶层的、语义化的父模块如BP_MountainBiome_Settings进行快速搭建。统一管理与更新如果需要修改所有森林中树木的模型只需修改BP_ForestPatch_Settings这一个资产所有山区、平原、岛屿中引用了该模块的森林都会自动更新。性能优化可以在父模块层级设置统一的LOD、Culling和生成范围避免每个子模块单独计算。5. 性能优化、调试与常见问题排查PCG功能强大但生成大量实例时性能和数据管理是关键。5.1 性能优化核心技巧控制生成范围与密度这是最重要的优化。通过参数严格限制Patch_Radius、Density和Rock_Count。避免在早期关卡设计阶段就使用过高的密度。使用Culling和LOD在PCG Component的Details面板中启用“Culling”选项。可以设置为基于视距Distance或基于包围盒Bounds剔除不可见的生成内容。对于Spawn Actor节点考虑生成带有LOD的静态网格体。分层生成与流送对于超大型世界不要用一个巨型PCG Graph覆盖全部。将世界划分为网格每个网格使用独立的PCG Component和Settings。结合World Partition的流送Streaming功能只加载和生成当前所需的网格。善用“Execution Mode”PCG Component有几种执行模式。Execute on Load加载时执行一次。适合静态背景。Execute on Property Change属性参数变化时执行。适合设计期调试。Execute Manually手动触发。适合运行时动态生成。设计期建议使用Execute on Property Change以实时反馈打包前根据情况改为Execute on Load以节省运行时开销。5.2 调试与问题排查实录即使逻辑正确PCG也常出现“生成了但看不到”或“生成位置不对”的问题。以下是我的排查清单现象可能原因排查步骤与解决方案没有任何内容生成1. PCG Component未激活。2. Graph无有效输出。3. 生成范围有误如Surface Sampler未找到表面。1. 检查Component的bActivated是否为true。2. 在PCG编辑器中点击节点上的“眼睛”图标预览每个阶段的点数据看在哪一步数据丢失了。3. 检查Surface Sampler的Target Actor是否设置正确常设为Self并确保该位置存在Landscape或Static Mesh。Actor生成在错误位置如世界原点Transform信息在节点链中丢失。确保从Surface Sampler或Point Generator输出的点集其变换信息位置被正确传递到Spawn Actor节点。检查中间是否有Transform Points节点错误地重置了位置。一个技巧在Spawn Actor前插入一个Debug节点预览点的最终位置。生成结果不随参数变化参数绑定失败或节点未刷新。1. 确认参数引脚已正确连接连线显示为粗橙色。2. 修改参数后PCG Component可能需要手动点击“Refresh”按钮或确保执行模式为Execute on Property Change。性能急剧下降1. 生成数量过多。2. 网格体过于复杂。3. 执行模式不当每帧刷新。1. 使用Density Filter或Attribute Filter减少点数。2. 为生成的静态网格体使用简化的碰撞和LOD。3. 将执行模式改为Execute on Load或Execute Manually。嵌套Settings参数不生效父Settings中的PCG Settings节点参数未正确传递。1. 检查子Settings的参数是否已正确暴露Pin Visibility设为Visible。2. 在父Settings中确保PCG Settings节点的输入引脚已连接了有效的属性或常量值。实操心得调试是PCG工作流的一半。养成“分阶段预览”的习惯每连接几个节点就点击预览按钮确保数据按预期流动。大量使用Debug节点查看点的属性如Density,Color,Transform这是理解数据流和定位问题的关键。6. 从模块到系统构建你的PCG资产库与工作流掌握了单个和嵌套模块的创建后最终的目标是建立一个属于你自己或团队的PCG资产库PCG Library。标准化命名与分类建立清晰的文件夹结构。例如/PCG/Settings/Environment/Foliage/BP_TreeCluster_Settings/PCG/Settings/Environment/Rocks/BP_RockScatter_Settings/PCG/Settings/Architecture/Medieval/BP_CityBlock_Settings/PCG/Settings/Logic/BP_LightSpawner_Settings(专门用于根据建筑生成灯光)文档化参数在每个PCGSettings资产的描述Description中简要说明其功能、依赖如需要特定地貌或碰撞通道以及每个暴露参数的含义和合理范围。创建“元Settings”开发一些高度抽象、可配置的“万能”模块。例如一个BP_GenericScatter_Settings暴露参数Target Mesh要散布的资产、Density、Rotation Randomness、Scale Randomness。这个简单模块可以解决50%以上的基础散布需求。与HDAHoudini数字资产结合对于极其复杂、需要Houdini程序化建模的模块如损毁的墙壁、独特的岩石可以在Houdini中制作HDA然后通过UE的Houdini Engine和PCG Houdini Node将其接入PCG图表作为更强大的生成源。我个人在实际项目中的体会是前期投入时间构建一个坚实的PCGSettings库会在项目中后期带来指数级回报。关卡设计师不再抱怨重复劳动技术美术也能从繁琐的摆放工作中解放出来专注于更核心的规则设计和性能优化。当你可以用一下午时间通过组合几个预制模块就搭出一个充满变化、性能可控的森林、城镇或峡谷时那种效率提升的畅快感是传统工作流无法比拟的。最后一个小技巧多利用PCG的Attribute系统比如为生成的点添加一个Biome_Type属性然后根据这个属性决定是生成松树还是橡树是生成苔岩还是花岗岩这能让你的场景模块在复用中产生更细腻、更合理的变化。

相关新闻

AI开发C语言应用按步走,表达式计算器calc的第十七步,历史记录、复合赋值、自增自减、条件表达式

AI开发C语言应用按步走,表达式计算器calc的第十七步,历史记录、复合赋值、自增自减、条件表达式

calc17 — 历史记录、复合赋值、自增自减、条件表达式 1. 概述 本次迭代实现了四个新功能,来自 features.md 中的 G1~G4 建议,大幅提升 REPL 交互体验和表达式表达能力。 新增功能:编号功能说明G1REPL 历史记录history 命令、!n 重复执行、文…

2026/10/17 11:55:53 阅读更多 →
Redisson布隆过滤器并发难题:5个实战方案教你构建高可用分布式过滤系统

Redisson布隆过滤器并发难题:5个实战方案教你构建高可用分布式过滤系统

Redisson布隆过滤器并发难题:5个实战方案教你构建高可用分布式过滤系统 【免费下载链接】redisson Redisson: Valkey & Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and ser…

2026/10/16 16:18:13 阅读更多 →
Linux存储设备管理与分区技术详解

Linux存储设备管理与分区技术详解

1. Linux存储设备基础认知刚接触Linux系统的朋友第一次用fdisk -l命令时,可能会被那些/dev/sda、/dev/sdb1之类的设备名搞得一头雾水。这些看似神秘的命名其实遵循着非常清晰的规则,理解这些规则是掌握Linux存储管理的第一步。在Linux的视角里&#xff0…

2026/10/14 10:08:15 阅读更多 →

最新新闻

MoE架构解析:万亿参数模型如何以稀疏激活实现高效计算?

MoE架构解析:万亿参数模型如何以稀疏激活实现高效计算?

1. 核心认知:参数规模和计算量,很多人的第一反应都错了1.1 一个让大模型“变轻”的反直觉设计我最初看到“万亿参数”这个词的时候,跟大部分人一样,第一反应是“这得要多大的算力才能跑起来”。但后来实际接触并拆解了混合专家&am…

2026/10/17 11:55:36 阅读更多 →
AI辅助教材编写:低查重与教学工作流设计实战指南

AI辅助教材编写:低查重与教学工作流设计实战指南

这两年我用AI辅助编写了多本校本教材和课程讲义,最大的体会是:AI写教材真正的“秘密武器”,不是让大模型一口气吐出几十万字,而是把“检索、组织、改写、审校”拆开的一套生产流程。很多人栽跟头,是因为对AI有两层误解…

2026/10/17 11:55:36 阅读更多 →
上海租公寓,这三样我现在一定会现场确认

上海租公寓,这三样我现在一定会现场确认

有一套我当时觉得很合适:月租在预算里,离地铁也近,照片里的客厅很亮。住了两周我才明白,亮是因为下午侧光,早上房间是暗的;晚上临着马路,窗户关上仍有车声。那次之后,看公寓整租我固…

2026/10/17 11:55:36 阅读更多 →
开源Agent网关OpenClaw:架构设计、部署实操与踩坑记录

开源Agent网关OpenClaw:架构设计、部署实操与踩坑记录

做AI Agent也有一段时间了,前后折腾过不少框架和项目,但一直有个问题像鞋里的沙子一样硌脚:AI助手和我的各种终端之间,总是隔着一层说不清的别扭。直到某天我实在忍不住,动手写了个叫OpenClaw的东西——一个开源的AI A…

2026/10/17 11:55:36 阅读更多 →
Hadoop+MapReduce+HBase离线日志分析集群搭建实战

Hadoop+MapReduce+HBase离线日志分析集群搭建实战

最近有个项目要做离线日志分析和实时查询,数据量不大但增长很快,我们最后选择了CentOS 8.1 Hadoop MapReduce HBase这套组合。这套方案最直接的优势在于:Hadoop负责海量文件的分布式存储,MapReduce处理批量计算,HBa…

2026/10/17 11:55:36 阅读更多 →
深入理解 DOM ProcessingInstruction:用法与实战

深入理解 DOM ProcessingInstruction:用法与实战

1. 引言在 DOM(文档对象模型)中,除了常见的元素节点、文本节点和注释节点之外,还存在一类相对冷门但功能明确的节点类型——ProcessingInstruction(处理指令)。它通常出现在 XML 文档中,用于向解…

2026/10/17 11:54:35 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →