UE4 C++静态加载SkeletalMesh与动画蓝图完整实操
我们接着往下写。这是“基于C代码的UE4学习”系列第三十八篇这次主题很聚焦用C代码把 SkeletalMesh 加载到角色身上并且静态加载一个动画蓝图。很多人在这个阶段会开始纠结——明明蓝图里拖个引用、拉个变量就行为什么偏要用代码我的答案是纯C项目的资产引用一旦写死在蓝图资产里代码侧就很难做统一的资源管理和热替换。尤其当你开始做“角色配置由数据驱动”这类系统时代码加载资源是绕不过去的一关。这篇文章适合已经能写基础Actor/Character类、却还没真正搞懂“资源加载”这条链路的开发者。我会从静态加载和动态加载的取舍讲起再带你把角色网格体和动画蓝图的加载代码完整敲一遍最后把常见的路径坑和排查方法整理成清单。1. 为什么这次要聊代码加载骨骼网格体1.1 静态加载和动态加载该怎么选先说结论资源加载在UE4里大体分两条路——静态加载和动态加载。静态加载用的是ConstructorHelpers::FObjectFinder/FClassFinder在对象构造阶段就把资源引用解析好烘焙打包时这些资源会作为硬引用被打进包内。动态加载则是LoadObject/FStreamableManager这类运行时接口等游戏跑起来才去磁盘上找资源。这两者没有绝对的优劣只看场景。角色身上的默认SkeletalMesh在绝大多数项目中都是固定资源用静态加载最干净路径写对编译通过资源就跑不了Cook的时候包体也不会漏。动态加载则更多用在“运行时才决定资源ID”的情况比如换装系统里玩家选了一件衣服你才把对应的网格体拉出来或者做DLC、Mod支持时不想让主包硬引用额外资源。初学者最容易犯的毛病是——不管什么资源一律在BeginPlay里LoadObject觉得这样“灵活”。结果就是代码写起来越来越绕包体引用关系混乱稍不注意就成了内存泄漏重灾区。我个人的习惯是能确定的资源就静态加载确定不了的才动态加载。这篇文章要做的角色模型和动画蓝图都属于“完全确定”的资源所以只讲静态加载这条主线后面会给动态加载留个备选方案。1.2 资源路径的本质AssetName.AssetNameUE4的资源路径有个很容易被忽略的规则/Game/目录/资产名.资产名。前半段是资源在Content目录下的相对路径后半段则是“资产名.资产名”的重复引用格式。比如我们常用第三人称模板里的骷髅模型完整引用长这样SkeletalMesh/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin注意最前面的SkeletalMesh标签它声明了你要加载的是哪种类型的资源。少了这个前缀FObjectFinder会直接找不到对象。这个“路径类型前缀”的完整格式大部分人第一次手敲都会栽跟头。想知道某个资产的正确路径最稳的办法是在Content Browser里右键选择“Copy Reference”然后粘出来看。别靠手敲尤其是项目里资产目录层级很深、文件名又带了一大串前缀的时候手打路径纯属给自己挖坑。2. 最小可行的C角色搭建2.1 创建角色类的基础结构为了不把问题复杂化这次我直接基于ACharacter来做。ACharacter已经自带了一个USkeletalMeshComponent通过GetMesh()就能拿到这比从零搭建APawn省事很多也符合大多数游戏角色类的基础形态。用编辑器创建C类的流程我就不展开了假设你已经建好一个名为AMyCodeChar的角色类并且正确写入了项目模块名我下面代码里的MYPROJECT_API要替换成你自己的项目宏。类结构很简单.h里只需要一个构造函数和UCLASS宏// MyCodeChar.h #pragma once #include CoreMinimal.h #include GameFramework/Character.h #include MyCodeChar.generated.h UCLASS() class MYPROJECT_API AMyCodeChar : public ACharacter { GENERATED_BODY() public: AMyCodeChar(); };2.2 组件与头文件的完整配置有些教程会在 .h 里手动声明一个USkeletalMeshComponent*然后自己建组件这个动作其实是多余的——ACharacter的父类已经创建好了你直接拿GetMesh()来用就行。如果你想换个自定义的SkeletalMeshComponent那才需要CreateDefaultSubobject手动创建并替换但这种需求属于少数。在 .cpp 里头文件要按需加。核心需要的有#include MyCodeChar.h #include ConstructorHelpers.h #include Animation/AnimInstance.hConstructorHelpers.h是静态加载代码的运行时依赖AnimInstance.h则是因为我们要给网格体指定动画蓝图类需要用到UAnimInstance的类型信息。缺失这两个头文件编译直接报“Incomplete type”之类的错误小白第一次写代码加载资源时最容易遇到这类跟业务无关的编译报错。3. 核心实操用C把SkeletalMesh加载到角色身上3.1 ConstructorHelpers静态加载全流程我直接给你一份完整的构造函数实现这是本次内容的主菜// MyCodeChar.cpp #include MyCodeChar.h #include ConstructorHelpers.h #include Animation/AnimInstance.h AMyCodeChar::AMyCodeChar() { // 1. 加载 SkeletalMesh static ConstructorHelpers::FObjectFinderUSkeletalMesh MeshAsset( TEXT(SkeletalMesh/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin)); if (MeshAsset.Succeeded()) { GetMesh()-SetSkeletalMesh(MeshAsset.Object); GetMesh()-SetRelativeLocation(FVector(0.0f, 0.0f, -90.0f)); GetMesh()-SetRelativeRotation(FRotator(0.0f, -90.0f, 0.0f)); } else { UE_LOG(LogTemp, Error, TEXT(Failed to load SkeletalMesh)); } // 2. 加载动画蓝图核心 static ConstructorHelpers::FClassFinderUAnimInstance AnimBPClass( TEXT(/Game/Mannequin/Animations/ThirdPerson_AnimBP)); if (AnimBPClass.Succeeded()) { GetMesh()-SetAnimInstanceClass(AnimBPClass.Class); } else { UE_LOG(LogTemp, Error, TEXT(Failed to load AnimBlueprint)); } }这里有个细节你要品一品FObjectFinderUSkeletalMesh的类型模版参数和字符串里的SkeletalMesh前缀必须对应加载动画蓝图时FClassFinderUAnimInstance对应的则是不带前缀的路径。为什么因为FClassFinder实际加载的是“蓝图的生成类”而蓝图生成的类本身已经没有“资产类型前缀”这个概念了它内部会自动处理_C后缀逻辑。这个差异是新手最容易忽略的后面我会在4.3节单独展开。3.2 为什么加载代码要写进构造函数很多刚接触UE4代码的人会有个疑问为什么不能在BeginPlay里加载原因有两点。第一构造函数里使用ConstructorHelpers时会给编辑器提供一个“引用提示”。在编辑器里打开蓝图、或者在C类上右键创建蓝图子类的时候引擎会知道你依赖了哪些资产从而在Cook/打包阶段把这些资源正确地打进去。把加载逻辑写在BeginPlay里如果只是简单LoadObject打包器不会自动收集引用一旦资源被轻量化裁剪运行时就啥都加载不到。第二构造函数执行的时机非常早早于场景初始化。如果你在BeginPlay里加载并设置网格体视觉效果上是可能的但从架构上讲角色一生成就开始去做IO这会让频繁刷怪的项目出现明显卡顿。而静态加载是在“对象实例化之前”就完成了引用解析游戏运行时几乎没有额外开销。所以记住凡是模型、动画、音效这些在角色定义阶段就确定的资产请放进构造函数用ConstructorHelpers静态加载。等到运行时换皮、换装再转向动态加载方案。3.3 动态加载的四条备选路线万一你确实需要在运行时加载网格体比如做角色装备换装系统我额外给你列几条路线按推荐程度排个序LoadObjectUSkeletalMesh: 最基础的同步加载。传入完整引用路径即可获得对象优点是简单直接缺点是会卡主线程。TSoftObjectPtrLoadSynchronous: 在类里用TSoftObjectPtr暴露一个“软引用”属性用它来配置可能替换的资源。运行时调用LoadSynchronous()完成加载。相比纯粹路径字符串软引用能在编辑器中显示下拉选择框体验好很多。FStreamableManager异步加载: 配合UAssetManager做异步Load请求发出后不阻塞主线程等回调拿到资源再替换。这个方案适合UI、大地图资源这种大文件加载场景也适合需要做进度条的场合。TAssetPtr或FPrimaryAssetId配合DataAsset: 属于资源管理系统级别的方案适合资产量大、需要做版本更新的项目。对于当前这篇博文的主题记住“静态加载为主”就够了动态加载你只要知道有这么几条路线等碰到真实需求再逐个研究也不迟。4. 动画蓝图静态加载让网格体真正“动”起来4.1 FClassFinder加载动画蓝图类网格体加载完成只是第一步不上动画蓝图的话角色就永远摆一个T-pose。UE4的动画系统里动画蓝图AnimBlueprint本质是一个继承自UAnimInstance的蓝图类而不是普通的资源对象。这就决定了加载它的方式和加载网格体不同——我们要找的是一个“类”不是“对象”。用FClassFinderUAnimInstance静态加载路径直接指向动画蓝图资产所在的目录和文件名不带资产类型前缀。拿第三人称模板自带的动画蓝图来说路径通常是这样/Game/Mannequin/Animations/ThirdPerson_AnimBP这个路径对应的资产文件一般是ThirdPerson_AnimBP如果我没记错的话这个蓝图资产的路径在多数UE4版本里是一样的。FClassFinder在内部解析路径时会自动补上_C后缀去定位蓝图生成的类。找到类之后调用GetMesh()-SetAnimInstanceClass(AnimBPClass.Class)引擎就会给这个网格体实例化一个对应的动画蓝图实例并开始驱动动画。4.2 动画蓝图与C AnimInstance的搭配差异如果你自己写一个继承自UAnimInstance的C类然后想指定它作为动画实例那就不能用FClassFinder了而是用FObjectFinderUAnimInstance配合类的默认对象或者直接在构造函数里传UMyAnimInstance::StaticClass()。这是两种完全不同的路径逻辑C AnimInstance 派生类: 类已经编译在二进制里直接GetMesh()-SetAnimInstanceClass(UMyAnimInstance::StaticClass())就行不涉及任何资产加载。蓝图动画蓝图: 资产存在于Content目录类信息在蓝图资源里必须用FClassFinderUAnimInstance按路径加载。这个区别看着简单但不少初学者会混用。比如拿着FClassFinder路径却去加载了一个纯C类或者反过来在代码里想LoadObject加载动画蓝图结果拿到一个蓝图资产对象而不是类然后SetAnimInstanceClass报编译错误。我建议你先把这两类使用场景写在代码注释里免得半年后自己回来改东西时还要重新踩一遍。4.3 路径写错时最常见的三个坑在动画蓝图路径上我踩过的坑基本可以浓缩成三句话。其一路径结尾千万不要带资产名。有人从“Copy Reference”里复制了完整的资产引用比如AnimBlueprint/Game/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP然后直接塞进FClassFinder这必挂。FClassFinder只需要目录文件名不要类型前缀、不要结尾的重复资产名。其二蓝图资产和蓝图类之间有个看不见的_C。动画蓝图资产在编辑器里叫ThirdPerson_AnimBP编译后生成的类实际叫ThirdPerson_AnimBP_C。FClassFinder看不到这个后缀但引擎内部会自动补上。你要是手贱自己拼字符串在路径后面加个_C反而会找不到类。其三Succeeded() 失败后不报明确错误。FClassFinder返回失败时日志可能只提示Failed to find object没有具体路径。这时候别慌先在Content Browser里找到你的动画蓝图资产右键 Copy Reference去掉类型前缀和最后一节资产名再对照代码里的路径检查逐级目录。5. 完整代码整合与编辑器验证5.1 一个完整角色的头文件与CPP这里我整合一个更完整一点的版本顺便把角色移动组件参数也设了方便你直接在场景里跑起来看效果。头文件保持不变CPP完整如下// MyCodeChar.cpp #include MyCodeChar.h #include ConstructorHelpers.h #include Animation/AnimInstance.h #include GameFramework/CharacterMovementComponent.h AMyCodeChar::AMyCodeChar() { // 加载 SkeletalMesh设置默认骨骼模型 static ConstructorHelpers::FObjectFinderUSkeletalMesh MeshAsset( TEXT(SkeletalMesh/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin)); if (MeshAsset.Succeeded()) { GetMesh()-SetSkeletalMesh(MeshAsset.Object); GetMesh()-SetRelativeLocation(FVector(0.0f, 0.0f, -90.0f)); GetMesh()-SetRelativeRotation(FRotator(0.0f, -90.0f, 0.0f)); } else { UE_LOG(LogTemp, Error, TEXT(Mesh load failed, check SkeletalMesh path.)); } // 加载默认动画蓝图 static ConstructorHelpers::FClassFinderUAnimInstance AnimBPClass( TEXT(/Game/Mannequin/Animations/ThirdPerson_AnimBP)); if (AnimBPClass.Succeeded()) { GetMesh()-SetAnimInstanceClass(AnimBPClass.Class); } else { UE_LOG(LogTemp, Error, TEXT(AnimBP load failed, check AnimBlueprint path.)); } // 基础移动参数调整方便测试 GetCharacterMovement()-MaxWalkSpeed 600.0f; GetCharacterMovement()-JumpZVelocity 420.0f; }这段代码只要路径正确编译完拖一个AMyCodeChar到场景里运行后应该就能看到一个带默认动画的角色。测试时可以用第三人称模板的默认地图省去搭建场景的功夫。5.2 编译与场景验证流程具体验证流程我建议按这个顺序走编译通过后在Content Browser里右键你的MyCodeChar类创建蓝图子类命名如BP_MyCodeChar。把BP_MyCodeChar拖进场景点运行。视角靠近角色确认网格体是否显示、是否播放待机/移动动画。按WASD移动角色确认动画蓝图在状态机里正常切换。如果模型出来了但不动先检查动画蓝图路径如果模型压根没显示优先检查网格体路径和语法。这个排查逻辑很朴素但确实覆盖了90%的加载问题。5.3 用日志快速定位加载失败代码里我已经埋了UE_LOG的错误输出。运行之后打开Output Log搜LogTemp看到Mesh load failed或AnimBP load failed就知道是哪个环节出了问题。日志级别设为Error在编辑器里会显示成红字一眼就能看到。这里补充一个真实经验C日志显示的路径往往是相对路径但你从Content Browser Copy Reference拿到的是带引用前缀的完整路径。排查的时候别只盯着日志那一行要结合资产浏览器里的实际目录结构去核对。6. 常见问题与排查速查表我把实际操作中用过的排查经验整理成一张速查表遇到问题可以逐行对号入座。问题现象可能原因排查/解决方案网格体不显示日志报Mesh load failed路径字符串拼错、资产类型不匹配、资源未存在于当前工程用Copy Reference核对路径再去掉多余前缀重新尝试模型显示T-pose动画不播放动画蓝图路径错误、Succeeded()返回false、SetAnimInstanceClass未被调用检查FClassFinder路径确认SetAnimInstanceClass在成功分支内动画蓝图路径复制后加载失败复制时带了AnimBlueprint...前缀和资产名后缀只保留/Game/目录/资产名部分不保留类型前缀和重复资产名角色整体出现偏移或朝向不对网格体相对旋转/位移未设置调整GetMesh()-SetRelativeLocation和SetRelativeRotation参考原版角色的默认值编辑器加载正常打包后异常使用了运行时动态加载但没收集引用改为构造函数中的ConstructorHelpers静态加载或在打包设置中确保资源被包含C编译报Incomplete type错误头文件缺失检查是否包含ConstructorHelpers.h、Animation/AnimInstance.hFClassFinder提示找不到路径蓝图资产没有父类UAnimInstance或路径层级错误确认动画蓝图继承了UAnimInstance再检查路径层级逐级核对最后再分享一点我的个人体会我在自己某个模拟项目里第一次用这套加载逻辑时其实踩得最狠的坑就是路径后缀。严格来讲动画蓝图的加载和网格体加载是两种完全不同的“引用模式”前者是类后者是对象理解到这一层你就不再会觉得UE4资源加载有多玄。现在我的习惯是在项目里单独写一个静态工具类比如UAssetLibrary把常用资源路径集中管理避免在构造函数里散落到处都是字符串。这样后续做换装、加技能特效时改动一个地方即可全局生效。这个系列下一篇我大概率会接着聊“运行时动态替换SkeletalMesh”的具体做法也会把这次的静态加载方案做个对比。如果你在实际操作中也遇见了什么奇怪的加载问题欢迎在留言区记录一下场景和报错日志大家一起围观排雷。

相关新闻

Kotlin泛型深度解析:类型擦除、型变与reified实战

Kotlin泛型深度解析:类型擦除、型变与reified实战

1. 从类型擦除说起:为什么Kotlin泛型值得单独开一个专题很多人学Kotlin泛型的时候,第一反应是"这不就是Java那套吗"。我一开始也这么想,直到在一个数据解析模块里踩了个坑——写了一个看似完美的泛型转换函数,编译通过&…

2026/10/14 11:05:15 阅读更多 →
重积分建模本质:从物理直觉到高维应用

重积分建模本质:从物理直觉到高维应用

1. 为什么重积分的应用远不止“算体积”——从物理建模到几何直觉的跃迁很多人学完二重积分,脑子里只留下一个公式:∬_D f(x,y) dσ。考试时套用极坐标换元、画个积分区域、算个数值,就以为掌握了。但我在带某高校数学分析实验课时发现&#…

2026/10/14 11:05:15 阅读更多 →
libxl 4.1.1带注册信息:C++离线生成Excel报表实践

libxl 4.1.1带注册信息:C++离线生成Excel报表实践

简介:libxl4.1.1 带注册信息资源包,聚焦高效轻量级 Excel 读写库的跨平台集成,面向需要将 Excel 处理能力嵌入应用的 C/C、C# 开发者,重点梳理 API 调用、依赖库、编译选项以及注册授权验证在 Windows 与 Linux 环境下的差异&…

2026/10/14 11:05:15 阅读更多 →

最新新闻

听觉-触觉跨模态注意力机制:实现仿生机器人遮挡场景的多模态感知融合

听觉-触觉跨模态注意力机制:实现仿生机器人遮挡场景的多模态感知融合

简介:仿生机器人听觉-触觉跨模态感知融合的527页专题技术文档,聚焦遮挡场景下的鲁棒性设计,面向机器人感知、深度学习和多模态融合方向的研究者与工程师。资源为单个PDF文件,压缩包大小10.75MB,支持目录跳转与书签大纲…

2026/10/14 12:06:10 阅读更多 →
游戏网关GM管理工具:多端网页访问与安全指令执行架构

游戏网关GM管理工具:多端网页访问与安全指令执行架构

简介:这是一款专为问道游戏服务端运维人员与GM(游戏管理员)设计的跨平台网页远程管理工具包,解决传统网关管理依赖本地客户端、多系统适配难、移动端无法操作等痛点,适用于Linux/Windows/macOS等环境下的服务端日常监控…

2026/10/14 12:06:10 阅读更多 →
智能体安全边界:从输出过滤到内核层约束的工程实践

智能体安全边界:从输出过滤到内核层约束的工程实践

1. 从 18000 条帖子说起:智能体安全边界到底在防什么先把背景交代清楚。所谓“18000 条帖子”,指的是一个智能体在真实社区环境里连续运行、累计产出并交互了约一万八千条内容之后,暴露出来的那批问题。这个量级很关键——几百条帖子的时候&a…

2026/10/14 12:06:10 阅读更多 →
工业AI视觉检测:边缘计算与模型选型实战解析

工业AI视觉检测:边缘计算与模型选型实战解析

直播结束后第二天我还在翻后台记录,结果评论区被顶到最上面的不是“下一步怎么做”,而是一条看起来很基础的问题:“像工业AI检测、服装检测这类AI,到底用的是云联网还是单机的AI?用的什么大模型才够?”说实…

2026/10/14 12:06:10 阅读更多 →
hyperframes:面向网页视频交付的 CLI 工具链

hyperframes:面向网页视频交付的 CLI 工具链

1. 项目概述&#xff1a;什么是 hyperframes&#xff1f;它不是“超帧”&#xff0c;而是一套面向现代网页视频工作流的 CLI 工具链 你搜“hyperframes”时&#xff0c;首页弹出一堆混杂词&#xff1a;HTML、MP4、Node.js、CLI、m3u8转MP4、codex cli、zcode cli、<!doctyp…

2026/10/14 12:06:10 阅读更多 →
深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

1. 从“选哪个框架”这个老问题说起如果你在深度学习这个圈子里待过一段时间&#xff0c;大概率会被问到或者问过别人一个问题&#xff1a;“我到底该学哪个框架&#xff1f;”这个问题几乎和“该学Python还是R”一样&#xff0c;属于入门阶段的经典纠结。但有意思的是&#xf…

2026/10/14 12:05:09 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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