Unity中如何通过脚本获取FBX文件导入的材质名称

回调不生效的核心原因
你写的OnPreprocessMaterialDescription没有触发,通常是三个配置错误导致的:
- 脚本存放位置错误:所有继承
AssetPostprocessor的编辑器脚本,必须放在项目中命名为Editor的专用文件夹下,放在普通运行时脚本目录的话,资源导入流程不会扫描加载该脚本,对应回调自然不会执行。 - 方法签名不匹配:Unity的资源导入回调是通过非公开反射机制匹配的,
OnPreprocessMaterialDescription方法需要写成private,写成public会导致反射匹配失败,回调无法被正常调用。 - 配置生效时机不对:在
OnPreprocessModel执行阶段修改materialImportMode参数,不会应用到本次导入流程,需要提前在FBX的导入设置面板里,把材质导入模式手动切换为通过材质描述导入,点击应用后再重新触发导入,材质描述相关回调才会执行。
稳定获取原始材质名的替代方案
如果调整上述配置后还是无法拿到名称,可以直接用OnPostprocessModel回调在导入完成阶段读取,这个回调触发逻辑更稳定,不需要依赖特殊的材质导入模式,示例代码如下:
using UnityEditor; using UnityEngine; public class FbxOriginalMaterialReader : AssetPostprocessor { private void OnPostprocessModel(GameObject importedRoot) { // 遍历导入模型下所有渲染器组件 Renderer[] allRenderers = importedRoot.GetComponentsInChildren<Renderer>(true); foreach (Renderer renderer in allRenderers) { foreach (Material sharedMat in renderer.sharedMaterials) { // 该阶段读取的sharedMat.name就是3dsmax导出时写入FBX的原始材质名 Debug.Log($"FBX携带的原始材质名:{sharedMat.name}"); } } } }
注意:这个脚本同样需要放在
Editor文件夹下才能正常生效。
内容的提问来源于stack exchange,提问作者Hammeee
相关产品推荐
相关产品推荐

