理解 GUILayout 与 EditorGUILayout,并探究 ScrollView 滚轮失效可能的原因
前言在 Unity Editor 开发中我们经常需要写自定义窗口EditorWindow来做工具面板。比如调试 Dify 接口时需要一个窗口同时显示几段 JSON发送的query、标准流程standardProcess、以及 Dify 返回的结果。每段文本都很长自然就想到用ScrollView包起来鼠标停在区域内滚轮滚动。看起来非常简单的需求实际做的时候却出现了问题把SelectableLabel放进父级ScrollView里滚轮没反应而换成TextArea或LabelField滚轮正常。为什么三个控件对滚轮有这样的表现要弄清楚这件事需要先理解 IMGUI 的整体机制和理解控件对鼠标滚轮事件的处理方式。本文结合一个真实项目中的 Dify 调试窗口对GUILayout、EditorGUILayout、三个文本控件进行说明、以及讨论ScrollView滚轮失效的可能原因。本文涉及 Unity 内部实现的部分如控件对ScrollWheel的处理逻辑是基于实测行为做的推断并非 Unity 公开源码的逐行引用。凡不确定的部分都会明确标注。一、GUILayout 与 EditorGUILayout 是什么关系1. 两者的定位GUILayout和EditorGUILayout都是 Unity Immediate Mode GUI即时模式 GUI简称 IMGUI提供的绘制 API。它们的核心思想是每一帧重新绘制整个界面。GUILayout通用 IMGUI 绘制 API运行时Runtime游戏内和编辑器都能用。提供最基础的按钮、文本、滑动条、滚动视图等。EditorGUILayout编辑器专用只能在 Editor 程序集里用且主要作用于 Editor 窗口。它在GUILayout之上扩展了一批编辑器特有的控件比如PropertyField、ObjectField、TagField、HelpBox、InspectorTitlebar等。简单说EditorGUILayout是GUILayout的编辑器增强版。2. 为什么会有两套因为运行时 UI 不应该依赖编辑器类型UnityEditor命名空间在打包后不存在所以运行时只能用GUILayout。而编辑器工具为了方便可以用更高级的EditorGUILayout。两者共享同一套布局引擎和事件系统。GUILayout.BeginHorizontal/GUILayout.EndHorizontal和EditorGUILayout.BeginHorizontal/EditorGUILayout.EndHorizontal在底层是同一套 Group 机制可以混用但建议同一个代码块里保持一致避免混乱。3. 共同的布局机制自动布局栈IMGUI 的布局是栈式的。每调用一次Begin...就把一个新的布局组压栈End...弹出。控件绘制时会被自动归入当前栈顶的组里。GUILayout.BeginHorizontal();// 进入横向组GUILayout.Button(A);GUILayout.BeginVertical();// 进入纵向组栈顶GUILayout.Button(B);GUILayout.Button(C);GUILayout.EndVertical();// 弹出纵向组GUILayout.EndHorizontal();// 弹出横向组Begin和End必须严格配对少一个End会导致整帧布局错乱甚至报错。这是 IMGUI 最容易出错的地方之一。二、IMGUI 的事件模型绘制与事件是同一件事这是理解滚轮失效可能原因的前提也是 IMGUI 和 Retained Mode UI如 uGUI、UI Toolkit最大的区别。1. 每帧 OnGUI 会被调用多次OnGUI在一帧内会被 Unity 调用多次每次对应一个不同的EventLayout事件先跑一遍只为了计算布局尺寸不真正绘制。Repaint事件真正把界面画到屏幕上。鼠标/键盘事件MouseDown、MouseUp、MouseDrag、MouseMove、ScrollWheel、KeyDown、KeyUp等。每次OnGUI进来Event.current就是当前要处理的事件。所有控件GUILayout.Button、EditorGUILayout.LabelField等本质上都是一个函数它拿到当前事件决定要不要处理它。2. 事件被用掉就没了Use() 与 EventType.UsedIMGUI 事件系统里有一个关键概念一个事件在一帧里只能被消费一次。控件通过调用Event.current.Use()来声明这个事件我处理了。一旦Use()被调用Event.current.type就会从原来的类型比如ScrollWheel变成EventType.Used。后续所有控件看到EventType.Used时通常会直接跳过不做任何处理。这就是整个滚轮问题的核心滚轮事件最终被谁Use()掉决定了 ScrollView 能不能滚动。关于Use()的语义是 Unity 公开 API 行为Event.Use有公开文档这一点是确定的。下面具体哪个控件在哪一步调用了 Use属于推断。三、ScrollView 的滚动逻辑在哪里执行这是容易被误解的一点但很关键。EditorGUILayout.BeginScrollView和EndScrollView是一对。滚动条的绘制在BeginScrollView里但真正的是否滚动、滚动多少的判断和位移通常发生在EndScrollView阶段EndScrollView负责收尾并应用滚动偏移。为什么这个顺序重要因为在BeginScrollView和EndScrollView之间写的所有控件都会先于EndScrollView的滚动逻辑执行。也就是说scrollPosEditorGUILayout.BeginScrollView(scrollPos);// —— 这里面的控件先于下面的滚动判断执行 ——EditorGUILayout.SelectableLabel(longText);// 先执行EditorGUILayout.EndScrollView();// 滚动判断后执行如果中间的SelectableLabel已经把ScrollWheel事件Use()掉了那么当执行到EndScrollView时Event.current.type已经变成了UsedScrollView 的滚动逻辑看到Used就跳过 →不滚动。这一段滚动判断在 EndScrollView是基于 IMGUI 布局-事件分离模型和实测行为的推断。Unity 的 ScrollView 内部 C 源码并未完整公开无法 100% 逐行确认但从行为上完全自洽。四、三个文本控件LabelField / TextArea / SelectableLabel1. LabelFieldLabelField是最纯粹的显示文本控件。它只负责把文字画出来不接收任何鼠标/键盘输入事件。鼠标点它、滚轮滚它事件原样穿过交给后面的控件。常用形式// 普通标签EditorGUILayout.LabelField(标题);// 自动换行风格按宽度折行适合长文本EditorGUILayout.LabelField(longText,EditorStyles.wordWrappedLabel);// 带自定义样式颜色、字号、对齐等EditorGUILayout.LabelField(红色,newGUIStyle(GUI.skin.label){normal{textColorColor.red}});常用参数text要显示的字符串。第二个参数常传一个GUIStyle控制字体、颜色、换行、对齐。EditorStyles.wordWrappedLabel是常用的自动换行只读文本样式。GUILayout布局参数GUILayout.Width、GUILayout.Height、GUILayout.ExpandWidth等控制占用尺寸。特点绝对只读、不碰事件、不能选中复制。最常用但功能最少。2. TextAreaTextArea是一个可编辑的多行文本框。它内部维护一个TextEditor文本编辑器状态支持输入、删除、光标移动、选中文本、复制粘贴。常用形式// 可编辑文本区stringsEditorGUILayout.TextArea(text);// 只读展示风格用 wordWrappedLabel 样式看起来像标签但仍可选中复制EditorGUILayout.TextArea(text,EditorStyles.wordWrappedLabel,GUILayout.ExpandHeight(true));常用参数text当前文本。GUILayout.MinHeight/GUILayout.Height/GUILayout.ExpandHeight控制高度。ExpandHeight(true)让它尽量撑满父容器剩余空间。第二个参数可传GUIStyle控制外观。关键行为实测TextArea不会主动消费鼠标滚轮事件即使它获得了键盘焦点滚轮事件仍然原样传给父级 ScrollView父级正常滚动。这一点和很多人直觉相反——直觉会觉得聚焦的输入框会吞滚轮实际不会。3. SelectableLabelSelectableLabel的设计目的是可选可复制、但不能编辑的只读文本。它内部同样用TextEditor但处于一种特殊的只读可选模式。常用形式// 默认自动换行、可选中复制EditorGUILayout.SelectableLabel(longText);// 固定高度EditorGUILayout.SelectableLabel(longText,GUILayout.MinHeight(120));关键行为实测这是本文的核心结论把SelectableLabel放进父级 ScrollView滚轮完全失效。无论有没有焦点都不行。为什么合理推断是SelectableLabel为了支持鼠标拖选文本“选区在滚动时保持可视”选区超出可视区自动定位这些能力它内部的文本处理逻辑无条件消费了鼠标所在区域的ScrollWheel事件一进入控件就Use()掉。这样EndScrollView看到的已经是Used滚动逻辑被跳过。这个无条件 Use ScrollWheel的判断属于基于行为的推断不是从 Unity 源码确认的。我没有读 Unity 内部 C 的条件。但实测结果非常稳定只要内层是 SelectableLabel父级 ScrollView 就滚不动一换成 TextArea/LabelField立刻能滚。从事件只能被 Use 一次的公开机制反推最合理的解释就是 SelectableLabel 把事件吞了。五、为什么 SelectableLabel 失败、TextArea 和 LabelField 成功把前面几点合起来结论很清晰控件是否主动消费 ScrollWheel配父级 ScrollView能否选中复制是否可编辑LabelField否完全不碰事件成功不能否TextArea否聚焦与否都不吞成功能是SelectableLabel是推断为无条件吞失败能否核心链条ScrollWheel事件一帧只能被消费一次。ScrollView 的滚动应用发生在EndScrollView排在内部控件之后。SelectableLabel先把ScrollWheelUse 掉 →EndScrollView看到Used→ 不滚动。TextArea、LabelField不碰ScrollWheel→ 事件传到EndScrollView→ 正常滚动。正确选型在一个长文本放进固定高度区域、需要区域内滚轮的场景下要绝对只读用LabelFieldwordWrappedLabel样式最干净但没法复制。要能复制、又要滚轮可用用TextAreawordWrappedLabel样式推荐。它继承了 TextArea 的事件特性不抢滚轮又靠样式看起来像只读标签还保留了选中复制能力。唯一理论缺陷是用户可能误删显示内容对 Editor 测试工具来说可接受。别用SelectableLabel在放进父级 ScrollView的场景下它是无法实现滚动的功能。实测可用写法本项目最终采用GUILayout.Label(Query发送给 Dify 的提问数据,EditorStyles.boldLabel);EditorGUILayout.BeginVertical(HelpBox);_queryScrollEditorGUILayout.BeginScrollView(_queryScroll,GUILayout.MinHeight(120));// 用 wordWrappedLabel 让它显示成长文本ExpandHeight 撑满高度EditorGUILayout.TextArea(record.query,EditorStyles.wordWrappedLabel,GUILayout.ExpandHeight(true));EditorGUILayout.EndScrollView();EditorGUILayout.EndVertical();GUILayout.Space(5);六、常用 EditorWindow 绘制函数速查下面列出写 Editor 窗口最常用的函数给出用途、常用参数和效果。1. 布局控制// 横向组内部控件水平排列GUILayout.BeginHorizontal();GUILayout.EndHorizontal();// 纵向组内部控件垂直排列GUILayout.BeginVertical();GUILayout.EndVertical();// 区块样式传入 GUIStyle如 box、HelpBoxGUILayout.BeginVertical(box);GUILayout.EndVertical();布局组必须严格配对。2. 间距与弹性GUILayout.Space(10);// 固定像素间距GUILayout.FlexibleSpace();// 弹性空白撑满剩余空间常用于两端对齐3. 文本显示EditorGUILayout.LabelField(text);// 只读标签EditorGUILayout.LabelField(text,EditorStyles.wordWrappedLabel);// 自动换行只读EditorGUILayout.TextArea(text);// 可编辑多行EditorGUILayout.SelectableLabel(text);// 只读可选注意滚轮是否存在问题GUILayout.Label(text,EditorStyles.boldLabel);// 加粗标题4. 按钮if(GUILayout.Button(点击)){}// 普通按钮if(GUILayout.Button(点击,GUILayout.Height(30))){}// 固定高度if(GUILayout.Button(刷新,EditorStyles.toolbarButton)){}// 工具栏风格按钮GUILayout.Button在被点击的当帧返回true否则false。5. 滚动视图// 固定高度的滚动区域scrollPosEditorGUILayout.BeginScrollView(scrollPos,GUILayout.Height(150));// 内部控件EditorGUILayout.EndScrollView();常用参数第一参数Vector2 scrollPosition当前滚动位置用成员变量保存。GUILayout.Height/MinHeight控制视图高度超出部分靠滚动条。注意Begin/End配对。6. 输入控件stringsEditorGUILayout.TextField(名字,value);// 单行文本intnEditorGUILayout.IntField(数量,value);// 整数floatfEditorGUILayout.FloatField(速度,value);// 浮点boolbEditorGUILayout.Toggle(开关,value);// 勾选框intiEditorGUILayout.Popup(选项,index,options);// 下拉选择Vector3vEditorGUILayout.Vector3Field(位置,value);// 三维向量ColorcEditorGUILayout.ColorField(颜色,value);// 颜色这些都返回用户输入后的新值用返回值回写即可。7. 编辑器特有控件// 引用一个对象拖拽赋值ObjectobjEditorGUILayout.ObjectField(资源,value,typeof(GameObject),true);// 自动绘制一个序列化属性最常用在 InspectorEditorGUILayout.PropertyField(serializedProperty);// 带图标的提示框EditorGUILayout.HelpBox(这是一段提示,MessageType.Info);// Info / Warning / ErrorObjectField第四个参数allowSceneObjects表示是否允许拖入场景对象。8. 尺寸控制GUILayoutOptions这些可以附加到几乎任何绘制函数末尾GUILayout.Width(200)// 固定宽度GUILayout.Height(30)// 固定高度GUILayout.MinWidth(100)// 最小宽度GUILayout.MaxWidth(300)// 最大宽度GUILayout.MinHeight(120)// 最小高度GUILayout.ExpandWidth(true)// 是否横向撑满GUILayout.ExpandHeight(true)// 是否纵向撑满例GUILayout.Button(OK, GUILayout.Width(80), GUILayout.Height(30))。9. 窗口与重绘Repaint();// 手动触发窗口重绘异步操作完成后更新 UI 常用异步任务如网络请求完成后OnGUI不会自动重绘需要主动调用Repaint()刷新显示。七、结语这个滚轮问题看似很小但它正好暴露了 IMGUI 最容易被忽视的一点在即时模式里绘制和事件处理是同一件事控件之间通过Use()隐式协作。谁先把事件消费掉谁就决定了后面的行为。记住几个要点GUILayout是通用 IMGUIEditorGUILayout是编辑器增强版共享同一套布局和事件机制。一个事件一帧只能被Use()一次。ScrollView 的滚动应用排在内部控件之后所以内部控件一旦吞掉滚轮ScrollView 就无法使用滚轮。SelectableLabel会吞滚轮基于行为推断TextArea和LabelField不吞。长文本 父级 ScrollView 滚轮可用 可复制这个组合最优解是TextArea wordWrappedLabel。写 Editor 工具时理解了这套事件流再遇到滚轮不滚问题就能从事件被谁消费的角度去定位尝试解决问题。参考资料Unity Scripting API —EditorGUILayout官方文档编辑器绘制 API 总览https://docs.unity3d.com/ScriptReference/EditorGUILayout.htmlUnity Scripting API —GUILayout官方文档通用 IMGUI APIhttps://docs.unity3d.com/ScriptReference/GUILayout.htmlUnity Scripting API —GUI官方文档底层 GUI 类https://docs.unity3d.com/ScriptReference/GUI.htmlUnity Scripting API —EditorGUI官方文档非自动布局的编辑器绘制https://docs.unity3d.com/ScriptReference/EditorGUI.htmlUnity Scripting API —Event官方文档事件类型与Use()语义https://docs.unity3d.com/ScriptReference/Event.htmlUnity Scripting API —EventType官方文档包含ScrollWheel/Used等事件类型https://docs.unity3d.com/ScriptReference/EventType.htmlUnity Manual — “Editor Windows”官方手册自定义窗口基础https://docs.unity3d.com/Manual/editor-EditorWindows.html说明以上 Unity 官方文档确认了 IMGUI 的基本 API 行为GUILayout/EditorGUILayout的用法、Event.Use的语义、EventType的取值。但本文关于SelectableLabel内部为何吞掉 ScrollWheel的解释TextEditor无条件Use滚轮是基于反复实测的行为反推Unity 并未公开这部分内部 C 源码属于推断而非确认。如果未来 Unity 版本调整了SelectableLabel的事件处理逻辑本文的结论可能需要重新验证。

相关新闻

DeepSeek医疗RAG降本60%实战

DeepSeek医疗RAG降本60%实战

DeepSeek 医疗屠夫:RAG 降本 60% 实测 适用读者:在自家应用里做医疗 RAG,要在 DeepSeek / Qwen / ERNIE / GPT 这些基座里挑一个的开发者 阅读时长:约 12 分钟 测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档) 一、为什么 2026 年 Q3 突然都在聊医疗 RAG 上周帮朋…

2026/10/18 4:45:46 阅读更多 →
MySQL 可重复读隔离级别,完全解决幻读了吗?

MySQL 可重复读隔离级别,完全解决幻读了吗?

我在上一篇文章 (opens new window)提到,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种: 针对快照读(普通 select 语…

2026/10/19 4:50:43 阅读更多 →
回溯算法进阶:排列组合问题解析与实战

回溯算法进阶:排列组合问题解析与实战

1. 代码随想录算法训练营Day28内容概览作为一名参加过多个算法训练营的老学员,我清楚地记得Day28在整个训练周期中的关键地位。这一天通常会聚焦回溯算法的进阶应用,特别是解决排列组合类问题的经典模式。不同于基础阶段对单个算法的学习,Day…

2026/10/18 4:46:09 阅读更多 →

最新新闻

PP-DocLayoutV3版面分析实战:从RAG乱序到结构化文档预处理

PP-DocLayoutV3版面分析实战:从RAG乱序到结构化文档预处理

前阵子在帮某技术团队做企业内部知识库的问答系统,天天和一批扫描版PDF打交道。系统整体跑通之后,检索质量一直上不去,答非所问的情况特别多。排查到最后,问题指向的不是向量模型,也不是检索策略,而是最基础…

2026/10/19 4:50:03 阅读更多 →
HDFS生产级深度解析:架构本质、配置陷阱与可观测运维

HDFS生产级深度解析:架构本质、配置陷阱与可观测运维

1. 项目概述:从“离线Day03”看HDFS在真实数据工程中的定位你打开一份名为“hadoop离线day03--Hadoop HDFS”的课程材料或笔记标题,第一反应可能是:“哦,又一节Hadoop基础课”。但如果你真在某公司数据平台组干过两年以上&#xf…

2026/10/19 4:50:02 阅读更多 →
AutoGen 10.1实战:多Agent对话协作框架全面拆解

AutoGen 10.1实战:多Agent对话协作框架全面拆解

“10.1”这个版本号一出来,熟悉的朋友应该知道我说的是哪个东西——AutoGen,微软开源的那个多智能体对话框架。在很多项目里,真正让它出圈的不是“能写代码”,而是它把多个AI Agent组织起来,让它们像人开会一样你一言我…

2026/10/19 4:50:02 阅读更多 →
open-code-review:面向生产环境的可审计代码审查CLI

open-code-review:面向生产环境的可审计代码审查CLI

1. 这不是又一个“AI写代码”玩具:open-code-review 的真实定位与不可替代性你可能已经点开过十几个标着“AI Code Review”的开源项目,下载、安装、跑 demo,然后发现——它要么在 PR 描述里胡乱夸你“逻辑清晰”,要么对着一行if …

2026/10/19 4:50:02 阅读更多 →
开源本地化代码审查工具 open-code-review 实战指南

开源本地化代码审查工具 open-code-review 实战指南

1. 这不是又一个“AI写代码”玩具,而是一套能嵌入真实开发流水线的开源代码审查工作流我第一次在团队内部试运行open-code-review的时候,没敢直接推到主分支,而是先拉了个feat/open-cr-test分支,把上周刚合并的三个 PR 全部回滚重…

2026/10/19 4:50:02 阅读更多 →
室内AI出图三周实战路线:从零基础到稳定交付效果图

室内AI出图三周实战路线:从零基础到稳定交付效果图

刚收到一位做室内设计的同行私信,开口就问:“室内AI出图要学多久?我看别人发的那种效果图太惊艳了,但自己连从哪下手都不知道。”我的回答很直接:三周,足够你从完全没碰过AI出图,到稳定输出客户…

2026/10/19 4:49:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →