Unity3D汽车游戏源码调校指南:WheelCollider与Rigidbody物理参数详解
简介这是一份基于Unity3D引擎开发的汽车驾驶类游戏项目源码面向Unity初学者与有一定经验的游戏开发者可用于学习赛车游戏的完整实现流程。项目围绕汽车轮转动这一核心效果展开涉及刚体组件、物理引擎、C#脚本控制、碰撞检测与用户输入处理等关键环节并包含本田品牌汽车模型资源便于理解3D模型、纹理与动画在场景中的组织方式。压缩包为rar格式共464个文件约13.93MB涵盖cs脚本、shader着色器、mat材质、prefab预制体、anim动画、fbx模型、psd贴图及asset资源文件等覆盖脚本逻辑、渲染效果与资源管理多个层面。目前已有546人学习下载适合通过阅读源码掌握Unity游戏对象与组件、物理模拟、光照材质、UI交互及性能优化等知识点也可作为二次开发与项目练手的参考素材。1. 拿到一份 Unity3D 汽车游戏源码先别急着点运行你从某个资源站拖下来一个压缩包解压后看到 Assets、ProjectSettings、Packages 三个文件夹心里大概就有数了——这是一份 Unity3D 写的汽车游戏工程。它大概率包含车辆控制脚本、摄像机跟随、赛道场景、UI 计分可能还有 AI 巡逻车和碰撞检测。这类资源对三种人最有用想学 Unity 车辆物理的初学者、需要快速搭驾驶 Demo 的独立开发者、以及拿它当课程设计底稿的学生。但我要先说一个反直觉的结论直接双击打开场景按 Play十有八九车会原地打转或者穿模飞出赛道。原因不是源码烂而是 Unity 的车辆物理对参数极其敏感而这份工程里的 Rigidbody 质量、WheelCollider 摩擦曲线、重心位置都是按作者当时的场景尺度调的。你换了场景比例、换了 Unity 版本参数就全歪了。所以正确的打开方式不是先玩而是先读懂它的车辆模型结构再决定改哪里。下面我按“拆结构 → 调物理 → 接输入 → 排坑 → 进阶”的顺序把这份资源从头到尾过一遍。2. 拆开车辆预制体WheelCollider 与 Rigidbody 的参数逻辑2.1 先认清 Unity 车辆物理的三个核心组件Unity 自带的车辆方案不是“一个脚本搞定”而是三个东西配合Rigidbody 提供刚体质量与受力WheelCollider 模拟轮胎与地面的接触和摩擦脚本负责把油门、刹车、转向翻译成扭矩和角度。这份汽车游戏源码里车辆预制体通常叫 Car 或 Vehicle上挂的就是这套组合。你打开预制体后重点看四个 WheelCollider 的分布前两个负责转向后两个负责驱动这是最常见的后驱布局。也有源码做成四驱那就四个都加驱动力。判断方法很简单看脚本里motorTorque是赋给wheelFL和wheelFR还是四个轮子都赋。Rigidbody 这边质量Mass一般设在 1000 到 1500 之间单位是千克。质量太小车会被一个小坎弹飞质量太大同样的扭矩推不动。重心Center of Mass是另一个关键很多源码不显式设置Unity 就默认用所有碰撞体几何中心结果车过弯必翻。常见做法是在脚本Start()里手动把重心压低// 把重心压到车身底部偏前减少过弯侧翻 void Start() { Rigidbody rb GetComponentRigidbody(); rb.centerOfMass new Vector3(0f, -0.5f, 0.2f); }这里的-0.5f是相对车身原点的 Y 偏移负值代表往下压0.2f是略微前移让车头更稳。具体数值要看你车身模型的高度一般取车身高度的一半再往下一点。改完这个你会发现过弯翻车的概率明显下降这是血泪经验里最值钱的一行。2.2 WheelCollider 的摩擦曲线为什么不能照抄WheelCollider 最玄学的地方是它的摩擦曲线Forward Friction 和 Sideways Friction。这两条曲线描述的是轮胎滑移率与摩擦力的关系横轴是滑移量纵轴是摩擦系数。源码里作者调好的曲线是配合他的车重和轮胎半径的。你如果只改了车重没改曲线就会出现两种翻车要么轮胎抓不住地起步原地空转要么抓得太死转向时车像被钉在地上一样推头。我一般会先看WheelCollider的 Radius 和 Suspension Distance。Radius 要和你车轮模型的半径一致差 0.05 都会让车看起来悬空或陷地。Suspension Distance 是悬挂行程通常 0.2 到 0.3。然后才是摩擦曲线。一个稳妥的起点是把 Forward Friction 的 extremumSlip 设 0.4、extremumValue 设 1、asymptoteSlip 设 0.8、asymptoteValue 设 0.5Sideways Friction 的 extremumSlip 设 0.2、extremumValue 设 1、asymptoteSlip 设 0.5、asymptoteValue 设 0.75。这套值不是万能但能让大多数 1:1 比例的街车跑起来不飘。// 批量设置四个轮子的摩擦曲线避免逐个手调 void TuneFriction(WheelCollider wc) { WheelFrictionCurve fwd wc.forwardFriction; fwd.extremumSlip 0.4f; fwd.extremumValue 1f; fwd.asymptoteSlip 0.8f; fwd.asymptoteValue 0.5f; wc.forwardFriction fwd; WheelFrictionCurve side wc.sidewaysFriction; side.extremumSlip 0.2f; side.extremumValue 1f; side.asymptoteSlip 0.5f; side.asymptoteValue 0.75f; wc.sidewaysFriction side; }注意WheelFrictionCurve是结构体必须整体赋值回去不能只改字段。这是新手最容易踩的坑改了没效果还以为 Unity 坏了。2.3 驱动方式决定你的脚本改法后驱车前轮只转向、后轮只驱动脚本里就是wheelRL.motorTorque torque和wheelRR.motorTorque torque。四驱则四个都赋。前驱反过来。这份源码如果是后驱你改成四驱只需要把前轮的 motorTorque 也加上但要注意前轮同时承担转向扭矩太大会导致转向不足。常见做法是前轮扭矩给后轮的 60% 左右。刹车则相反一般四轮都加 brakeTorque数值在 3000 到 6000 之间具体看车重。手刹只锁后轮brakeTorque 给到 10000 以上配合侧向摩擦降低就能做出漂移。3. 把输入、摄像机和 UI 串起来从能跑到能玩3.1 输入映射旧输入系统与新输入系统的分叉这份源码大概率用的是旧版Input.GetAxis(Horizontal)和Input.GetAxis(Vertical)。如果你在 Unity 2022 之后的新工程里打开可能会发现输入没反应因为项目设置里 Active Input Handling 被设成了 New Input System。解决办法有两个一是把 Player Settings 里的 Active Input Handling 改回 Both 或 Old二是把脚本改成新输入系统的写法。我一般选前者因为改脚本工作量大而且这份源码的输入逻辑很简单没必要重写。// 旧输入系统的典型写法放在 Update 里读输入 float h Input.GetAxis(Horizontal); // A/D 或左右方向键 float v Input.GetAxis(Vertical); // W/S 或上下方向键 float brake Input.GetKey(KeyCode.Space) ? 1f : 0f; // 转向角限制在 30 度以内速度越快转向越小 float steerAngle h * maxSteerAngle * (1f - rb.velocity.magnitude / 100f); wheelFL.steerAngle steerAngle; wheelFR.steerAngle steerAngle; // 驱动扭矩按输入给刹车单独处理 float torque v * motorForce; wheelRL.motorTorque torque; wheelRR.motorTorque torque;这里maxSteerAngle一般设 30 到 35motorForce设 800 到 1500。速度越快转向越小的那行是防止高速猛打方向翻车100f是速度上限的粗略估计你可以按赛道长度调。刹车部分如果brake为 1就把四个轮子的brakeTorque设成 5000同时把motorTorque清零否则刹车和油门会打架。3.2 摄像机跟随别用父子关系硬绑很多新手会把摄像机直接拖成车的子物体结果车一颠簸摄像机就跟着抖过弯时视角还歪。正确做法是摄像机独立用脚本做平滑跟随。常见的是 LateUpdate 里做位置插值// 摄像机平滑跟随LateUpdate 保证在车辆移动之后执行 public Transform target; public Vector3 offset new Vector3(0f, 3f, -6f); public float smoothSpeed 5f; void LateUpdate() { Vector3 desiredPos target.TransformPoint(offset); transform.position Vector3.Lerp(transform.position, desiredPos, smoothSpeed * Time.deltaTime); transform.LookAt(target.position Vector3.up * 1.5f); }offset的 Z 是负值代表在车后方Y 是高度。smoothSpeed越大跟随越紧但太大会抖5 到 8 比较合适。LookAt的目标点抬高 1.5 是为了看车前方而不是车底。如果你想要更专业的跟随可以加一个速度相关的 FOV 变化速度越快视野越广但这个源码里不一定有属于进阶改法。3.3 UI 计分与圈速先确认触发器的层级赛道上的检查点和终点通常是带 Collider 的触发器Is Trigger 勾选。源码里会有一个脚本挂在检查点上检测OnTriggerEnter的是不是玩家车。这里常见的坑是玩家车有多个碰撞体车身一个、四个轮子各一个触发器可能被轮子先碰到导致计圈逻辑触发两次。解决办法是在OnTriggerEnter里判断other.CompareTag(Player)并且加一个冷却时间或者只让车身碰撞体参与触发。UI 那边Text组件在新版 Unity 里可能被TextMeshPro替代如果源码用的是旧 Text你需要在 Package Manager 里确认 UI 包还在否则场景里的文字会显示为粉色方块。4. 避坑与排查这份源码最容易翻车的五个地方4.1 现象车原地打转或抖动 → 原因WheelCollider 半径与模型不匹配 → 解决对齐半径并检查悬挂车在原地疯狂抖动或者一给油就原地转圈九成是 WheelCollider 的 Radius 和车轮视觉模型的半径对不上。WheelCollider 是物理碰撞体视觉车轮是 Mesh两者必须同心同径。你选中 WheelCollider看它的绿色线框圆是否和车轮模型重合。不重合就调 Radius直到线框刚好包住轮胎。另外悬挂的Suspension Distance如果设得比实际需要的行程大车会像弹簧一样上下弹。一般设 0.2 到 0.3然后把Center的 Y 调到车轮中心略高一点。4.2 现象转向时车翻 → 原因重心太高或侧向摩擦过大 → 解决压低重心并降低侧向摩擦过弯翻车是车辆物理里最经典的翻车。除了前面说的centerOfMass下压还要看 Sideways Friction 的extremumValue是不是设到了 1 以上。有些源码为了抓地力把侧向摩擦拉到 1.5结果侧向力太大车直接侧翻。我一般把extremumValue控制在 1 以内asymptoteValue控制在 0.7 左右。如果还翻就在车身两侧加两个空物体作为防倾杆的锚点用脚本施加反向力但那是进阶做法先调参数能解决大部分问题。4.3 现象按 Play 后车不动 → 原因输入轴名称不匹配或脚本未挂载 → 解决检查 Input Manager 和组件引用车不动先看 Console 有没有报错。如果没有报错检查脚本里的Input.GetAxis(Horizontal)里的轴名称是否在 Project Settings → Input Manager 里存在。有些源码用的是自定义轴名比如 Steer你直接打开就会报错。解决办法是在 Input Manager 里加一个同名轴或者把脚本里的轴名改成默认的 Horizontal。另外检查车辆预制体上的脚本引用有没有丢尤其是 WheelCollider 的四个引用如果显示 None拖回去即可。4.4 现象车轮视觉模型不转 → 原因没有同步 WheelCollider 的旋转 → 解决在 Update 里同步位置和旋转WheelCollider 是物理组件它自己不会带动视觉车轮。你需要在脚本里把 WheelCollider 的GetWorldPose结果赋给车轮 Mesh 的 transform// 同步车轮视觉模型的位置和旋转 void UpdateWheelVisual(WheelCollider wc, Transform visual) { Vector3 pos; Quaternion rot; wc.GetWorldPose(out pos, out rot); visual.position pos; visual.rotation rot; }如果车轮模型是车身子物体直接赋position和rotation可能会因为父级缩放出问题。常见做法是把车轮模型从车身里拖出来作为独立物体或者用localPosition和localRotation并考虑父级变换。这个坑很隐蔽表现是车轮转得歪歪扭扭。4.5 现象打包后车跑得比编辑器里快 → 原因帧率差异导致 FixedUpdate 步长不一致 → 解决固定时间步长编辑器里帧率高打包后帧率可能掉到 60 以下而物理计算在FixedUpdate里默认步长 0.02 秒。如果帧率波动大物理表现会不一致。解决办法是在 Project Settings → Time 里把 Fixed Timestep 设成 0.01 到 0.02 之间的固定值并开启Maximum Allowed Timestep限制。另外所有和物理相关的输入读取和力施加都放在FixedUpdate里不要放Update否则输入频率和物理频率对不上车会一顿一顿的。5. 进阶调校用遥测数据把车调成你想要的手感5.1 先给车加一个简易遥测面板调车不能靠感觉得看数据。我一般会在车上挂一个脚本把速度、四个轮子的滑移率、发动机转速实时打到 UI 上。滑移率可以从 WheelCollider 的GetGroundHit里拿// 读取轮子滑移率用于判断抓地还是打滑 WheelHit hit; if (wc.GetGroundHit(out hit)) { float slip Mathf.Abs(hit.forwardSlip) Mathf.Abs(hit.sidewaysSlip); // slip 接近 0 表示抓地大于 0.5 表示明显打滑 }把这个值显示在屏幕上你就能看到过弯时哪个轮子先失去抓地。前轮滑移大说明转向过度后轮滑移大说明转向不足。然后针对性调摩擦曲线或扭矩分配。这个面板不用做得多漂亮几个TextMeshPro文本就够。5.2 用 ScriptableObject 存车辆参数如果你打算调多辆车把参数写死在脚本里会很痛苦。常见做法是建一个CarConfig的 ScriptableObject把质量、扭矩、转向角、摩擦曲线都放进去脚本运行时读取。这样你可以在 Project 窗口里右键创建不同车辆的配置换车就是换一个 asset。这个改法不复杂但能让你的工程从“一份源码”变成“一个可扩展的车辆系统”。// 车辆配置资产右键 Create → Car Config 即可生成 [CreateAssetMenu(fileName CarConfig, menuName Car Config)] public class CarConfig : ScriptableObject { public float mass 1200f; public float motorForce 1200f; public float maxSteerAngle 32f; public float brakeTorque 5000f; public Vector3 centerOfMass new Vector3(0f, -0.5f, 0.2f); }然后在车辆脚本里用public CarConfig config;引用Start()里把值赋给 Rigidbody 和 WheelCollider。这样你调参数不用改代码也不怕改错。5.3 验证方法用固定赛道跑圈速调完参数怎么知道变好了我习惯在场景里放一条固定赛道用计时器记录从起点到终点的圈速跑五圈取平均。如果圈速稳定且没有翻车说明参数靠谱。如果圈速忽快忽慢说明物理不稳定回去检查 Fixed Timestep 和摩擦曲线。这个习惯是从一次翻车经历来的当时我把侧向摩擦调高单圈快了 0.5 秒但第三圈必翻后来加了遥测才发现是后轮滑移累积导致。从那以后我每次调完车都强制跑五圈不再只看第一圈的表现。希望这份拆解能帮你把这份 Unity3D 汽车游戏源码真正跑起来而不是让它躺在硬盘里吃灰。本文还有配套的精品资源点击获取

相关新闻

告别LLM-as-a-Judge:用语义表征让小模型做精准评估

告别LLM-as-a-Judge:用语义表征让小模型做精准评估

我先说一个判断:LLM-as-a-Judge 这个方向,到了该“往回拉一拉”的时候了。过去一年我主要精力都放在怎么让大模型当裁判这件事上。一开始确实惊艳,给一段回答,让大模型打个分、挑个错,效果比传统的 BLEU、ROUGE 不知道…

2026/10/17 23:12:06 阅读更多 →
意大利餐厅H5响应式网站源码解析:手写HTML+CSS+JS项目拆解

意大利餐厅H5响应式网站源码解析:手写HTML+CSS+JS项目拆解

简介:这是一份面向Web前端初学者与进阶开发者的意大利风味餐厅响应式网页源码,基于HTML5、CSS3与JavaScript构建,能够自适应桌面、平板与手机屏幕,适用于餐饮企业官网、品牌展示、菜品宣传等场景,可直接作为练习或项目…

2026/10/19 1:57:42 阅读更多 →
Atari强化学习数据管线:图片预处理、状态堆叠与经验回放初始化

Atari强化学习数据管线:图片预处理、状态堆叠与经验回放初始化

我做Atari游戏训练,一般不会一上来就写完整训练循环,而是先把最枯燥但最关键的数据入口搞定:图片处理、state更新、经验回放数据初始化。这一篇就专门聊这套流程,并且会用Jupyter Notebook作为调试现场。对刚开始做DQN类强化学习的…

2026/10/17 23:12:06 阅读更多 →

最新新闻

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南 【免费下载链接】seed-vc zero-shot voice conversion & singing voice conversion, with real-time support 项目地址: https://gitcode.com/GitHub_Trending/se/seed-vc 有一场会要开…

2026/10/19 2:01:28 阅读更多 →
MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/Gi…

2026/10/19 2:01:28 阅读更多 →
biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 开售那几秒,你连刷七八次页面,「立即购买」刚亮起就弹出排队提示…

2026/10/19 2:01:28 阅读更多 →
低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

摘要: 可穿戴设备续航从 7 天缩水到 2 天,电池容量没变、固件逻辑没改,问题出在低功耗模式上。更诡异的是——进入 STOP 模式后电流反而比 RUN 模式更大。这不是硬件故障,而是低功耗设计里最反直觉的一类陷阱:GPIO 悬空、外设时钟未关、上拉下拉配错、调试接口未禁用……每…

2026/10/19 2:01:28 阅读更多 →
Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

【免费下载链接】Qwen-Image-Layered-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/zimengxiong/Qwen-Image-Layered-6bit 点击查看 免费下载 Qwen-Image-Layered-6bit 是面向 Apple Silicon 的 6-bit 量化图像分层模型,能把任意图片分解为多张 R…

2026/10/19 2:01:28 阅读更多 →
ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

采购申请页面上的保存按钮,背后通常不只有一次数据库写入。申请抬头需要保存,行项目需要关联,金额需要计算,供应商需要校验,当前操作者还必须具备相应权限。只要其中一项没有满足业务要求,系统就不能把这张申请当成一份完整、有效的业务单据。 这类围绕业务数据开展读取…

2026/10/19 2:00:28 阅读更多 →

日新闻

频率跟踪型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/18 0:55:02 阅读更多 →
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 阅读更多 →