本文档旨在统一美术资源的输出格式,确保导入 Unity 后无需二次调整即可直接使用。
| 资源类型 | 命名前缀 | 格式 | 关键设置 | 备注 |
|---|---|---|---|---|
| 模型 (Static) | SM_ |
.fbx |
Scale=1, Y-Up, Z-Forward | 轴心点在底部中心 |
| 模型 (Skinned) | SK_ |
.fbx |
Bake Animation=On | 包含骨骼,轴心点在脚底 |
| 贴图 (Albedo) | T_ |
.tga / .png |
sRGB=On | 必须是 2 的幂次方 (POT) |
| 贴图 (Normal) | T_ … _N |
.tga / .png |
sRGB=Off | 必须标记为 Normal Map |
| 贴图 (Mask) | T_ … _M |
.tga / .png |
sRGB=Off | R=Metal, G=Occ, B=Smooth |
| UI 图标 | UI_Icon_ |
.png |
Alpha Is Transparency=On | 必须留 1px 透明边缘 |
| UI 背景 | UI_Bg_ |
.png |
9-Slice 预留 | 检查压缩格式 (ASTC/ETC2) |
严禁使用中文、空格或特殊字符。使用 PascalCase (大驼峰) 或 Snake_Case (下划线)。
SM_[Name]_[Variant] (e.g., SM_Tree_Birch_01)SK_[Name] (e.g., SK_Hero_Vampire)T_[Name]_D (Diffuse/Albedo)T_[Name]_N (Normal)T_[Name]_M (Mask - R:Metallic, G:Occlusion, B:Smoothness)T_[Name]_E (Emissive)M_[Name] (e.g., M_Tree_Bark)MI_[Name] (Material Instance)为了避免“人为失误”,强烈建议使用脚本一键导出。
Blender 的坐标系坑最大 (Z-Up),必须强制转换。
Apply Scalings: FBX All (关键!否则 Scale 会变成 100)Forward: -Z ForwardUp: Y UpApply Unit: CheckedBake Animation: 仅对骨骼模型勾选export_unity_fbx.py):
import bpy
import os
# 1. 准备工作:应用缩放,重置位置
bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)
# 2. 导出路径 (当前 .blend 同级目录)
basedir = os.path.dirname(bpy.data.filepath)
name = bpy.path.display_name_from_filepath(bpy.data.filepath)
filepath = os.path.join(basedir, name + ".fbx")
# 3. 强制参数导出
bpy.ops.export_scene.fbx(
filepath=filepath,
use_selection=True,
axis_forward='-Z', # Unity Forward
axis_up='Y', # Unity Up
apply_unit_scale=True,
apply_scale_options='FBX_SCALE_ALL', # 修复 Scale 100 问题
bake_space_transform=True,
use_mesh_modifiers=True,
add_leaf_bones=False # 避免产生多余的叶子骨骼
)
print(f"Successfully exported to: {filepath}")
```
Q: 我能随便拖一个 FBX 进 Blender,然后用上面的脚本导出就完美了吗? A: 不完全是。 脚本能保证格式 (Scale/Axis) 正确,但无法自动修复内容 (Pivot/Hierarchy)。
如果你的目标是清洗外部杂乱资源,请在运行导出脚本前,手动执行以下“洗澡”步骤:
Alt+P -> Clear and Keep Transformation (解除父子关系)。Right Click -> Set Origin -> Origin to Geometry (或者手动移到底部)。UV Editing 快速看一眼。💡 脚本增强: 上面的 Python 脚本包含
transform_apply,这会自动修复大部分缩放和旋转问题,但不会修复轴心点位置。
Max 的单位设置最容易乱。
Up Axis: Y-UpScale Factor: Automatic (确保显示为 1.0)Embed Media: Uncheck (不要把贴图包进 FBX,Unity 无法复用)UITexture (不打图集的大图,如背景),则必须是 POT。在游戏引擎中,UI 图标通常会被打包成图集 (Atlas)。当图标进行缩放或旋转时,采样器会读取相邻像素 (Bilinear Filtering)。
不要手动去缩放画布!使用 PS 动作自动化:
Image -> Trim -> Transparent Pixels (切掉多余空白)。Relative,Width = 2px, Height = 2px (上下左右各加 1px)。Save for Web -> PNG-24 (带透明通道)。脚本化方案: 也可以使用 Python (Pillow 库) 批量处理文件夹下的所有 PNG。
from PIL import Image, ImageOps
import os
def process_icon(path):
img = Image.open(path)
# 1. Trim transparent borders
bbox = img.getbbox()
if bbox:
img = img.crop(bbox)
# 2. Add 1px padding
new_size = (img.width + 2, img.height + 2)
new_img = Image.new("RGBA", new_size, (0, 0, 0, 0))
new_img.paste(img, (1, 1))
new_img.save(path)
# 遍历文件夹调用 process_icon...