
在这篇文章中,我将解释为避免Unity的最后一个动画系统Mecanim来为Unity UI的Image组件实现简单过渡动画的两种方式,这是因为我认为Mecanim与从点开始的简单动画相比有点复杂我需要做的A到B点,所以我试图寻找一个更简单的解决方法。
在这种情况下,我尝试了两种不同的解决方案,第一种尝试使用的是Animation Legacy,第二种是保存蓝色球体必须往返的位置并准备合适的代码。
我将开始考虑上图设计中的按钮和球体位置来说明这两种解决方案。 动画的工作原理如下:单击一个按钮时,蓝色球体将从最后单击的按钮沿x轴移动到作为标记被单击的当前按钮,以知道哪个是最后选择的按钮或用户当前正在访问的部分。
Unity 2017 2D游戏开发项目:使用Unity创建三个互动且引人入胜的2D游戏…
使用Unity 2D工具集构建经典的街机,射击游戏和平台游戏主要功能利用令人惊叹的新功能…… www.amazon.com
解决方案1:旧版动画
当我们要使用Animation Legacy时,第一步是向Blue Sphere GameObject添加一个Animation组件 ,否则,当我们打开Animation面板并创建一个新Animation时,Animator将被附加到我们的GameObject和Animation不会成为传统。
将已创建的动画上的“动画”组件更改为“动画旧版”组件的另一种方法是,单击“检查器”右侧的3水平条图标激活“调试”,然后选中“动画”上的“旧版”。

下一步是创建球体移动所需的动画,在此示例中,每隔15秒,我们沿x轴设置一个动画点,每个位置与每个按钮位置相关:

对于每个动画位置,我们将定义一个动画事件 (通过单击动画标签下方栏的最后一个图标来创建),当动画通过这些事件时,将以这种方式调用StopAnimationSphere(int unit) ,我们将对其进行比较如果用户选择了带有选定单位按钮的参数单位,则用户单击该按钮可以停止球体的动画(如果两者都重合)。
我们继续启动球体动画的代码:
公共动画sphereTweenMenu ;
int previousUnit;
浮动previousPosition;
void AnimateSphereFromUnitMenu ( int单位)
{
//我们需要保存前一个单元才能知道哪个方向
//然后从该点开始将球体设置为动画
如果 ( previousUnit <= unit)
{
sphereTweenMenu [“ SphereAnimationMenuTween”]。 速度 = 1;
}
否则, 如果 ( previousUnit > unit)
{
sphereTweenMenu [“ SphereAnimationMenuTween”]。 速度 = -1;
}
sphereTweenMenu [“ SphereAnimationMenuTween”]。 时间 = previousPosition ;
sphereTweenMenu 。 播放 (“ SphereAnimationMenuTween”);
//“动画时间”参数从0到1,因此我们需要将“动画”窗口中的时间秒位置转换为等效时间。 将所有这些值存储在与枚举单位相关的数组中以保持代码的清洁和更好的可读性将是很有趣的,在第二种解决方案中考虑了这一点:)
if (MapManager。unitSelected ==( int ) Units.One )
{
previousPosition = 0f;
}
否则 (MapManager。unitSelected ==( int ) Units。2 )
{
previousPosition = 0.25f;
}
否则 (MapManager。unitSelected ==( int ) Units。Three )
{
previousPosition = 0.50f;
}
否则, 如果 (MapManager。unitSelected ==( int ) Units。4 )
{
previousPosition = 0.75f;
}
否则 (MapManager。unitSelected ==( int ) Units。All )
{
previousPosition = 1f;
}
否则 (MapManager。unitSelected ==( int ) Units。None )
{
previousPosition = 1.25f;
}
previousUnit =单位;
}
下一个函数是从Animation Event调用的函数,当Animation Event中的参数与最后单击的按钮相同时,动画将停止:
公共 无效 StopAnimationSphere ( int单位)
{
如果 (unit == MapManager。unitSelected )
{
sphereTweenMenu 。 停止 ();
}
}
该方法的结论:该解决方案的优点是整洁且易于维护(假设您必须添加更多按钮),不利的一面是,在我的情况下,有时球体不会停留在动画的确切位置在“动画”窗口中定义,并且在某些UI设计中可能会出现问题(想象球体进入紧密的形状,无法完全居中或完全不在内部),第二个缺点是它很旧,有一天Unity会停止支持它。
精通Unity 2D游戏开发-第二版
通过开发完整的RPG游戏框架,掌握使用Unity 5构建2D游戏所需的一切!关于此… www.amazon.com