一、总体思路:
找到需要开始播放的动画所在时间对应的帧,以及想要结束动画的时间对应的帧,利用fixedupdate更新,从开始帧播放到结束帧,每次更新一帧。这里可以调整Fixedupdate更新的频率。在播放前初始化动画参数,播放完成后强制更新动画状态。
下面附上源码。
物体脚本,假设物体上有Animator ,物体name为A
Animator animator = A.GetComponent<Animator>();
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
SetWaGouAnimationFrame(animator , "animatorname", 0f, 0);//初始化帧率
int totalFrames = Mathf.RoundToInt(stateInfo.length * 24);//每秒24帧*动画播放1倍速总时间==一共需要的总帧数
InfoFrame = 0;
//计算动画的总长度,到哪一帧播放
public void SetWaGouAnimationFrame(Animator animator, string animationName, float frame,int speed)
{
int frameRate = 24;//动画的帧率,这里我的是24,你可以去动画具体看自己,进度条最右边FPS就是
float normalizedTime =frame / Mathf.RoundToInt(animator.GetCurrentAnimatorStateInfo(0).length * frameRate);//先计算总长度时间*帧率然后作为总帧长度,用传入的帧数值/总的算出需要播放到多少帧
animator.Play(animationName, 0, normalizedTime);//动画从normalizedTime开始播放
animator.speed = speed;//设置播放速度
}
//手动更新一次动画帧
public void GetFrameDate(Animator animator, int totalFrames,int currentFrame, int startFrame,int endFrame)
{
this.totalFrames = totalFrames;//总帧数
this.startFrame = startFrame;//开始帧
this.endFrame = endFrame;//结束帧
this.currentFrame = currentFrame;//当前帧
CanUpdateAnimation = true;
animator.speed = 0f; // 设置动画播放速度
}
if (CanUpdateAnimation)
{
Animator animator = A.GetComponent<Animator>();
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (currentFrame<= endFrame)
{
UpdateWaGouAnimationFrame(animator , "animatorname", currentFrame, totalFrames);
currentFrame += 1;
float normalizedTime = stateInfo.normalizedTime;
Debug.Log("当前动画在第 " + Mathf.RoundToInt(normalizedTime * totalFrames) % totalFrames + " 帧");
}else if (currentFrame >= endFrame)
{
CanUpdateAnimation = false;
animator.speed = 0;
}
}
public void UpdateWaGouAnimationFrame(Animator animator, string animationName, int frame,int totalFrames)
{
float NormalizedTime = (float)frame / totalFrames;
animator.Play(animationName, 0, NormalizedTime);
animator.Update(0);
}
若有不足或不理解等任何问题请在评论区留言,看见第一时间回复