团结Animator.Play如何在同一时间过渡到另一个动画(Unity Animator.Play

2019-09-30 02:42发布

我公司目前已在运行播放器基于精灵动画。 我也有另一个动画,玩家正在运行,拿着枪出去和射击,这在完全相同的速度扮演玩家没有枪运行。 美中不足的是,我使用Animator.Play();

我想是开始玩家在框架与枪的动画运行的播放器上运行的动画是目前。 例如,如果播放器中运行的动画在第20帧,而玩家按下拍摄按钮,玩枪的动画运行在第20帧。

这里是我的代码粗略的例子至今:

if (!shooting) {animator.Play("PlayerRunning");}

if (shooting) {animator.Play("PlayerRunningShoot");}

我认为最好的例子是NES游戏曼佳美洛克人拍摄animataion,当您按下其中‘B’运行的同时,他的手臂就会立刻弹出拍摄的一个。

如果有任何的这是什么我问混乱,让我知道。

Answer 1:

它看起来像实际使用动画层将是你的方式更有趣! 我不能在这里重建一个完整的手册-窥视文档和本教程 。


然而, Animator.Play有一个可选的参数

normalizedTime:时间零和一之间的偏移。

这样你就可以开始新的动画与胶印当前动画是在

您可以使用Animator.GetCurrentAnimatorStateInfo来获得当前状态和normalizedTime当前剪辑是在

Animator.GetCurrentAnimatorClipInfo得到剪辑的信息(例如,长度)。

,要么参考目标素材(我宁愿),也可以使用Animator.runtimeAnimatorController让所有AnimationClip S和比使用LinQ FirstOrDefault找到一个与目标名称:

(在我的智能手机打字这么不作任何保证)

using System.Linq;

// ...

if (!shooting)
{
    // assuming layer 0
    var state = animator.GetCurrentAnimatorStateInfo(0);
    var clipInfo = animator.GetCurrentAnimatorClipInfo(0);

    // so the time you want to start is currentNormalizedTime * current.length / newClip.length
    // if your clips will always have the exact same length of course you can
    // simply use the currentNormalizedTime
    var currentNormalizedTime = state.normalizedTime;
    var currentRealtime = currentNormalizedTime * clipInfo[0].clip.length;

    var newClip = animator.runtimeAnimatorController.animationClips.FirstOrDefault(c => string.Equals(c.name, "PlayerRunning"));

    var newNormalizedTime = currentRealtime / newClip.length;

    // for some reason it seems you can not use the optional parameters as you usually would
    // like ("PlayerRunningShoot", normaizedTime = newNormalizedTime)
    animator.Play("PlayerRunning", -1, newNormalizedTime);
}

if (shooting)
{
    var state = animator.GetCurrentAnimatorStateInfo(0);
    var clipInfo = animator.GetCurrentAnimatorClipInfo(0);
    var currentNormalizedTime = state.normalizedTime;
    var currentRealtime = currentNormalizedTime * clipInfo[0].clip.length;

    var newClip = animator.runtimeAnimatorController.animationClips.FirstOrDefault(c => string.Equals(c.name, "PlayerRunning"));

    var newNormalizedTime = currentRealtime / newClip.length;

    animator.Play("PlayerRunningShoot", -1, newNormalizedTime);
}

你也可以使用创建运行时的平稳过渡

Animator.CrossFade或Animator.CrossFadeInFixedTime

if (!shooting) 
{
    // ...       

    // here the transition takes 0.25 % of the clip
    animator.CrossFade("PlayerRunning", 0.25f, -1, 0, newNormalizedTime);
}

if (shooting) 
{
    // ...

    // here the transition takes 0.25 seconds
    animator.CrossFadeInFixedTime("PlayerRunningShoot", 0.25f, -1, 0, newNormalizedTime);
}


文章来源: Unity Animator.Play how to transition to another animation at the same time