注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

重新出发的阿赵

阿赵的博客

 
 
 

日志

 
 

项目美术资源的存放规划  

2017-11-23 23:40:51|  分类: Unity教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在做之前几个Unity项目的时候,都会存在一个问题,就是怎样让美工们去使用Unity项目。
这是一个永恒的话题,因为主导项目实现的一般是程序员,程序员有自己的一套思维习惯,觉得很多事情应该是顺理成章的,不需要太多的说明。但美术的思维其实和程序员是差别挺大的,他们的关注点往往不在技术的具体实现上,只关心美术资源的制作本身。所以,可以很负责任的说,对于很多美工来说,可能连svn都不会用。在这种情况下,怎样才能更合理的部署项目中的美术资源,减少沟通成本和查错的成本,对于程序员来说也是非常重要的。
我的做法是,主项目和美术项目是分离的,美术有一个专门的制作资源用的Unity项目。美工会在美术项目里面制作各种资源,然后到了真正使用的时候,之前的项目是把美术资源项目内的资源检查过没有问题然后同步合并到主项目使用,现在的项目是直接在美术资源项目打包AssetBundle,然后主项目加载。
两种方式各有好处和缺点。把美术项目合并到主项目,可以方便查错,可以在主项目运行的时候直接看到美术资源的源文件,如果发现异常了,可以直接知道原因。缺点是合并的过程比较麻烦,而且在合并资源的过程中可能会产生操作上的错误。直接在美术项目生产AssetBundle的优点就是不需要两个项目资源的合并,可以独立出资源。缺点其实就是查错不方便了,当发现某个资源出问题的时候,还需要打开美术项目去查错。
这些缺点都有解决的办法。但在解决缺点之前,我们一定要先规范美术项目存放资源的规则。
我的习惯是这样的,首先在项目根目录里面建立一个ArtWorks的文件夹。然后在根目录再创建一个Prefabs的文件夹。
ArtWorks文件夹的作用是存放美术原始文件的,美工们从Photoshop或者3Dmax里面导出的各种原始美术资源,都可以放在ArtWorks里面。原始资源从资源类型来分,可以分为模型、材质、贴图、动画这几类。从资源的实际用途可以分为场景、角色、技能和特效、UI界面这几种。我的习惯,UI资源并不和其他美术项目放在一起,而是单独存放,这是因为UI通常和主项目的代码逻辑有比较紧密的联系,如果和主项目放在一起,也可以方便界面代码的调试。综合两种资源分类,ArtWorks文件夹就会变成这样:
ArtWorks
——Maps(场景资源总文件夹)
————Scenes(存放各个场景的scene文件)
——————场景1
————————场景1LightMap文件夹
——————场景2
————————场景2LightMap文件夹
……
————Models(存放所有场景用到的Fbx文件)
————Prefabs(一般我要求会把Fbx先做成Prefab再放到场景里使用)
————Materials(所有Fbx用到的材质球)
————Textures(所有Fbx用到的贴图)
——Roles(角色类资源总文件夹)
————Models(所有角色的Fbx)
————Animations(所有角色类的动画文件)
————Materials(所有角色类模型的材质球)
————Textures(所有角色类模型的贴图)
——Effects(特效类资源总文件夹)
————Models(所有特效里面用到的模型Fbx)
————Animations(所有特效里面用到的动画片段)
————Materials(所有特效用到的材质球)
————Textures(所有特效用到的贴图)

有些朋友看到这个目录结构,可能会觉得不适应,比如说,有些人是喜欢不分场景还是角色把同类型的资源都放在一起的。有些朋友喜欢把同一个场景的所有资源放在同一个文件夹,同一个角色的资源放在同一个文件夹的。
其实我一开始也尝试过上面说的一些存放方法,后来才渐渐变成这种方式的存放,每一个文件夹都是有原因的。
首先,一般来说,美术的分工决定了大文件夹的存放。场景、角色、动画和特效,在完整的项目里面肯定都是分开不同职位的人来做的,甚至一个岗位有多个人,比如会有3、4个场景编辑师,有4、5个角色建模师,有2、3个动画师,有2、3个特效师之类。不同岗位的人,我是非常不建议混用同一个文件夹的。因为不同岗位的美工对于资源的使用习惯也会有不一样,所以同一个岗位的人操作同一个文件夹是非常必要的,起码到了出问题查svn记录的时候,出问题的文件夹肯定是对应岗位的人在维护,比较好定位文件所在。
然后,为什么每个大类的总文件夹下面,都需要把模型、材质、贴图、动画分开文件夹存放呢?原因有好几个
1、很多美工并没有关心材质球和贴图是怎样在Unity里面生成的,只要最终的结果对就不管了。这里存在两种导出3D资源的方式,一种是在3DsMax里面勾选了包含多媒体导出,这样只需要把fbx放到Unity里面,它就会自动在fbx所在的文件夹里面生成一个存放材质球和贴图的文件夹。另外一种方式,是在3DsMax里面不包含多媒体导出,只导出裸模型,然后再手动在Unity里面建立材质球,然后手动拷贝贴图到Unity里面赋予给材质球。
从美工的角度,肯定是第一种方式比较省事,从正常的不出问题的情况下,两者看到的结果也的确是一样的。但实际上这种做法是非常不好的。因为包含材质和贴图的fbx放在Unity里面,在每一次ReImportFbx的时候,都有可能会自动生成这些材质球和贴图。而很多时候美术在Unity里面又会觉得自动生成的材质球和贴图不适合,在Unity里面又建了新的材质球或给材质球换了新的贴图。这时候,就会出现2种不好的情况,第一种,就是在ReImport的时候,可能资源的关联出错了,把新赋予的材质球或者贴图还原成自动生成的。第二种情况,如果你打AssetBundle的依赖是直接从Prefab到Fbx都会打出AssetBundle,那么这个Fbx自带的材质贴图很有可能就会和新指定的材质贴图一同打包出去了。总结一句话,就是可控性太差,容易出错。把模型、贴图和材质球分开文件夹存放, 就是强迫美术不能包含多媒体资源导出,一定要手动拷贝材质球和贴图。不然打开那个目录一看,哪个fbx包含了材质球和贴图,就一目了然了。

2、方便以后资源的批量检查和处理。在项目优化过程,对美术资源往往需要进行多次的调整,比如模型需要检查面数并减面,贴图需要调整尺寸和压缩方式,骨骼需要精简之类。如果把资源分别放在每个场景或者每个角色的文件夹里面,一层又一层,检查的时候会比较不直观。如果放在一起就可以指定文件夹来批量检查资源情况。

3、方便最终的AssetBundle依赖关系的打包和统计容量。我一般的做法,会按照资源依赖的原始文件目录去打包AssetBundle。如果一开始原始资源就按照同类型存放在一起,我在打包完AssetBundle之后就可以很方便的计算出各种资源占用的实际容量大小。比如我可以很快的知道,所有场景总共用到了多少M的容量,所有特效用了多少M容量。而在场景资源里面,贴图占用多少,模型占了多少,一目了然。

这样分类之后,一般会带来一个麻烦,就是同类型的东西放在同一个文件夹,数量太多了,不好查找。所以接下来必须对资源的命名有严格的规范。之前的项目遇到过这样一个问题,美术在出资源的时候,由于动画片段文件是从fbx里面生成的,自动生成的名字全部都是take001,而由于是用Animator的状态机来编辑动画片段的使用,一直用着都没有问题。但到了最终性能测试的时候,写了工具去检查占用内存高的动画片段,结果得出的结果全部都是take001,几乎就气疯了。
所以虽然放在同一个文件夹里面,但文件的命名必须是遵循“资源主名称_资源子名称_编号"这样的规则来命名的。比如刚才的动画片段就会变成”heroA_attack.anim“、"heroB_idle.anim"、"heroC_run.anim"这样的文件。由于文件夹默认都是按照名称来排序的,所以就可以很容易的从一大堆的资源里面,定位到某个场景或者某个角色使用到的资源了。

至于Prefabs文件夹,就是程序最终加载的预设存放的地方了。之前放在ArtWorks文件夹的是原始文件,程序不会直接的去调用的。如果需要直接调用,则必须放到Prefabs文件夹里面做成预设。
Prefabs的文件夹分类其实就和ArtWorks一样,直接就分成maps、roles和effects三个了。这里唯一需要斟酌的就是场景。场景的加载不同项目有不同的做法,有些项目喜欢把场景的Scene文件做好,然后通过通过LoadLevel之类的方法直接加载整个场景Level。有些项目喜欢把场景拆成散文件,然后通过配置去加载预设。如果是直接加载level的,其实可以把scene文件直接拷贝一份过来,或者把原始文件直接设置AssetBundleName打包都可以了。对于第二种情况,我之前的项目做法是把配置文件和LightMap文件拷贝过来,每一个地图的配置文件和LightMap贴图打成同一个AssetBundle,然后用到的场景模型的预设就不放在原始文件夹,而直接放到Prefabs里面了。至于角色和特效,在用的时候,一般一个角色就是一个预设,一个特效就是一个预设,直接放就行了。

最终,到了给程序使用的一步了。由于我们用到的都是在Prefab里面的文件,所以在设置AssetBundleName的时候就可以根据文件夹的结构来写工具,自动设置。一般来说,会有不止一个规则,比如有些文件夹,是需要把文件夹内的每一个文件都打成单独的AssetBundle,有些文件夹是需要把整个文件夹打成同一个AssetBundle。然后依赖文件就按文件夹的需要,某些文件夹必须全部打包依赖,某些文件夹可以不需要打包依赖。
这样,程序最终面对的是Prefabs文件夹里面的路径,作为加载路径,完全不需要关心ArtWorks文件夹里面的原始文件的路径。然后某个资源出错的时候,也可以很快的根据类型定位到出问题的文件夹了。
  评论这张
 
阅读(231)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018