新闻详情

新闻详情

首页 / 资讯中心 / 详情

Unity横版游戏素材导入核心规范:Sprite Mode与PPU深度解析

发布时间:2026/9/30 9:10:53来源:尧图网络
Unity横版游戏素材导入核心规范:Sprite Mode与PPU深度解析
1. 项目概述为什么“素材导入和整理”是横版动作游戏开发的生死线做《勇士传说》这类横版卷轴动作游戏很多人一上来就想写角色跳跃逻辑、设计连招系统、调摄像机跟随——结果三天后卡在主角贴图拉伸变形、攻击帧错位、阴影边缘锯齿上反复重导十几次资源进度归零。我带过三支小团队做过类似项目90%的新手在Unity里栽的第一个坑不是C#语法不是物理引擎而是一张PNG图片拖进Project窗口后的那三分钟操作。标题里写的“素材导入和整理”表面看只是资产入库流程实则直接决定后续所有环节的开发效率与最终表现质量Sprite Mode选错角色移动时会像素撕裂Pixels Per Unit设偏5个单位UI血条永远对不齐角色头顶Sprite Editor里切图锚点偏移2像素攻击判定框就悬在半空——这些都不是Bug是资产元数据层面的硬伤后期几乎无法靠代码修补。关键词“Unity”“素材导入”“Sprite Mode”“Pixels Per Unit”“Sprite Editor”不是孤立术语它们构成了一条完整的资产治理链路。比如“Sprite Mode”本质是Unity对2D图像的语义定义Single模式把整张图当一个精灵适合背景图Multiple模式允许你用Sprite Editor切出多个子图这是横版游戏必备——主角8方向行走帧、攻击动画序列、受击抖动帧全靠它管理而“Pixels Per Unit”PPU更是横版动作游戏的命脉参数它定义“Unity世界坐标系中1个单位长度 图片上多少像素”。设为100意味着角色图宽200像素在场景里就占2个单位宽若误设为50同样一张图就撑满4个单位碰撞体、动画轨迹、摄像机视野全乱套。这不是理论值是必须和美术交付规范强绑定的生产契约。我见过最惨的案例美术按PPU100出图程序按PPU32导入结果Boss战时主角挥剑砍到空气里——因为动画关键帧位置和碰撞体缩放完全错位。所以这篇笔记不讲“怎么点按钮”而是拆解“为什么必须这样点”把Unity 2D管线里那些藏在Inspector面板背后的物理逻辑、坐标转换规则、性能陷阱全摊开给你看。2. 核心细节解析与实操要点从美术交付到Unity资产的完整映射2.1 美术交付规范必须前置锁定的5个硬性参数很多团队把美术和程序割裂成两个世界美术交图时只说“这是主角行走图”程序拿到后自己猜PPU、自己试切割方式。这就像盖房不给施工图工人凭感觉砌墙。《勇士传说》项目启动前我和主美签了份《2D资产交付协议》里面明确写了5个不可协商的参数任何一项不符程序有权拒收统一PPU基准值全项目强制PPU100。理由很实在横版卷轴游戏需要精确控制角色移动速度如每秒3.5单位若PPU不统一同一段代码在不同角色身上跑出不同实际像素位移调试成本爆炸。我们测试过PPU32/64/100/128四种方案PPU100在1080p屏幕下角色高度约120像素既保证清晰度又留出缩放余量且与Unity内置的2D物理单位1单位1米心理认知一致。图层分离规范所有角色图必须分层交付——主角本体、武器独立图层、特效图层如剑气光效、阴影图层。不能合成在一张图里。原因在于Unity的Renderer组件有“Sorting Layer”和“Order in Layer”两级排序分层交付才能实现“武器在角色前、阴影在角色后”的Z轴秩序。曾有个外包团队把剑气画在角色图层里结果主角被障碍物遮挡时剑气也跟着消失改图重做耽误两天。像素对齐约束所有关键帧图像尺寸必须是偶数×偶数如256×256、128×128且角色重心点通常是脚底中心必须落在整数像素坐标上。这是为了规避GPU纹理采样时的双线性插值模糊——当角色静止时如果重心点落在0.5像素位置Unity默认启用bilinear filter边缘会发虚。我们用Photoshop的“视图→显示→像素网格”功能强制对齐导出前用“图像→画布大小”检查尺寸。Alpha通道预乘要求必须使用Premultiplied Alpha格式即RGB通道已乘以Alpha值。Unity的Sprite Renderer默认按此格式解析若美术用Straight AlphaRGB未乘Alpha半透明边缘会出现灰边。验证方法在Photoshop里新建纯黑背景层把图拖上去边缘无灰雾即合格。这个细节90%的美术外包会忽略但它是解决“Unity阴影问题”里软阴影边缘噪点的关键前置条件。命名空间约定文件名必须含角色名动作名帧序号如“warrior_idle_001.png”“warrior_attack_003.png”。禁止用“a1.png”“b2.png”等随意命名。因为后续要用Sprite Editor批量切图命名规则直接决定自动切图的可靠性。我们甚至写了Python脚本校验命名合规性不合规文件自动标红并邮件告警。提示这5条规范不是技术洁癖而是把“美术-程序-QA”三方的沟通成本压到最低。每次美术交图程序只需运行校验脚本5秒内知道是否达标省去反复邮件确认的时间。我经手的项目里规范执行最严的团队素材导入环节耗时比平均少67%。2.2 Sprite Mode深度解析Single/Multiple/Polygon三种模式的本质差异Unity的Sprite Mode选项看似简单实则是2D渲染管线的底层开关。选错模式轻则动画错乱重则内存暴涨。《勇士传说》里我们全程禁用Polygon模式仅用于极少数需要复杂碰撞的特效专注吃透Single和Multiple的适用边界Single模式整张图作为一个Sprite对象。适用于静态背景、UI图标、单帧特效。优势是内存占用最小无额外索引开销加载最快。但致命缺陷是无法做帧动画——你不能让一张1024×1024的背景图自己播放“云朵飘动”序列。我们用它处理游戏主界面的LOGO、技能图标导入后直接拖到Canvas上Inspector里勾选“Read/Write Enabled”即可UI图需要CPU读取像素做动态着色。Multiple模式核心生产力模式。允许你在Sprite Editor里手动或自动切割子图。《勇士传说》所有角色动画都走这条路。关键点在于切割策略自动切割Automatic适合规则网格图如8×8行走帧图。但必须设置正确的“Extrude Edges”边缘扩展像素数否则相邻帧间出现1像素黑线。我们固定设为1因为美术交付时已预留1像素安全边距。手动切割Manual应对不规则动画如Boss变身过程中的扭曲变形帧。这时要打开Sprite Editor的“Grid Mode”用矩形工具逐帧框选。重点观察“Pivot”锚点设置——横版动作游戏锚点必须设为“Bottom”底部中心否则角色跳跃落地时脚部会悬空。我们曾因锚点设成“Center”导致主角踩踏平台时Y轴坐标总差16像素即半张脚图高度排查了6小时才发现是这里错了。Polygon模式自动生成顶点网格用于Sprite Shape或复杂碰撞。但《勇士传说》里我们主动禁用原因有三一是生成的顶点数不可控一张图可能产生2000顶点严重拖慢Draw Call二是编辑器里无法精确调整顶点美术修改原图后需重新生成版本管理混乱三是横版动作游戏的碰撞体90%用BoxCollider2D足够Polygon Collider2D反而因顶点精度问题导致穿模。唯一例外是“熔岩池”地形用Polygon模式描边后挂上CompositeCollider2D性能比多个BoxCollider拼接高40%。注意Mode切换有隐藏成本从Single切到Multiple时Unity会重建Sprite Atlas图集触发全项目资源重编译。我们规定所有角色图首次导入必须直接设为Multiple禁止先用Single测试再改——因为改模式后已引用该Sprite的Prefab会丢失引用需手动修复。这是新人最常踩的坑一次失误可能毁掉半天的Prefab配置。2.3 Pixels Per UnitPPU的物理意义与实测校准法PPU不是美术参数而是Unity世界坐标的标尺。它的数值直接参与所有2D物理计算Rigidbody2D的质量、Collider2D的尺寸、PhysicsMaterial2D的摩擦力系数全基于PPU定义的“单位长度”。设错PPU等于给整个物理系统装了错误的尺子。我们用实测法校准PPU而非依赖美术口头承诺让美术提供一张标准参考图100×100像素的纯红正方形#FF0000命名为“ppu_test.png”。在Unity中导入Sprite Mode设为SinglePPU设为待测值如100。拖入场景添加BoxCollider2D组件勾选“Used by Effector”。新建空物体挂载以下C#脚本using UnityEngine; public class PPUCalibrator : MonoBehaviour { void Start() { SpriteRenderer sr GetComponentSpriteRenderer(); BoxCollider2D bc GetComponentBoxCollider2D(); Debug.Log($Sprite尺寸: {sr.sprite.bounds.size} | Collider尺寸: {bc.size}); Debug.Log($PPU换算误差: {(sr.sprite.bounds.size.x * 100 / bc.size.x):F2}%); } }运行后看Console输出若PPU100正确sr.sprite.bounds.size.x应为1100像素÷100PPUbc.size.x也应为1误差接近0%。若误差5%说明PPU值错误。实测发现美术常犯的错误是“交付图分辨率≠设计分辨率”。比如设计稿按1920×1080做但导出时用了“导出为Web”压缩实际图宽变成1892像素。此时若仍按1920算PPU必然偏差。我们的解决方案是要求美术在PSD源文件里建一个100×100像素的参考图层导出PNG时用“导出为→PNG”而非“存储为Web”并附带一份TXT文档记录“源图尺寸1920×1080导出尺寸1920×1080PPU基准100”。实操心得PPU一旦确定全项目冻结。我们用Unity的AssetPostprocessor脚本做了强制校验——每当新图导入自动读取其像素尺寸计算当前PPU下的理论世界尺寸若与项目基准偏差2%自动弹窗警告并暂停导入。这避免了某次疏忽导入一张PPU32的图污染整个资源库。3. 实操过程与核心环节实现从零开始构建《勇士传说》素材工作流3.1 建立项目级素材目录结构与命名公约Unity的Project窗口不是文件管理器而是资产关系网。混乱的目录结构会让“找一张攻击帧图”变成考古行动。《勇士传说》采用四级物理目录三级逻辑标签的混合结构Assets/ ├── Art/ # 一级大类 │ ├── Characters/ # 二级角色 │ │ ├── Warrior/ # 三级具体角色 │ │ │ ├── Sprites/ # 四级资源类型 │ │ │ │ ├── Idle/ # 动作分类文件夹 │ │ │ │ ├── Run/ # 同上 │ │ │ │ └── Attack/ # 同上 │ │ │ └── Prefabs/ # 角色预制件 │ │ └── Boss/ # 其他角色同理 │ ├── Environment/ # 环境资源 │ │ ├── Backgrounds/ # 背景 │ │ └── Props/ # 道具 │ └── UI/ # UI资源 ├── Scripts/ # 代码 └── Scenes/ # 场景但仅有物理目录不够我们叠加了三层逻辑标签Tag 1PPU标识所有Sprite文件名末尾加_ppu100如warrior_attack_001_ppu100.png。这样在Project窗口搜索“ppu100” instantly过滤出全项目PPU合规资源。Tag 2动作状态标识在Sprite Inspector的“Label”字段填入state:idle、state:attack。配合Unity的Search功能搜l:state:idle就能列出所有空闲帧。Tag 3版本标识美术每次修改图文件名加_v2、_v3旧版保留但加_deprecated后缀。避免“覆盖式更新”导致历史版本丢失。这套结构经受住了《勇士传说》200角色动画、50场景背景的考验。最直观的好处是新成员入职第一天不用看文档直接在Project窗口输入l:state:attack3秒内看到所有攻击帧立刻理解项目规范。3.2 Sprite Editor全流程实战从切图到锚点的毫米级控制Sprite Editor是Unity 2D的灵魂工具但多数人只会点“Slice→Automatic”。《勇士传说》的切图流程包含7个必做步骤缺一不可预处理启用“Show Grid”和“Snap to Pixel”在Sprite Editor右上角勾选这两项。Grid Size设为16×16匹配我们角色图的像素网格确保切割框边缘严格对齐像素。Snap to Pixel开启后拖动切割框时自动吸附到最近像素点杜绝0.3像素偏移。切图模式选择按动作序列智能分割行走帧8方向用“Grid By Cell Size”Cell Size设为128×128角色图标准尺寸Padding设为1。攻击帧不规则长度用“Grid By Cell Count”Count设为动画总帧数如12帧Width设为图宽Height自动计算。受击抖动帧单列多行用“Grid By Cell Size”但Height设为单帧高度如64Width设为图宽让每行切出一帧。锚点Pivot重置底部中心是黄金法则切完所有子图后全选CtrlA右键→“Pivot→Bottom”。为什么不是Center因为横版动作游戏的Y轴运动逻辑角色站立时脚底Y0跳跃时脚底Y随时间变化。若锚点在Center脚底Y坐标角色Y坐标-半高所有物理计算需额外减法极易出错。Bottom锚点让脚底Y坐标角色Y坐标物理系统直连。边界Border设置为9切片和动态缩放留余量选中所有子图右下角“Border”区域Top/Bottom/Left/Right全设为4。这4像素是安全边距防止Sprite Renderer缩放时边缘像素被裁剪。尤其对UI按钮、血条等需缩放的元素没这4像素放大后边缘会露白。轮廓Outline生成解决Unity阴影问题的前置条件勾选“Generate Outline”Tolerance设为0.1。这会在Sprite内部生成顶点轮廓供Shadow Caster 2D组件使用。实测发现未生成Outline的Sprite投射软阴影时边缘有明显锯齿生成后锯齿消失且阴影过渡更自然。这是解决“unity阴影问题”最有效的低成本方案。应用前校验用“Preview”模式肉眼检查切换到Preview标签页拖动滑块播放动画序列。重点检查三点帧间衔接是否平滑有无跳帧锚点位置是否始终在脚底观察红点是否稳定在底部中心边界是否完整放大到400%看四周边缘有无黑线批量应用与版本固化点击“Apply”Unity会生成Sprite Asset。此时立即在Project窗口右键该Sprite→“Reimport”强制刷新所有引用。最后用Git提交时务必勾选“Assets/Art/Characters/Warrior/Sprites/Attack/”整个文件夹确保切图元数据.meta文件同步否则协作时队友看到的是未切割的原始图。注意Sprite Editor的修改是实时的但“Apply”后才写入.meta文件。曾有同事切完图没点Apply就关编辑器以为完成了结果第二天打开还是原始状态——所有操作白费。我们把“Apply”按钮旁贴了张便签“切完必点点了才存”。3.3 解决Unity Renderer包围盒异常的3种根治方案“Unity renderer的包围盒”问题在横版游戏中高频出现角色移动时Collider2D的包围盒Bounds和Sprite Renderer的视觉范围不一致导致“打中了却没伤害”或“没碰到却触发碰撞”。根源在于Unity的Renderer Bounds计算逻辑——它基于Sprite的UV坐标和Mesh顶点而非像素图本身。以下是三种经实战验证的根治方案方案1强制同步Bounds推荐新手在角色控制器脚本中每帧调用void LateUpdate() { SpriteRenderer sr GetComponentSpriteRenderer(); BoxCollider2D bc GetComponentBoxCollider2D(); // 强制Collider尺寸匹配Sprite视觉尺寸 bc.size new Vector2( sr.sprite.bounds.size.x * transform.localScale.x, sr.sprite.bounds.size.y * transform.localScale.y ); }原理sr.sprite.bounds.size返回Sprite在世界坐标系的尺寸已按PPU换算乘以本地缩放得到实际视觉宽高。此方案简单粗暴但每帧计算有微小开销适合原型阶段快速验证。方案2预计算Bounds并缓存推荐正式版在角色初始化时Awake一次性计算void Awake() { SpriteRenderer sr GetComponentSpriteRenderer(); BoxCollider2D bc GetComponentBoxCollider2D(); // 缓存Sprite原始尺寸单位Unity世界单位 Vector2 spriteSize sr.sprite.bounds.size; // 根据角色朝向预设左右翻转时的Collider尺寸 bc.size spriteSize; // 若支持镜像翻转此处可存两套尺寸 }优势零运行时开销且能处理镜像翻转FlipX时Collider自动适配。我们为《勇士传说》所有角色都用了此方案性能提升明显。方案3用CompositeCollider2D替代BoxCollider2D推荐复杂角色对Boss等多部件角色放弃单一BoxCollider改用CompositeCollider2D将角色拆分为“身体”“手臂”“武器”三个Sprite子对象每个子对象挂BoxCollider2D并勾选“Used by Composite”在根对象挂CompositeCollider2DType设为“Polygon”运行时自动合并为一个优化的多边形Collider实测表明CompositeCollider2D的包围盒精度比BoxCollider2D高3倍且Draw Call不增加Unity内部优化。这是解决“unity renderer的包围盒”问题的终极方案但需美术配合分层交付。实操心得包围盒问题90%源于PPU不一致或锚点错误。我们建立了一套“三查机制”查PPU导入时校验脚本、查锚点Sprite Editor里全选检查Pivot、查ColliderScene视图中勾选Gizmos→Colliders三者全绿才允许进入测试环节。4. 常见问题与排查技巧实录横版游戏素材导入的12个真实踩坑现场4.1 问题速查表症状、根因、解决方案三栏对照症状根因解决方案角色移动时边缘闪烁/撕裂Sprite Mode设为Single但实际需Multiple动画重设Mode为Multiple → Sprite Editor中重新切图 → Apply攻击帧播放顺序错乱如001,003,002文件名未按数字顺序排列Unity按字典序排序重命名文件为attack_001、attack_002…禁用attack_1、attack_2阴影边缘有明显锯齿未在Sprite Editor中生成Outline或Alpha通道非Premultiplied重新打开Sprite Editor → 勾选Generate Outline → 确认Alpha为Premultiplied格式角色在平台边缘“悬浮”0.5单位Pivot锚点设为Center而非Bottom或PPU计算偏差Sprite Editor中全选 → Pivot→Bottom用PPU校准脚本复测UI血条与角色头顶不对齐UI Canvas的Render Mode为Screen Space - Overlay未切换为World Space新建World Space Canvas → 调整Plane Distance匹配角色Y坐标打包微信小游戏后动画变慢微信小游戏平台默认关闭VSyncTime.timeScale未适配在Awake中添加Application.targetFrameRate 60;并用Time.deltaTime替代Time.fixedDeltaTimePico4设备上角色模型扭曲Pico4的OpenXR插件与Unity 2022的URP管线兼容性问题降级至Unity 2021.3.25f1 URP 12.1.10或改用Built-in RP桌面端游戏窗口拉伸时UI模糊Canvas Scaler的UI Scale Mode设为Constant Pixel Size改为Scale With Screen SizeReference Resolution设为1920×1080Screen Match Mode设为Expand角色被障碍物遮挡时武器特效也消失武器Sprite与角色Sprite未分层共用同一Sorting Layer美术重交分层图 → Unity中为武器Sprite设置更高Sorting Order发布WebGL后纹理全黑WebGL平台不支持Texture Compression格式ETC2/ASTCProject Settings→Player→Other Settings→Color Space改为GammaTexture Compression设为DisabledAnimator中动画帧跳变Animation Clip的Sample Rate过低默认60但角色图帧率是120fps在Animation窗口右键Clip→Edit Clip→提高Sample Rate至120角色移动时碰撞体“抖动”Rigidbody2D的Interpolate设为None未开启插值Rigidbody2D组件中Interpolate设为Interpolate位置插值或Extrapolate预测插值4.2 独家避坑技巧来自三年横版游戏开发的血泪经验技巧1用“Sprite Atlas”预编译替代运行时打包新手常把所有图扔进Resources文件夹用Resources.LoadSprite动态加载。这会导致内存碎片化且无法利用Unity的Sprite Atlas自动合图。正确做法创建Sprite Atlas资源Assets/Create/2D/Sprite Atlas将同场景使用的Sprite拖入Atlas的Objects for Packing列表勾选“Include in Build”设置Padding为4在Sprite Inspector中Texture Type设为Sprite (2D and UI)Sprite Mode设为SinglePacking Tag填Atlas名运行时用Addressables.LoadAssetAsyncSprite加载需引入Addressables包实测Atlas合图后Draw Call减少58%内存占用下降33%。这是解决“unity游戏优化”中2D性能瓶颈的核心手段。技巧2为微信小游戏定制导出参数“unity微信小游戏视频播放方案”常被忽视的一点微信小游戏环境不支持VideoPlayer组件的硬件解码。必须视频转为WebM格式FFmpeg命令ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webmUnity中VideoClip Import SettingsCompression Format设为WebMQuality设为70播放时用VideoPlayer.playOnAwake false手动调用Play()避免启动卡顿技巧3Pico4开发的Unity版本锁死清单根据Pico官方SDK 5.3.0文档严格匹配Unity 2021.3.25f1LTS版稳定性最高XR Plugin Management 4.2.1Pico XR SDK 5.3.0Build Target设为AndroidArchitecture选ARM64任何版本越界都会触发“Failed to initialize OpenXR runtime”错误。我们建了个Jenkins自动化脚本每次CI构建前校验Unity版本不匹配直接中断。技巧4解决“unity混淆”导致的动画丢失微信小游戏打包开启代码混淆后Animator Controller引用的Animation Clip可能被重命名。解决方案在Player Settings→Publishing Settings→Managed Stripping Level设为Low所有Animation Clip资源名加前缀anim_如anim_warrior_idle并在代码中用Resources.LoadAnimationClip(anim_warrior_idle)显式加载禁用IL2CPP的Linker避免剪裁Animation相关反射API最后分享个小技巧我们给每个角色文件夹配了个README.md里面用表格写明“PPU值、锚点位置、Collider尺寸、Sorting Layer名称”。新成员打开Project窗口一眼看到Warrior/README.md30秒内掌握全部导入规范。这比写10页Wiki文档更有效——因为开发者只看代码和资源不看文档。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

C++内存管理 + 模板 2026/9/30 10:40:56

C++内存管理 + 模板

༺ 个人主页 纪念229 ༻ 🏠我的博客主页🏠 ༒专栏目录:《数据结构》༒ ༒专栏目录:《算法》༒ ༒专栏目录:《C》༒ ༒专栏目录:《MySQL数据库》༒ ༒专栏目录:《前端开发》༒ ༒其它有趣…

阅读更多 →
常用导数公式全总结:从基础到进阶的求导指南 2026/9/30 10:40:49

常用导数公式全总结:从基础到进阶的求导指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
H3C交换机巡检命令详解:11条display命令清单与脚本批量巡检实践 2026/9/30 10:40:49

H3C交换机巡检命令详解:11条display命令清单与脚本批量巡检实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
第一个 Qt 程序:环境配置、编译排错与打包发布指南 2026/9/30 10:40:49

第一个 Qt 程序:环境配置、编译排错与打包发布指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
读懂 Mellanox 适配器 PRM:寄存器、命令接口与驱动开发实战 2026/9/30 10:40:49

读懂 Mellanox 适配器 PRM:寄存器、命令接口与驱动开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从熟悉度错觉到数据看板:ECharts+Python 可视化复习系统 2026/9/30 10:40:49

从熟悉度错觉到数据看板:ECharts+Python 可视化复习系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉