赞
踩
在正常的Renderer下(或者继承于Renderer的)下,大家做材质动画是比较方便的,如下:
这个就是个很简单的例子,shader的属性在你Add Pr也都会列在animation这里, 你只要点 + 就行了,比如这个_TestColor
但是,在UI这里,由于现在UI是以package存在的,其实引擎里只有基本的canvas, canvasrender, canvasmanager几个类,具体的实现都是在外面的包里,其实都是monobehavior
,这里就只能看到Material, 但是这个只是作为一个普通的属性存在的,不没有具体的属性可以操作。这样就比较蛋疼,UI如果要做材质动画就不好做了。
unity有属性的generic的绑定,当然也有自定义的绑定,大家可以参见RuntimeGraphicsRendererAnimationBinding.cpp,基本比较清楚了,(另外还有一堆xxxRendererAnimationBinding,MonoBehaviourAnimationBinding)他里面有一般的绑定,材质的绑定,还有自己定义的几个属性的绑定,大家基本照着抄
就可以。几个注意的点:
1.如果是新的绑定类型,则需要到ModulesAnimationBoundCurve.h 加一个enum值,一个类可以有多个enum,但是一个enum值只能对一个类,不然报错,几个主要的虚函数大家可以看下。
2.要加的属性,是绑定的Object的属性,不然不能自动数值修改传递
3.unity有个绑定属性的注册机制,可以参看 EditorSrcAnimationAnimationModeSnapshot.cpp这个文件,一些额外的属性,需要在bool AnimationModeSnapshot::AddPropertyModificationForExceptions 加上,自己看例子抄。
注册可以看 GetDrivenPropertyManager().RegisterPropertyModification函数。如果不注册绑定,你在重启unity后,你的这个以前做的animation和GO的绑定,unity是不认识的,你要重新生成新的animation.
由于unity UI的实现机制,它的UI控件其实都是MonoBehavior,我们能集中处理的地方就是在canvasrender里面(其实都是往这里设置的,texture,mesh,material等),但是由于我们修改的属性不是canvasrender本身的,
所以并不能直接进行modifiedproperty的传递,所以我这里其实是做了一个转接。
大家看RendererAnimationBinding,它在用材质的时候,是有一个变量的。ShaderPropertySheet* m_RendererProperties; 这个变量在我看来,是个animation变化过程中值的一个cache的地方,getfloat和setfloat都作用在这个变量上,
这个变量大家可以看到,其实是material的属性的容器,mat→GetProperties()返回的就是这个类型的变量,当然大家也可以另外的做法。
我最初就是看到数据动了,但是就是不能反应到实际的mat上的变化。后来我桥接了下,直接去设置对应mat的数据了(最原先去copy ShaderPropertySheet 不行,还是直接设置好,会标记修改),大致代码如下:
(有Unity源码的部分我就不贴了)
这里其实抄了下GetFloat函数里的东西,取出它设置好的值,然后拿来设置到目标mat, 细节e问题可以自己尝试下。 这样目前测试下来基本可以,也支持Hdrcolor。
其实整个的绑定的东西,流程等还是挺杂乱的,如果大家有好的方法,可以一起讨论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。