描述状态
在 Milease 中,你可以通过 MilStateAnimator 在两个状态中切换,动画机将会应用过渡动画。
使用 bool 表达式描述状态
它的写法如下:
MAni.States(() =>
obj.member == val &&
obj.member == val &&
...
);
例如,我们需要描述这样一种状态:
- 背景颜色是白色
- 文本颜色是黑色
- 字母间距是5f
那么它就可以写作:
MAni.States(() =>
background.color == Color.white &&
text.color == Color.black &&
text.characterSpacing == 5f &&
);
动画机将默认使用 Quad
In
缓动过渡状态,如果你需要使用其他缓动,则需要使用以下写法:
MAni.States(() =>
(obj.member == val || MAni.Ease(easeFunction, easeType)) &&
obj.member == val &&
...
);
例如,我们现在需要描述这样一种状态:
- 背景颜色是白色(使用
Back
In
缓动) - 文本颜色是黑色(使用
Cubic
Out
缓动) - 字母间距是5f(使用
Quad
In
缓动)
那么它就可以写作:
MAni.States(() =>
(background.color == Color.white || MAni.Ease(EaseFunction.Back, EaseType.In)) &&
(text.color == Color.black || MAni.Ease(EaseFunction.Cubic, EaseType.Out)) &&
text.characterSpacing == 5f &&
);
信息
它是如何工作的?
传入的 bool 表达式将作为一个 Expression<Func<bool>>
被解析,通过不断展开表达式节点,利用反射获得相关成员、计算目标值。
使用扩展方法描述子状态
除了使用 bool 表达式构造状态,你也可以通过 object
类型的扩展方法构造:
object.MilState(x => x.member, value, [easeFunction], [easeType]);
其中第一个参数与基本动画的描述方法类似,是一个成员选择器,用于选择具体的成员。
我们使用同样的例子,描述这样一种状态:
- 背景颜色是白色
- 文本颜色是黑色
- 字母间距是5f
那么用此方法就可以写作:
new []{
background.MilState(x => x.color, Color.white),
text.MilState(x => x.color, Color.black),
text.MilState(x => x.characterSpacing, 5f),
};
同样的,如果需要自定义缓动类型:
- 背景颜色是白色(使用
Back
In
缓动) - 文本颜色是黑色(使用
Cubic
Out
缓动) - 字母间距是5f(使用
Quad
In
缓动)
那么用此方法就可以写作:
new []{
background.MilState(x => x.color, Color.white, EaseFunction.Back),
text.MilState(x => x.color, Color.black, EaseFunction.Cubic, EaseType.Out),
text.MilState(x => x.characterSpacing, 5f),
};