程序从svn上把工程更新下来,莫名其妙的多出了很多没上传svn的material文件。原因是这样的,如下图所示,美术同学把FBX文件拖入unity的时候。unity会自动在同级目录下生成一个Materials文件夹,里面会在生成一个material文件。而这个文件名是在FBX里指定的,换句话来说就是美术在3dmax里指定的。为什么会生成material,是因为默认这里勾选了import material。
如果有人告诉美术你的这个材质名字写错误需要更正一下,美术一般会投省事直接在unity里把这个错误的material删除,然后在unity里在创建一个名字正确的材质。接着美术会上传svn,问题似乎解决的天衣无缝。。可是另外一个人重新checkout一下这个工程,打开unity后错误的material文件又会被FBX重新生成出来,慢慢的项目里乱七八糟的材质就都出来了。。
为了解决这个问题,我想到了禁止fbx生成这个material文件,于是有了下面这段代码.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using UnityEngine; using System.Collections; using UnityEditor; class DisableMaterialImport : AssetPostprocessor { void OnPreprocessModel () { ModelImporter modelImporter = assetImporter as ModelImporter; modelImporter.importMaterials = false; } } |
可是问题紧接着来了,美术好不容易编辑好了场景,策划说调整一下模型吧。。于是乎换了新模型,糟糕!!因为新模型没关联上旧模型的材质信息。所以场景中材质都丢失了。。。 其实如果美术在编辑场景时都用prefab来做的话也不会这样,但是美术一般不会用prefab,他们做场景都是直接把fbx拖进去,如果发现材质不对那么在创建一个材质,如果需要复制多份儿他们就ctrl+d一下。。 所以一旦材质丢失后果不堪设想。
于是乎我又想到了一个办法,还是打开自动生成材质的开关。只是材质名必须和模型名保持一致,如果不一致程序就输出一个错误信息告诉美术。。于是乎又有了下面这样的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using UnityEngine; using System.Collections; using UnityEditor; class DisableMaterialImport : AssetPostprocessor { void OnPostprocessModel(GameObject model){ if (!assetPath.Contains ("@")) { Renderer [] renderers = model.transform.GetComponentsInChildren<Renderer> (); for (int i =0; i< renderers.Length; i++){ if(renderers[i].sharedMaterial.name!= model.name){ Debug.LogError("材质名和模型名不匹配!"); //FileUtil.DeleteFileOrDirectory(Application.dataPath+assetPath.Replace("Assets","")); AssetDatabase.Refresh(); break; } } } } } |
哎。我真是too young too simple!! 什么提示警告啊, 提示错误啊,美术才不管这些呢。只要能导入unity,能上传svn 就OK了。。
所以还是老老实实把下面这段代码打开吧, 也就是如果FBX里材质名不正确,直接给他把模型删了,这样没有模型了自然美术就会想办法解决了,自然就会看Debug.LogError的信息了 哈哈!!
FileUtil.DeleteFileOrDirectory(Application.dataPath+assetPath.Replace(“Assets”,””));
那么如果你的项目模型是需要多个材质的,可以让美术在3DMAX里规定一个模型的默认材质比如model_0 然后model_1 model_2…. 则是在unity里创建的。
说了半天我们应该理解美术, 因为每个美术同学都是一个艺术家,艺术家喜欢干抽象的事,你非要让他干具体、严谨的事他们肯定也会出错的。所以作为程序我们还是要想办法帮助美术同学来避免错误。他们的错误率低,我们的活干的也就快也就爽。嘿嘿! 另外如果你有更好的办法解决此类问题,欢迎再下面给我留言。。。
- 本文固定链接: https://www.xuanyusong.com/archives/3648
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
这个锅可以自己背。
UnityEditor.AssetPostprocessor.OnAssignMaterialModel可以自己处理材质生成。
Material OnAssignMaterialModel(Material material, Renderer renderer)
{
if (material.name == “” || material.name.Contains(” – Default”) || material.name.Contains(“No Name”))
{
Debug.Log(“Invalid Material Name: ” + material.name);
string defaultPath = EZScriptableObject.AssetsDirPath + “default.mat”;
Material defaultMaterial = AssetDatabase.LoadAssetAtPath(defaultPath);
if (defaultMaterial == null)
{
defaultMaterial = new Material(Shader.Find(“Standard”));
AssetDatabase.CreateAsset(defaultMaterial, defaultPath);
}
return defaultMaterial;
}
return null;
}
这是刚写的,如果是未指定材质,或者是3dmax默认命名01 – Default,那么就使用我自己目录里的统一默认材质。
那这个方法怎么调用呢
unity5以后创建一个Materials默认是使用Standard shader,请问有没办法可以修改这个默认值?经常要导入很多模型,每次都要改实在太麻烦了;
有个Technical Artist 是很重要的,如果有这个职位,很多工作流的事TA可以监督,经验丰富的TA可以设计美术和程序之间迭代开发的工作流。让各专业的人员专注于自己的工作领域。
是的。 有个好的技术美术很重要
我就是这样的TA。 XD
这个方法该怎么调用呢
GoodJob 我一直非常推崇这种激进的错误提示手段,非常奏效。资源不符合规范直接毁掉,关卡配置错误直接不让启动游戏全屏大字报错误。
目前使用起来还不错。。。
有一个好的项目制作规范才是最重要的,能避免N多不必要的麻烦和撕逼
nice job,删了
这样做是对的 美术永远不懂Console的信息是做什么用的
= =| 前几天还和美术掰扯这个默认材质球的事情。。。已经趋向妥协了。。
美术新作的材质球命名也是各种艺术。。前段时间给的两个地形里面都有 shitou.mat(石头),但是材质内容并不一样,导入的时候覆盖出了问题。 我说给我改个名字结果变成了 dashitou.mat(大石头)。
终于看完了 momo大大的所有文章,还有些技术点需要动手操作下,看您的文章是我从小白走向技术控的起点~
直接给他把模型删了 干的漂亮
我觉得应该直接拿刀子架在他们脖子上
粗爆。。。我们还是把这个选项关掉的
哈哈 直接把模型删了!
直接给他把模型删了接给他把模型删了给他把模型删了他把模型删了把模型删了模型删了型删了删了了
大神 你是如何打的字