优质中文开源软件代码项目资源技术共享平台
传播开源的理念,推广开源项目
风雨总会过去,阳光定会到来,河南加油!

网站首页 游戏开发 正文

Unity3D研究院编辑器之自动生成的material文件(八)

longtao100 2021-08-30 游戏开发 47 ℃ 0 评论

程序从svn上把工程更新下来,莫名其妙的多出了很多没上传svn的material文件。原因是这样的,如下图所示,美术同学把FBX文件拖入unity的时候。unity会自动在同级目录下生成一个Materials文件夹,里面会在生成一个material文件。而这个文件名是在FBX里指定的,换句话来说就是美术在3dmax里指定的。为什么会生成material,是因为默认这里勾选了import material。

 

如果有人告诉美术你的这个材质名字写错误需要更正一下,美术一般会投省事直接在unity里把这个错误的material删除,然后在unity里在创建一个名字正确的材质。接着美术会上传svn,问题似乎解决的天衣无缝。。可是另外一个人重新checkout一下这个工程,打开unity后错误的material文件又会被FBX重新生成出来,慢慢的项目里乱七八糟的材质就都出来了。。

为了解决这个问题,我想到了禁止fbx生成这个material文件,于是有了下面这段代码.

 
C#  
1234567891011121314
 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里创建的。

说了半天我们应该理解美术, 因为每个美术同学都是一个艺术家,艺术家喜欢干抽象的事,你非要让他干具体、严谨的事他们肯定也会出错的。所以作为程序我们还是要想办法帮助美术同学来避免错误。他们的错误率低,我们的活干的也就快也就爽。嘿嘿!  另外如果你有更好的办法解决此类问题,欢迎再下面给我留言。。。

 


Tags:Unity3D

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

请填写验证码
开源分类
最近发表
开源网标签
开源网归档