做数字孪生和大型原型项目时,最折磨人的不是核心玩法也不是业务逻辑,而是场景里那一堆“必须要有、但不值得花一周去精修”的填充资产:路边的石碑、工地上的铁皮箱、园区的矮墙、建筑屋顶的模块、VR 里需要重复摆放的管道件。以前遇到这种需求,我一般三个选择:素材商城翻半天、让美术组加班、或者自己硬着头皮做低模。素材商城风格难统一,美术组排期排不上,自己动手做二十个资产包,两周就没了。
后来我把流程改成用 Tripo 批量生成模块化资产包,再统一导入 Unity 做标准化装配,效率提升非常明显。同样是二十个道具和建筑小件,从生成、清理到进 Unity 拼装,两天内能跑完第一版。这篇文章我就把整套流程拆开讲一遍,包括资产包怎么规划、批量生成时提示词和筛选怎么做、Blender 脚本化清理的细节、以及 Unity 导入后那些“不说你绝对会踩”的坑。独立游戏、数字孪生、VR 和微信小游戏项目的场景填充需求,这套流程基本都能覆盖。
1. 方案选型:为什么用 Tripo 做批量资产生成
1.1 传统资产生成流程的痛点
先说痛点。场景填充类资产有几个特点:数量大、结构相对简单、但风格必须统一。拿一个村庄场景举例,光墙面模块就要按长度拆三四种规格,再加柱子、门框、窗沿、屋顶、灯柱、杂物,加起来随随便便二十到三十个独立模型。传统做法是一步步手动建模,哪怕每个模型只花两三小时,累计工时也非常可观,而且人一疲劳,比例和细节很容易飘。
用素材商城资产呢,问题出在风格一致性和授权边界。不同作者做的“石头墙”,一个偏写实一个偏风格化,放在同一场景里非常突兀。还有模型拓扑和面数预算是为别人的项目设计的,导入后往往要做二次调整。至于外包,除非项目预算充足,否则这种填充资产的优先级永远排到最后。
1.2 Tripo 在批量生成上的切入点
Tripo 这类 AI 3D 生成工具,最大的价值不是“替代建模师”,而是把生成单个模型的时间压缩到分钟级,并且天然支持多个任务并行。你说要一个“中世纪石墙模块”,它出图很快;你说要“二十个不同风格的栅栏模块”,它也照样一批批吐出来。过去“生成一堆模型”是奢侈的,现在成了可以批量执行的流水线。
Tripo 的输出格式通常涵盖 glTF、OBJ、FBX,并且附带 PBR 贴图通道。换到模块化资产场景里,这意味着每个生成结果都自带 albedo、normal、roughness 这类基础通道,省掉了从零搭建材质球的时间。再加上它有可编程的 API,适合把“生成—下载—清理—导入”串成自动化脚本,这是它和其他同类工具比较下来最适合做批量的原因。
1.3 这套流程最适合哪些项目
我在实际项目里验证过的使用场景大概有三类:
第一类是数字孪生和园区可视化,这类项目往往有大量建筑、设备、绿植的重复摆放需求,模型精度要求中等,但对“数量多、长得像”的要求很高。用 Tripo 生成一批风格一致的模块,再在 Unity 里通过旋转、缩放排列组合,能快速铺满一个大场景。
第二类是独立游戏和内容原型,团队通常没有专门的美术,或者美术资源都在核心角色上。用 AI 生成场景填充物,先把玩法跑通,后续再人工替换精模,这条路径对开发节奏特别友好。
第三类是 VR 和移动端项目,比如 Pico 4 或微信小游戏,这类平台包体容量和渲染性能都有限,反而需要面数可控、纹理不夸张的低模资产。Tripo 生成的模型经过减面和纹理压缩后,刚好能塞进这个性能区间。
2. 模块化资产包设计:动手生成之前先想清楚的事
2.1 模块化拆分的核心逻辑
很多人以为模块化就是把模型拆零碎,拆得越碎复用性越强。这种思路在代码里成立,在 3D 资产里却容易翻车,因为每个独立网格都是一次材质和 Draw Call 的开销。我做模块化资产包时,核心原则是三个:可复用、可组合、可替换。
可复用,意思是拆出来的每个模块必须能出现在至少两个不同的组合结果里。一个“标准石墙段”既能在 5 米围墙里出现,也能在 8 米建筑外墙里出现,这才叫复用。如果一个零件只在一个地方用一次,那它就不该被模块化,直接做成独有资产就行。
可组合,指的是模块之间必须有统一的接口。接口在这里不是代码里的 API,而是尺寸、轴心、旋转基准这些几何属性。所有墙段高度必须一致,所有柱子直径必须一致,所有门窗洞口的尺寸必须对齐。否则资产包建完,拼装时每个模块都得手动微调位置,效率反而比不拆分还低。
可替换,是说资产包内部要维持风格一致性。批量生成时可以给每个模块的提示词加上统一的风格后缀,确保石墙、屋顶、柱子的材质描述语气一致,后期替换某个模块时不会产生风格割裂感。
在具体拆解时,我会按“基础模块—组合模块—装饰模块”三层来规划。基础模块是墙段、地面板、柱子这类纯几何件;组合模块是门+门框、窗+窗台这种几件套;装饰模块则是灯具、藤蔓、杂物等氛围件。生成时先跑基础模块,再跑组合模块,装饰模块放在最后,优先级一目了然。
2.2 统一比例和轴心的关键手段
Tripo 这类工具没有真正的“米”的概念,你告诉它“2 米长的石墙”,它输出的是一个相对协调的形状,而不是一个带着精确物理尺度的 CAD 模型。所以批量资产进 Unity 之后,最容易翻车的就是比例:不同批次生成的模型,可能一个像大象,一个像蚂蚁。
我的做法是做一个“参考标准件”。在 Blender 里先建一个 1 米见方的立方体,保留在单独的参考场景里。所有从 Tripo 生成后导入的模型,第一步就让它和这个参考立方体做等比缩放。如果 Stone_Wall_A 导入后高度是参考立方体的 3.2 倍,那就把它统一缩放到 3 倍,留下 0.2 的误差先不管,后续在 Unity 里总装时再统一微调。
轴心问题同样不能忽视。AI 生成的模型原点位置非常随机,有的在几何中心,有的飞在模型外面,有的卡在底部。如果不统一处理,Unity 里做阵列复制或者脚本摆放时,坐标全都对不上。我习惯在 Blender 阶段就把所有资产的原点归到“底部中心”,这样拼装时只需要控制 y 轴高度就能把模型贴地摆放。
2.3 命名与目录规范
命名这件事,我做项目时一度觉得“反正自己认识就行”,直到资产数量过百,Unity 工程里同名脚本和预制体搅在一起找半天,才明白前期规范有多重要。现在我的命名规则很简单:
- 资产前缀:SM_ 表示静态模型,SK_ 表示带动画的模型,FX_ 表示特效
- 类型缩写:Wall、Pillar、Door、Window、Prop、Ramp
- 风格标签:Medieval、Industrial、SciFi、Modern
- 尺寸信息:L2(2 米长)、H1(1 米高)、R05(半径 0.5 米)
举个例子,SM_Wall_Medieval_L2 就是一个 2 米长的中世纪风格静态墙段模块。目录结构则统一按 Assets/Modules/Textures、Assets/Modules/Materials、Assets/Modules/Prefabs、Assets/Modules/Meshes 来分。这样做的好处是,Unity 里无论用 Asset Database 搜索还是简历资源清单,都能快速定位,不会把时间耗在资源管理上。
3. Tripo 批量生成实操:从提示词到初筛
3.1 提示词模板与风格统一技巧
Tripo 的提示词和 AI 绘画一样,描述越具体,结果越接近预期。但每个资产都临场发挥写一大段,很快会崩溃,风格也会跑偏。我总结了一个百搭模板,几乎可以覆盖所有模块化静态资产:
资产类型 + 尺寸/比例描述 + 材质与表面细节 + 风格一致性后缀
拿“石墙段”举例,实际提示词是这样的:
medieval stone wall module, 2 meters long, 0.6 meters high, grey granite texture, clean hard-surface edges, small moss at the base, PBR materials, consistent with low-poly stylized game assets, white background
注意“consistent with low-poly stylized game assets”这种风格后缀,批量生成时一定要固定在每个提示词末尾,这是风格统一的第一道保险。如果项目走写实路线,后缀改成 “consistent with realistic PBR game assets” 即可。
尺寸描述在提示词里写出来,Tripo 不会真给你一个精确的 2 米模型,但会影响模型各部位的比例关系。比如你强调“thick wall, 2 meters long, 0.6 meters high”,生成结果大概率是长条形的体块,而不是一个方形碉堡。
3.2 批量发起与人工初筛
批量发起有两种方式,网页端的批量模式和基于 API 的脚本模式。网页端适合一次生成二十到五十个的中等批量,操作直观,生成完直接在网页上预览初筛。API 模式适合天天都要补资产的重度流程,可以把“提交任务—轮询状态—自动下载”写成脚本。
这里有个建议:不要所有生成结果都下载下来,那只会白白增加清理工作量。初筛标准我固定在四条线上:
- 比例有没有严重扭曲:比如墙面模块侧面看像被压扁了
- 有没有大面积破面和空洞:尤其注意底部接触面
- 硬表面边缘是否干净:模块化资产最怕浮渣状表面结构
- 贴图通道是否完整:Tripo 有时会输出无贴图的模型,这种直接淘汰
初筛阶段不要急着删所有不完美的模型。有些模型结构没问题只是贴图偏老,后面清理时统一调整材质即可,全删会让后期可选范围变小。
3.3 用 Blender 脚本统一清理资产
从 Tripo 下载的 glTF 或 GLB,我不会直接拖进 Unity。AI 生成的网格在拓扑规整度上仍然不稳定,直接导入会出现各种奇怪问题。所以我都会先在 Blender 里做一轮脚本化清理,把每个文件统一处理一遍再导出 FBX。
下面这个脚本是我目前批量清理用的核心片段,Blender 3.6 及以上版本都能跑。实际用的时候需要根据自己的目录修改路径。
import bpy import os INPUT_DIR = r"D:\tripo_batch\raw" OUTPUT_DIR = r"D:\tripo_batch\clean" os.makedirs(OUTPUT_DIR, exist_ok=True) for fname in os.listdir(INPUT_DIR): if not fname.lower().endswith(".glb"): continue filepath = os.path.join(INPUT_DIR, fname) bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.gltf(filepath=filepath) bpy.ops.object.select_all(action='SELECT') if len(bpy.context.selected_objects) > 1: bpy.ops.object.join() obj = bpy.context.view_layer.objects.active obj.location = (0, 0, 0) bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.triangulate_quads() bpy.ops.mesh.delete_loose() bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.shade_flat() dec = obj.modifiers.new(name="Decimate", type='DECIMATE') dec.ratio = 0.4 bpy.ops.object.modifier_apply(modifier="Decimate") bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='BOUNDS') min_z = min((obj.matrix_world @ v.co).z for v in obj.data.vertices) bpy.context.scene.cursor.location = (0, 0, min_z) bpy.ops.object.origin_set(type='ORIGIN_CURSOR') obj.location = (0, 0, 0) fbx_path = os.path.join(OUTPUT_DIR, os.path.splitext(fname)[0] + ".fbx") bpy.ops.export_scene.fbx( filepath=fbx_path, use_selection=True, apply_unit_scale=True, axis_forward='-Z', axis_up='Y' )这个脚本每一步都有明确目的,挨个说一下。
第一步先 join 成单一网格,目的是减少 Unity 里的 Draw Call。glTF 格式有时会把一件资产的多个部件拆成多个 Mesh 对象,Unity 里就会产生额外的批次,最好在 Blender 里合并。合并前确认所有对象都没有动画,静态资产这么做才安全。
应用变换(Transform Apply)几乎是我处理所有外来资产的必做项。很多导入模型带着奇怪的旋转和缩放值,比如 scale 是 (0.01, 0.01, 0.01) 或者旋转值有非整数角度,Unity 里就会出现莫名其妙的坐标偏移。在 Blender 里先把变换清零,Unity 那边就省心了。
三角化和 delete_loose 是针对 AI 网格的常规手术。AI 生成过程容易产生大量四边面甚至 N-Gon 和孤立点,三角化可以保证 Unity 的导入器和某些运行时操作不会踩到拓扑坑。shade_flat 则是硬表面资产的老规矩,如果不想让模型看起来像被磨圆了,一定要关掉平滑着色,让每块面都保持清晰的硬边。
减面环节默认设 ratio 0.4 是经验值,创意原型项目里这个比例足够保证视觉效果,同时面数可以压下一大截。如果做的是近距离展示类资产,ratio 可能要调到 0.6 才有足够的细节;如果是大规模铺场景的重复件,0.3 也不嫌少。
最后把原点归到几何底部中心,回到之前的轴心约定。脚本里先用 Origin to Geometry 的 BOUNDS 选项把原点放到包围盒中心,再结合游标移到 Z 轴最小值位置,把原点挪到底部。这样到 Unity 后,每个模型的位置 y 值就可以直接理解为“距离地面的高度”。
3.4 面数与纹理预算参考
清理阶段顺手控制面数预算非常值得。不同平台的预算差异很大,我按项目类型做了一个参考表,实际项目可以按美术风格和个人经验浮动:
| 目标平台 | 单资产三角面区间 | 纹理尺寸建议 | 贴图格式 |
|---|---|---|---|
| 微信小游戏/移动端 | 300 - 1500 tris | 512 - 1024 | ASTC/CRN 压缩 |
| 数字孪生/PC 可视化 | 2000 - 5000 tris | 1024 - 2048 | DXT/BC 压缩 |
| VR(Pico4 等) | 1000 - 3000 tris | 1024 | 常规纹理即可 |
| 独立游戏原型 | 与目标平台保持一致 | 512 - 1024 | 常规纹理即可 |
Tripo 生成的原始面数通常偏多,一个细微的柱子可能有一万多面,直接导入 Unity 完全没必要。在 Blender 里统一减面后,再按目标平台调整纹理压缩策略,整体性能会明显改善。
4. Unity 导入与资产包落地
4.1 FBX 导入设置细节
Blender 导出 FBX 时的坐标轴设置很关键,默认情况下 Blender 的 Z 轴向上,而 Unity 的 Y 轴向上,所以导出时要用 axis_forward='-Z', axis_up='Y'。这样 Unity 导入后模型的正方向就和场景一致,不用再逐个旋转。我之前偷懒用默认坐标导出过一次,结果进 Unity 全部横躺,一个个手动扶正花了一个下午。
FBX 导入 Unity 时,Model 选项卡里的 Scale Factor 默认可能是 1,但有时会因为单位换算不一致出现整体偏大或偏小的情况。我的判断标准是拿一个已知尺寸的胶囊体(Capsule)做参照物,导入后对比高度,哪儿不对就去改 File Scale。Convert Units 选项一般保持勾选,Unity 会按 1 单位等于 1 米的约定换算。
还有一点,如果做完减面后资产面数仍较高,导入时把 Mesh Compression 打开设为 High,配合 Read/Write Enabled 只在你确定要运行时改 Mesh 时才勾选。大多数情况下不需要 Read/Write,关掉还能省内存。
4.2 材质通道映射与碰撞体策略
AI 模型带的 PBR 贴图在 Unity 里的映射不算全自动。glTF 的 PBR 通道和 Unity URP/HDRP 的 Lit Shader 通道存在差异,进 Unity 后经常出现材质发灰、铜锈感缺失的问题。我的对策是导入后统一把贴图手动映射到 URP/Lit 的对应位置:
- Base Map 对应 Albedo,需要设置 sRGB
- Normal Map 对应法线贴图,导入设置要勾选 Normal Map 选项,否则会偏色
- Metallic 和 Smoothness 对应金属度和粗糙度
- 如果 glTF 里带有 AO 贴图,可以挂到 Lit 的 Occlusion 通道
批量处理时,与其一个一个改材质,不如在 Unity 里写一个小编辑器脚本来批量赋材质,遍历整个 Meshes 目录,把同名字的贴图通道自动挂到对应材质球上。这种脚本在项目里能省下大量重复时间。
碰撞体策略上,AI 生成的模型轮廓往往很不规则,直接用原始 MeshCollider 会导致物理运算非常昂贵。我的经验是优先用简单几何体组合:墙体用 Box Collider,柱子用 Capsule Collider,石头堆用几个 Box 拼合。只有实在无法近似的模型才用 MeshCollider,而且 Convex 必须勾选。数字孪生项目里模型数量动不动上百个,Collider 的合理简化对性能影响非常明显。
4.3 预制体的构建与 LOD 体系
清理完的 FBX 资产进 Unity 后,我会按模块类型拖成预制体(Prefab),把材质、碰撞体、LOD Group 全部挂好。比如 SM_Wall_Medieval_L2 这个预制体,内部结构就是 FBX 模型 + URP Lit 材质 + Box Collider + LOD Group。
LOD 的做法是用 Blender 脚本把同一个模型减面三次,分别导出 LOD0、LOD1、LOD2 三个等级的网格,再在 Unity 里把它们挂到同一个 LOD Group 上。LOD0 用 100% 面数,LOD1 用 40%,LOD2 用 10%,这样远处重复排布的资产会变成极低面数的替代网格,性能释放非常明显。
4.4 场景拼装体验
模块化资产包建好预制体后,拼装阶段的核心难点是接口对齐。Tripo 生成不同模块的尺寸比例虽然经过统一缩放,但并不是每家每户都准。我的做法是在 Unity 里把 Grid 快照(Snap Settings)统一设成 0.5 米或者 1 米,拼装时用 Vertex Snap 模式,把新模块吸附到已有模块的顶点上。只要 Blender 清理时原点统一在底部中心,这个流程就很顺手。
如果你做的是大量重复摆放,比如一整排路灯或者栅栏,用 Unity 的 Array 插件或者自写的 Editor 脚本批量生成实例,比手拖要稳定得多。代码里设置位置时,只需要偏移每个模块的尺寸值,就能得到一排边缘紧密相接的资产。
5. 常见问题与排查实录
实际操作中遇到的大问题反而好解决,真正烦人的是那些“看起来没问题但就是不对”的隐性坑。我把典型问题整理成一个速查表,后面逐个展开讲。
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 模型导入后横躺 | FBX 坐标轴设置错误 | 导出时使用 -Z forward, Y up |
| 尺寸忽大忽小 | File Scale 或 Scale Factor 不一致 | 用标准参照物对比后统一缩放 |
| 渲染正常但灰色包围盒偏移 | 网格数据脏、bounds 未重算 | Blender 清理孤立点 + Unity RecalculateBounds |
| 材质全部变紫 | 贴图引用丢失或 Shader 不支持 | 手动映射各通道到 URP/Lit |
| 远处模型疯狂闪动 | LOD 切换距离不合理 | 调整 LOD Group 的过渡距离 |
| 硬表面模型阴影脏 | 法线方向不统一或平滑组错误 | 重算法线 + Shade Flat + Auto Smooth |
5.1 比例和坐标轴异常
这是几乎每个用过 AI 资产的团队都会碰到的头号问题。Tripo 生成的 glTF 模型本身可能带有一套比例,导出 FBX 时又叠加一层单位换算,Unity 导入时再转一次,三次翻身之后尺寸很难保持稳定。我的惯例是:所有模型统一在 Blender 里做 Transform Apply,把比例值固定下来,再用参考标准件缩放一次,最后才导出 FBX。
坐标轴横躺问题我在前面提过,关键就是导出 FBX 时 axis_forward 和 axis_up 的设置。确认 Unity 里模型 forward 方向正确后,再把模型整体旋转到想要的正方向,用父节点控制旋转值,而不是动网格本身。
5.2 Unity renderer 的包围盒对不上
这个问题的表现是:模型渲染正常,但选中时 Unity 显示的高亮轮廓或者包围盒明显比模型大一圈,或者围着一半模型转。这个主要是网格数据里残留了孤立顶点、极远点和 NaN 坐标导致的。Tripo 的网格偶尔会带一些肉眼看不见的脏数据,Unity 计算 bounds 时把这些脏点算进去了。
解决思路按源头和结果分两步。源头处理是在 Blender 清理脚本里做 remove loose geometry 和 degenerate dissolve,把孤立点删干净。结果处理是在 Unity 里对历史遗留的资产做一个批量修复脚本,遍历场景中所有 MeshFilter,重建网格并调用 RecalculateBounds。
using UnityEngine; public static class MeshFixer { public static void FixMesh(MeshFilter filter) { if (filter == null || filter.sharedMesh == null) return; var mesh = filter.sharedMesh; mesh.RecalculateBounds(); } }这个脚本对大部分情况有效,但如果你发现模型本身有粉碎性破面,那说明原始网格问题太严重,建议回 Blender 重新清理。
5.3 材质变紫或贴图丢失
导入 Unity 后材质变紫,先检查两件事:一是 FBX 自带的材质引用是否有贴图文件跟随,二是当前渲染管线是否支持该 Shader。Tripo 生成的模型如果是 glTF 流程,贴图文件名和材质球名称是一一对应的,但导出 FBX 后 Unity 不一定能自动关联,经常需要手动拖一次贴图。
解决办法是把所有纹理文件统一放在Assets\Textures\Modules下,命名与 Mat 保持一致,然后批量创建或重新设置材质球。Normal Map 记得在导入设置里勾选 Create from Grayscale 或 Normal Map,否则法线贴图会以普通纹理方式采样,出来的画面会发灰偏暗。
5.4 阴影表现脏
硬表面资产最怕阴影里一团乱糟糟的噪点,AI 生成模型尤其容易出这个问题。根源通常是法线数据在生成时就有褶皱,或者平滑组被错误地设成了所有面一起平滑。Blender 里用 Shade Flat 加 Auto Smooth,角度设为 30 度左右,就能把锐利边缘找回来,阴影表现也会清晰不少。
到 Unity 侧再检查导入的法线方向,确认没有反转法线导致的面片发黑问题。偶尔会有法线翻转不统一的模型,可以在 Blender 里开启 Face Orientation 查看,把红色面全部重新翻转。
5.5 性能和面数爆表
项目跑起来掉帧严重,用 Profiler 一看 Mesh 内存占了一大半,问题基本就出在资产面数和纹理大小上。解决方案是回到 Blender 把减面比例再压低,或者直接在 Unity 里换用更低精度的 LOD 层,同时把贴图压缩格式改成适合目标平台的格式。我的经验是“场景铺量大的资产要优先优化,镜头怼脸拍的资产可以保留高模”。如果所有资产都按高规格做,最后一定会卡在某个转角处开 party。
实践中还有一个很实用的原则:如果某个资产在场景里只出现一次、而且在远景,那它压根不值得用 Tripo 生成后做完整清理,直接导入最多减个面就算完事。真正值得投入清理精力的,是那些要阵列复制、重复摆放的模块资产,因为优化一次能放大到几百个实例上。
这套流程的扩展价值
跑通 Tripo 批量生成到 Unity 导入的流程之后,下一步我建议把常用的提示词模板、Blender 清理脚本、Unity 的材质映射工具沉淀成团队内部工具链。我现在做一个新项目时,第一批资产的生成和导入已经能做到基本上“半小时起步”,因为模板和脚本都是现成的,剩下的时间全花在风格调整和特殊资产的细化上。
如果你也打算试这套流程,我最大的建议是:第一次跑通时别贪多,先挑十来个资产练手,把每个环节的规则定下来,再批量铺开。AI 生成工具迭代速度很快,但“用 AI 做批量、用 DCC 做标准化、用引擎做装配”这套组合拳在未来很长一段时间里都是高效的。希望这份经验能帮你少走几步弯路。