材质与Shader导出
- 入口:
MaterialFile→MetarialUitls.WriteMetarial - 格式:
LAYAMATERIAL:04(.lmat) - 查表配置:
MetarialPropData.json
① 按 shader 名查表
Section titled “① 按 shader 名查表”本节是总纲——先按 shader 名查到映射配置,决定后续映射方式。 WriteMetarial 用 material.shader.name 查 MaterialPropsConfigs:查到就按配置导出;查不到时:未启用自定义 Shader 导出则跳过该材质,启用则转交自定义 Shader 导出。
实测 Ellen_Body_Mat 是 Standard,配置把它映射为 Laya 的 PBR 材质类型:

导出前 · Unity: Standard shader,反射率 / 金属 / 法线 / 发射(HDR 青色)等贴图槽与参数。

导出后 · LayaAir: type 变 PBR,反照率 / 法线 / 自发光 / 遮挡 / 金属光泽贴图,金属度 / 光滑度 / Alpha 测试阈值齐全。
② 渲染状态
Section titled “② 渲染状态”映射剔除 / 混合 / 深度等渲染状态到 Laya 字段。 写入 s_Cull(剔除)、s_Blend / s_BlendSrc / s_BlendDst(混合因子)、alphaTest + alphaTestValue、renderQueue、materialRenderMode。普通材质(本页主题的 Standard/PBR 等)的混合因子经 GetSrcBlend / GetDstBlend 把 Unity 的 _SrcBlend / _DstBlend 整数值用 switch 逐项映射到 Laya 的混合枚举。(自定义 Shader 与粒子材质走另一条按枚举名映射的路径,不在此处。)
③ 贴图映射
Section titled “③ 贴图映射”将配置中的各贴图槽映射到 Laya 字段并导出。 遍历配置的贴图槽,material.GetTexture(uName) → 导出 TextureFile → 加入 textures 数组(带 layaName)。内置资源贴图跳过(unity_builtin_extra 等);法线贴图标 isNormal。平铺偏移走 tillOffset 写 Vector4。
④ 颜色 + HDR 分解
Section titled “④ 颜色 + HDR 分解”普通颜色直接写入;HDR 超亮颜色分解为颜色 + 强度两部分。 普通颜色直接写 rgba;HDR 颜色(如自发光)分量 > 1,超出 0–1 范围,于是 DecomposeHdrColor 把它拆成压缩颜色 + 强度两部分:颜色分量先按最大分量缩放、再夹到上限 0.749(k_MaxByteForOverexposedColor),并经 LinearToGammaSpace 转到 Gamma 空间后写 rgba;强度是按最大分量反算得出(1 / scaleFactor,不等于 Unity 强度滑杆的原值),单独写到 hdrName(如 u_EmissionIntensity)。
转换示意:Unity HDR 颜色 RGB(0,143,191) 强度 2 —(DecomposeHdrColor)→ 压缩颜色(≤0.749,Gamma 空间)+ 反算强度 = Laya 自发光颜色 + 强度分离。

导出前 · Unity:「发射」(Emission) 的 HDR 颜色选择器——颜色 RGB(0,143,191),强度滑杆 = 2,颜色超亮。

导出后 · LayaAir: 拆成**「自发光颜色」(青)+「自发光强度」**两个独立字段——HDR 分解完成。
⑤ float + 条件规则
Section titled “⑤ float + 条件规则”逐个映射 float,部分带条件规则按情况切换取值来源。 material.GetFloat(uName) → 写 layaName。支持 rule 条件改名:如材质有 _MetallicGlossMap 贴图时,光滑度改为从 _GlossMapScale 读取(Laya 端字段仍是 u_Smoothness,变的只是去 Unity 材质取值的属性名)。isGamma 标记的值经 LinearToGammaSpace 转换。
⑥ defines(宏开关)
Section titled “⑥ defines(宏开关)”按材质实际特性追加宏开关。 下面三类来源各自对应一种触发条件:
| 来源 | 触发条件 |
|---|---|
| floatValue | 某 float 等于指定值 → 加宏 |
| TextureValue | 某贴图存在 → 加宏(如有法线贴图 → NORMALTEXTURE) |
| keyWorld | 某 shader keyword 启用 → 加宏 |
⑦ 天空盒 → .cubemap
Section titled “⑦ 天空盒 → .cubemap”天空盒作为特例单独导出,生成 .cubemap 而非仅 .lmat。 场景天空盒材质若是 Skybox/6 Sided,走 WriteSkyMetarial:把 6 个面的贴图写入一个 .cubemap 文件,材质 .lmat 的 type 为 SkyBox,引用该 cubemap。
| Unity 天空盒 Shader | 支持 | 导出去向 |
|---|---|---|
Skybox/6 Sided | ✓ | WriteSkyMetarial → .cubemap(6 面)+ SkyBox 材质 |
Skybox/Procedural | ✓ | 普通查表 → SkyProcedural(SkyTint / GroundColor) |
Skybox/Panoramic | ✓ | 普通查表 |
Skybox/Cubemap | ✗ | 当前版本未支持单张 Cubemap 天空盒导出 → 跳过,不生成 cubemap |

导出前 · Unity: Skybox/6 Sided 材质,Front / Back / Left / Right / Up / Down 六个面贴图。

导出后 · LayaAir: 6 面合成的 .cubemap 在场景中渲染出天空,右侧为 cubemap 属性。
本页基于插件 1.1.7 源码与实测整理。