Похоже, что на самом деле использование слоев анимации было бы гораздо интереснее для вас!Я не могу воссоздать полное руководство здесь - посмотрите документы и этот учебник .
Однако Animator.Play имеет необязательный параметр
normalizedTime : Смещение по времени от нуля до единицы.
, чтобы вы могли начать новую анимацию со смещением, в котором текущая анимация находится на
вы можете использовать Animator.GetCurrentAnimatorStateInfo
, чтобы получить текущее состояние, а normalizedTime
текущий клип в
и Animator.GetCurrentAnimatorClipInfo
чтобы получить информацию (например, длину) клипа.
И либо укажите ваш целевой клип (я бы предпочел это), либо вы можете использовать Animator.runtimeAnimatorController
, чтобы получить все AnimationClip
с, а затем использовать 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);
}