我找到自己的问题所在了 在这回复下 希望对其他人有帮助Unity在升级到4.3版本之后动画系统做了一些修改,官方尝试用新的更为强大的动画系统替换原来的版本,但可能由于时间或者其他的原因做了一个中间版本,就是现在的4.3版本,按照官方的说法可以兼容4.2的动画系统,已有的动画文件依旧可以在4.3上使用,但新版本的动画系统有一个小Bug,就是材质的UV动画问题,网上查了许多资料,老外们为了解决这个问题,不惜手动修改动画文件,但这个在项目中基本不可能,我们这边的美术只好用4.2做,然后导入4.3,这样是能正常使用的。
Unity这个引擎的优劣已经有很多人说过了,我也就不在这个上面废话,只是阐述一下问题出现的原因,Unity官方的这个修改其实是为了更加优美的去实现UV动画的制作,众所周知,以前做UV动画都是直接去改材质的Scale和Offset,这样就有一个问题,如果这个材质被重复使用,而做UV动画的时候并没有在动画结束的时候把材质的UV参数置回去的话,其他用了这个材质的表现就会出错,这种做法从设计上来说是很邋遢的,一开始我也没想到这个,直到有一天我给美术小哥做一个贴花的效果时在代码里手动去改材质的Scale然后出现了各种的UV错乱问题才发现,因为你如果在某种情况下没有把这个材质的参数给还原,那这个材质的UV就永远是错的了。
Unity在4.3版本对于UV动画是通过修改材质对应的shader里面的_MainTex_ST参数去实现的,和之前的策略不同的是,这个_MainTex_ST参数,只是shader执行的时候的一个变量罢了,它不会对材质有任何的影响,而且它本质上也是获取了材质的Scale和Offset,官方的shader里面大都有o.texcoord =TRANSFORM_TEX(v.texcoord,_MainTex);这样一句对于UV的处理,其内部实现其实是#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) 也就是说,它会用_MainTex_ST的xy去乘材质的UV然后加上_MainTex_ST的zw,_MainTex_ST的xy就是材质的Scale,zw就是材质的Offset。
举个例子,比如说现在有一首歌曲,大家都可以在线听,Unity4.2是某一个人直接可以在自己这里把音乐的速度*2,然后同时在听的所有人都发现速度*2了,这是非常恶心的一件事,而Unity4.3是这个人在自己的耳机上做了一些手脚,然后把音乐速度*2了,不会影响其他人听音乐,这当然是一件好事,它把整个过程变的合理,让你觉得,就应该是这样,但是,Unity把这个优美的实现没做好,不知道动画文件在被执行的时候_MainTex_ST参数为什么没有被传入shader,就导致4.3UV动画的问题了,当然,我这里只是告诉你为什么会有这个Bug,Unity他们在搞什么,为什么把一个好的功能做成了不能用的,至于解决方案,一是和我们的美术小哥一样,用4.2做,然后再导入4.3,另一种是自己写脚本做UV动画,还是用修改_MainTex_ST的方式。
|