我也遇到过这个问题,已经顺利解决。
问题的根本是
在程序运行时用replacePrefab(gameObj,prefab)或createPrefab(gameObj,prefab)保存prefab,遇到保存出来的prefab中material丢失的问题。
最后查到原因是gameObj的material成员引用的是一个material实例,而非material资源,所以保存成prefab后引用会丢失。
而导致gameObj的material成员实例化的原因是某处调用了gameObj.meshRenderer.material。
我们的目的是,在编辑器下生成预制体,并且材质指向正确,材质不丢失。
1.问题 我在CreatePrefab之前是这么赋值材质球的
-----materList 是这已经实例化出来的 材质
obj.AddComponent<MeshRenderer>().sharedMaterial = materList[0];
......
GameObject prefab = PrefabUtility.CreatePrefab("Assets/Art/Prefab/env/showCarMesh/" + obj.name + ".prefab", obj, ReplacePrefabOptions.ConnectToPrefab);
最后会导致如下结果 材质球名字中 带有一个 Instance,是一个实例对象。
这样编辑器下生成的预制,就会贴图丢失
2.后来解决办法
在编辑器下,代码里面把贴图重新加载一遍,你肯定知道你的材质球存放路径,tpName 是从子元素获取到的材质球的名字。
Object addMt = AssetDatabase.LoadAssetAtPath("Assets/Art/ShowCar/Materials/" + tpName + ".mat", typeof(Material));
....
obj.AddComponent<MeshRenderer>().sharedMaterial = (addMt as Material);
Resources.UnloadAsset(addMt);
....
GameObject prefab = PrefabUtility.CreatePrefab("Assets/Art/Prefab/env/showCarMesh/" + obj.name + ".prefab", obj, ReplacePrefabOptions.ConnectToPrefab);
结果如下