Unity SpriteShape Profile:2D地形设计的核心工具与实战配置指南
1. 项目概述为什么SpriteShape Profile是2D地形设计的“利器”如果你正在用Unity做2D游戏尤其是平台跳跃、横版卷轴或者需要丰富地形变化的项目那么“地形设计”绝对是你绕不开的核心环节。传统的做法是什么用一堆零散的Sprite瓦片Tilemap去拼或者用多边形碰撞体Polygon Collider去手动勾勒复杂的地形轮廓。前者在制作平滑曲线、斜坡时效率低下且效果生硬后者则对美术和程序都是巨大的折磨调整起来极其繁琐。这正是“SpriteShape Profile”这个工具要解决的痛点。简单来说SpriteShape Profile是Unity内置的一个强大工具它允许你像在矢量绘图软件比如Adobe Illustrator里画贝塞尔曲线一样去“绘制”你的2D地形。你只需要定义几个关键的控制点它就能自动生成平滑、连续的地形轮廓并且自动适配碰撞体和渲染精灵。这不仅仅是“方便了一点”而是将地形设计从“像素级拼贴”提升到了“矢量级设计”的维度。我接手过不少从Tilemap重构到SpriteShape的项目效率提升和效果优化都是肉眼可见的。它特别适合需要大量自然地形如起伏的山丘、蜿蜒的河流、不规则的平台的游戏能让你把精力从“怎么拼出来”转移到“怎么设计得更酷”上。2. SpriteShape Profile核心组件与工作流拆解要玩转SpriteShape首先得理解它的几个核心组件是如何协同工作的。很多人一开始会被各种Profile、Renderer搞晕其实逻辑很清晰。2.1 核心三剑客Profile, Controller, Renderer一个完整的SpriteShape地形通常由三个部分构成SpriteShape Profile资产、SpriteShape Controller组件和SpriteShape Renderer组件。它们的关系就像剧本、导演和演员。SpriteShape Profile这是核心的“蓝图”或“配方”。它是一个.asset文件保存在你的项目资源库里。Profile里定义了地形边缘和填充所使用的精灵Sprites、渲染的材质、碰撞体类型、以及最重要的——控制点Control Point的行为规则。你可以把它理解为一个预设好的“地形风格包”比如“草地悬崖风格”、“砖石平台风格”或“熔岩河流风格”。创建一个好的Profile是高效复用地形资源的关键。SpriteShape Controller这是附着在场景中GameObject上的组件是地形的“大脑”。它持有对某个SpriteShape Profile的引用并管理着构成地形的所有控制点Control Points的数据。你通过编辑Controller上的控制点在场景视图中直接拖拽来实时改变地形的形状。Controller负责根据Profile的规则计算如何生成最终的网格Mesh和碰撞体。SpriteShape Renderer同样附着在GameObject上是地形的“画师”。它接收Controller计算生成的网格数据并使用Profile中指定的材质和精灵进行渲染。它负责将矢量的控制点数据最终变成屏幕上看到的精美图像。工作流通常是先在Project窗口创建或选择一个SpriteShape Profile并进行配置然后在场景中创建一个空的GameObject为其添加SpriteShape Controller组件添加时会自动附带SpriteShape Renderer接着在Controller组件上拖入配置好的Profile最后在场景视图中进入编辑模式通过添加、移动控制点来塑造地形。2.2 从零开始创建一个基础地形Profile让我们动手创建一个最基础的“泥土草地”地形Profile。打开Unity在Project窗口右键 - Create - 2D - SpriteShape Profile。我习惯以“SSP_”开头命名比如SSP_Grass_Dirt方便管理和搜索。创建后双击打开你会看到SpriteShape Profile的配置窗口。这里有几个关键区域填充Fill决定地形内部的填充方式。对于大多数实体地形我们需要勾选Enable Fill。然后需要指定一个Fill Texture。这里有个关键技巧这个纹理需要是**可平铺Tiled**的。你需要准备一张无缝衔接的泥土或草地的纹理图。在Fill Offset和Fill Scale可以调整填充纹理的偏移和缩放这对于匹配地形大小和避免纹理拉伸很重要。边角类型Corner这决定了当两个线段以锐角或直角相交时连接处的精灵如何显示。通常我们选择Sprite模式然后为Left和Right角分别指定精灵。例如为“草地覆盖泥土”的地形左边角Left可以指定一个草皮向左延伸的精灵右边角Right指定一个草皮向右延伸的精灵。这样在平台边缘会自动呈现出草皮覆盖的效果。边Edge这是最重要的部分定义了地形轮廓边缘的显示规则。你需要为Left和Right边指定一个精灵序列。这个精灵通常是一个长条状的、可以沿曲线拉伸的精灵比如一块草皮。Unity会沿着你绘制的控制点曲线自动拉伸和弯曲这个精灵来贴合形状。碰撞Collision在这里选择生成的碰撞体类型。对于2D地形最常用的是Polygon Collider 2D多边形碰撞体。SpriteShape的强大之处在于它能根据你绘制的平滑轮廓自动生成匹配的、同样平滑的多边形碰撞体这是手动摆放Tilemap或编辑Polygon Collider难以做到的。注意你为边Edge和角Corner指定的精灵其轴心点Pivot非常关键。通常边缘精灵的轴心点应该设在精灵的底部中心这样它才能正确地“站立”在你绘制的轮廓线上。角精灵的轴心点则通常设在精灵的角落。如果精灵显示位置不对首先检查并调整精灵的轴心点设置。3. SpriteShape Profile配置参数深度解析配置一个Profile不仅仅是拖几个精灵进去那么简单每个参数背后都影响着最终的表现和性能。理解它们你才能做出既好看又高效的地形。3.1 控制点Control Point的四种模式与实战应用控制点是塑造地形的“手”。在SpriteShape Controller的编辑模式下每个控制点都有四种模式通过快捷键M循环切换或者在控制点的属性面板中设置。这四种模式决定了线段之间的连接是直的还是曲的是地形平滑与否的关键。线性Linear这是默认模式。控制点之间以直线连接。适合制作平台、墙壁等有棱有角的部分。它的计算最简单性能开销最小。连续Continuous这是制作平滑曲线的核心模式。在该模式下控制点拥有贝塞尔曲线的切线手柄并且两边的切线是连续且对称的。拖动一个手柄另一侧会联动保证曲线在该点处平滑过渡。这是制作圆滑山丘、洞穴穹顶最常用的模式。断开Broken同样提供贝塞尔切线手柄但左右两侧的切线是独立的可以分别调整。这让你能在同一个控制点处创建出“尖角”或不对称的曲线。比如你想做一个顶部是平滑圆弧但底部突然陡峭的悬崖就可以在顶点使用断开模式。镜像Mirrored与连续模式类似切线也是联动的但它强制两侧的切线长度相等形成完美的镜像对称。适合制作完全对称的拱形、波浪等形状。实操心得在绘制长距离的平滑地形时我倾向于先用少量控制点在“连续”模式下拉出大致的平滑曲线然后再根据需要添加细节控制点进行微调。避免在一开始就使用过多控制点那样会导致曲线难以控制也增加不必要的性能负担。记住一个原则用最少的控制点表达最丰富的形状。3.2 精灵平铺、拉伸与角度校正当你为Edge指定了一个精灵后Unity如何将这个精灵“贴”到不断变化的曲线上呢这里涉及到两个关键参数Stretch Tessellation和Sprite Render Mode。Stretch Tessellation拉伸细分这个选项决定了沿曲线分布的精灵数量。如果不勾选Unity会尝试在控制点之间放置整数个完整的精灵多出来的空间可能会被拉伸或压缩导致纹理变形。如果勾选Unity会根据曲线的长度动态细分网格使指定的精灵纹理能够完美地、均匀地拉伸以适应整个曲线长度纹理不会重复而是被拉伸。对于需要纹理连续、无重复图案的边缘比如一道光滑的金属边框勾选此选项是合适的。但对于草地、石头这类需要自然重复图案的边缘则不勾选让精灵重复平铺更好。Sprite Render Mode精灵渲染模式主要有Stretch拉伸和重复两种。在Stretch模式下一个精灵图像会被拉伸以填充两个控制点之间的整个线段这通常用于需要特定图案如一个完整的拱门装饰精确适配某段距离的情况。在重复模式下精灵会沿着线段重复平铺这是制作自然地形边缘如连绵的草皮的标准选择。你需要根据Edge精灵的设计来抉择。角度校正Angle Range这是一个高级但极其有用的功能。在Profile的Edge设置中你可以为同一个边设置多个不同的精灵并指定它们出现的角度范围。例如对于悬崖边你可以准备三个精灵一个用于水平地面角度0°附近一个用于45度斜坡一个用于垂直墙壁角度90°附近。然后通过设置角度范围如0-22.5°用地面精灵22.5-67.5°用斜坡精灵67.5-90°用墙壁精灵SpriteShape就能根据线段的实际角度自动切换精灵让地形表现更加智能和真实。3.3 碰撞体与物理材质配置SpriteShape可以自动生成2D碰撞体这省去了大量手动调整碰撞边界的痛苦工作。碰撞体类型如前所述Polygon Collider 2D是最常用的。你也可以选择Edge Collider 2D边缘碰撞体它只生成开放边缘的碰撞适合制作只有单边碰撞的平台比如平台跳跃中可以从下方跳上去的平台。在Controller的Collision折叠菜单下可以设置Offset碰撞体偏移和Detail碰撞体细节即生成多边形的精度。碰撞体细节Detail这个参数控制着生成的碰撞体多边形有多少个顶点来模拟曲线。值越高碰撞体越贴合视觉上的平滑曲线但顶点数越多物理计算开销也越大。对于移动平台或性能敏感的项目需要在这里做权衡。我的经验是对于大多数情况默认值0.5或稍低一点0.3已经能提供足够精度的碰撞同时保持良好性能。只有在对碰撞精度要求极高的场景比如高速子弹需要精确擦过弧形边缘才需要调高这个值。物理材质2DPhysics Material 2D你可以在Controller上挂载一个Physics Material 2D来定义地形的摩擦力和弹性。这对于实现“冰面”低摩擦力、“蹦床”高弹性等不同物理特性的地形至关重要。确保你的地形GameObject也有Rigidbody 2D组件通常设置为Static静态物理交互才会生效。4. 高级技巧与性能优化实战掌握了基础我们来看看如何用SpriteShape Profile玩出花样并确保它不会成为性能瓶颈。4.1 多层地形与深度排序Sorting Layers/Order in Layer复杂的2D场景往往有多个地形层比如前景的栏杆、中景的地面、背景的远山。SpriteShape完美支持Unity的2D渲染排序系统。每个SpriteShape Renderer组件上都有Sorting Layer和Order in Layer属性。你可以创建多个Sorting Layer如“Background”, “Midground”, “Foreground”并将不同的SpriteShape地形分配到不同的层中。在同一层内用Order in Layer的数值来精确控制渲染前后顺序数值大的渲染在数值小的前面。一个高级技巧是利用多个SpriteShape Controller组合复杂地形。例如一个城堡关卡城墙主体用一个Profile城墙上的垛口和装饰用另一个更精细的Profile分别放在不同的GameObject上通过Sorting Order让装饰渲染在主体之上。这样不仅管理清晰也方便单独调整或动画化某一部分。4.2 使用脚本动态生成与修改地形SpriteShape的强大之处还在于其可编程性。你可以通过脚本在运行时动态创建或修改地形实现诸如“可破坏的地形”、“随着游戏进程生长蔓延的藤蔓”等效果。核心是操作SpriteShapeController的spline属性。spline是一个包含了所有控制点信息的类。你可以通过代码添加、删除控制点或者修改现有控制点的位置和模式。using UnityEngine; using UnityEngine.U2D; // 需要引用这个命名空间 public class DynamicTerrain : MonoBehaviour { private SpriteShapeController shapeController; void Start() { shapeController GetComponentSpriteShapeController(); if (shapeController ! null) { // 获取Spline对象 Spline spline shapeController.spline; // 清空现有控制点可选 // spline.Clear(); // 在指定位置插入一个新的线性控制点 spline.InsertPointAt(0, new Vector3(0, 0, 0)); // 索引位置 spline.SetTangentMode(0, ShapeTangentMode.Linear); // 设置该点模式为线性 // 插入第二个点并设置为连续曲线模式 spline.InsertPointAt(1, new Vector3(5, 2, 0)); spline.SetTangentMode(1, ShapeTangentMode.Continuous); spline.SetLeftTangent(1, new Vector3(-1, 0, 0)); // 设置左侧切线 spline.SetRightTangent(1, new Vector3(1, 0, 0)); // 设置右侧切线 // 重要修改Spline后必须调用此方法来更新碰撞体和渲染 shapeController.UpdateSpriteShapeGeometry(); } } }通过循环和算法如Perlin噪声你可以用脚本生成出无限、随机的自然地形极大地扩展了游戏的可能性。4.3 性能优化要点与常见陷阱SpriteShape虽然方便但如果使用不当也可能成为性能杀手。以下是几个关键的优化点控制点数量最小化这是最重要的原则。每个控制点都会增加生成的网格顶点数和碰撞体顶点数。在能满足形状要求的前提下尽可能使用最少的控制点。用“连续”模式的一个控制点往往能替代“线性”模式的多个控制点。碰撞体细节Detail优化如前所述在Controller的碰撞设置中降低Detail值可以显著减少碰撞体多边形的顶点数对物理性能提升明显。在看不到的、或者玩家交互不频繁的远景地形上可以大胆调低。合并SpriteShape如果场景中有大量小的、分离但使用相同Profile的地形块考虑是否可以将它们合并成一个大的SpriteShape物体。减少GameObject的数量对降低Draw Call绘制调用有好处。但要注意权衡合并后可能会影响局部裁剪Culling效率。纹理图集Sprite Atlas确保你用于Edge、Corner和Fill的精灵都被打包进了同一个Sprite Atlas中。这能确保Unity在一次Draw Call中绘制整个SpriteShape而不是为每个精灵单独发起调用对渲染性能至关重要。避免过度重叠的填充如果地形非常复杂内部填充Fill生成的网格可能会很密集。对于不需要精细内部视觉的地形比如被上层精灵完全覆盖可以考虑在Profile中关闭Enable Fill或者使用一个非常低分辨率的填充纹理。5. 常见问题排查与解决方案实录在实际项目中你肯定会遇到一些SpriteShape的“坑”。这里记录了几个最常见的问题和我的解决方法。5.1 问题地形边缘精灵显示破碎、拉伸或重复不正确可能原因及排查精灵轴心点Pivot错误这是最常见的原因。检查你为Edge指定的精灵其轴心点是否在底部中心。在Sprite Editor中将其设置为Bottom。纹理导入设置问题确保精灵的纹理类型是Sprite (2D and UI)并且Mesh Type是Full Rect默认。如果精灵是图集的一部分确保图集生成正确。Profile中的平铺设置检查Stretch Tessellation和Sprite Render Mode设置是否符合你的预期。想要平铺效果就不要勾选拉伸细分并选择重复模式。控制点过于密集如果两个控制点距离太近小于精灵的宽度可能会导致渲染错误。尝试删除一些不必要的控制点或拉大点距。5.2 问题碰撞体不准确穿模、卡住或根本没有碰撞可能原因及排查未生成碰撞体确认Profile中Collision部分已勾选Generate Collider并选择了正确的类型如Polygon Collider 2D。同时场景中的SpriteShape Controller组件上Collision下的Update Collider选项需要勾选。碰撞体细节Detail太低如果曲线很平滑但Detail值设得很低生成的碰撞体多边形会过于“棱角化”导致视觉上是曲线碰撞却是多边形造成穿模。适当提高Detail值。碰撞体偏移Offset问题检查Controller上Collision Offset值。正值会使碰撞体向外扩张负值向内收缩。如果你发现角色总是离地形有一点距离就停下或者能稍微嵌进地形可以微调这个值。Layer碰撞矩阵确保你的SpriteShape物体所在的Layer与玩家角色等物体的Layer在Physics 2D Settings的碰撞矩阵中是相互勾选的。这是新手最容易忽略的一点。5.3 问题在脚本中修改Spline后地形没有更新解决方案这是一个必须记住的步骤。在通过代码修改了shapeController.spline的任何属性点位置、切线、模式之后必须手动调用shapeController.UpdateSpriteShapeGeometry()或shapeController.UpdateSpriteShapeParameters()。前者会强制重新生成整个几何体和碰撞体后者只更新参数如Profile引用变化。大多数情况下调用UpdateSpriteShapeGeometry()是最稳妥的。5.4 问题使用SpriteShape后游戏包体Build变大或出现奇怪错误可能原因这有时与Unity版本和SpriteShape的Shader变体有关。SpriteShape可能会为不同的配置生成很多Shader变体如果打包设置没有处理好会导致包体膨胀。建议确保你使用的Unity版本是长期支持版LTS并且SpriteShape包通常是2D SpriteShape包更新到最新版本。在Player Settings的Graphics设置中查看和处理Shader变体。可以考虑编写一个自定义的Shader变体收集工具或者在打包前进行合理的Shader预编译。如果遇到编辑器下正常打包后黑屏或地形不显示检查打包时是否包含了SpriteShape所需的Shader。通常需要确保Project Settings - Graphics中的Always Included Shaders列表包含了Sprites-Shape等相关Shader。SpriteShape Profile是一个需要稍加练习才能完全掌握的工具但一旦你熟悉了它的逻辑和这些技巧制作2D地形的效率和效果都会有质的飞跃。它把设计师从繁琐的技术实现中解放出来更能专注于创造力的发挥。我个人在项目中的体会是花时间精心配置好几个高质量的Profile模板能为整个团队在后续开发中节省数百小时的工作量。

相关新闻

嵌入式应届生简历优化指南:从STM32到Linux驱动的真实项目经验构建

嵌入式应届生简历优化指南:从STM32到Linux驱动的真实项目经验构建

对于嵌入式应届生来说,没有实际项目经验确实是一个常见的痛点。很多同学在毕业季面临就业压力时,会考虑通过"包装简历"来弥补项目经验的不足。但这里需要明确区分:合理的项目包装和虚假简历是完全不同的概念。 合理的项目包装指的…

2026/7/19 8:38:28 阅读更多 →
客户分群实战指南:从数据清洗到可行动分群的六步工作流

客户分群实战指南:从数据清洗到可行动分群的六步工作流

1. 这不是“AI营销”的空泛概念,而是我亲手跑通的客户分群实战路径 你可能已经听过太多次“用AI做营销分析”这种说法——它听起来很酷,但落地时往往卡在第一步:不知道从哪下手,更不清楚那些聚类、标准化、PCA到底在解决什么真实问…

2026/7/19 8:38:28 阅读更多 →
NHSE动物森友会存档编辑器:3小时掌握终极岛屿改造技巧

NHSE动物森友会存档编辑器:3小时掌握终极岛屿改造技巧

NHSE动物森友会存档编辑器:3小时掌握终极岛屿改造技巧 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 还在为《集合啦!动物森友会》中繁琐的收集和漫长的岛屿改造而烦恼吗&…

2026/7/19 8:38:28 阅读更多 →

最新新闻

从设计 Token 到代码的类型安全:TypeScript 类型推导与自动补全

从设计 Token 到代码的类型安全:TypeScript 类型推导与自动补全

从设计 Token 到代码的类型安全:TypeScript 类型推导与自动补全 一、"这段代码里 var(--color-primary) 打错了,但没人知道" 在组件中使用 CSS 变量时打成了 var(--color-primay)。CSS 没有类型检查——属性值错了就是错了,浏览器静…

2026/7/19 19:10:19 阅读更多 →
J-Scope的RTT模式

J-Scope的RTT模式

目录前言环境:芯片:Keil:V5.35.0.2一、代码准备通过网盘分享的文件:Jscope.7z链接:https://pan.baidu.com/s/1y_KDlPv8L8A1YQNjoGFWmg?pwd5q2g 提取码:5q2g 复制这段内容后打开百度网盘手机App,操作更方便哦将文件下载…

2026/7/19 19:10:19 阅读更多 →
YimMenu完整教程:5步打造GTA5最强游戏菜单与防护系统

YimMenu完整教程:5步打造GTA5最强游戏菜单与防护系统

YimMenu完整教程:5步打造GTA5最强游戏菜单与防护系统 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…

2026/7/19 19:10:19 阅读更多 →
3步解锁AMD Ryzen隐藏性能:SMUDebugTool免费开源调试工具终极指南

3步解锁AMD Ryzen隐藏性能:SMUDebugTool免费开源调试工具终极指南

3步解锁AMD Ryzen隐藏性能:SMUDebugTool免费开源调试工具终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址:…

2026/7/19 19:10:19 阅读更多 →
PEunion高级配置:图标、版本信息和清单的自定义方法

PEunion高级配置:图标、版本信息和清单的自定义方法

PEunion高级配置:图标、版本信息和清单的自定义方法 【免费下载链接】pe-union Crypter, binder & downloader with native & .NET stub, evasive by design, user friendly UI 项目地址: https://gitcode.com/gh_mirrors/pe/pe-union PEunion是一款…

2026/7/19 19:09:19 阅读更多 →
如何通过AutoClicker鼠标自动化工具提升10倍工作效率?

如何通过AutoClicker鼠标自动化工具提升10倍工作效率?

如何通过AutoClicker鼠标自动化工具提升10倍工作效率? 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker 在数字工作流程中,重复性鼠标…

2026/7/19 19:09:19 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻