Unity控制动画帧率

一、总体思路:

找到需要开始播放的动画所在时间对应的帧,以及想要结束动画的时间对应的帧,利用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);
    
}

 

若有不足或不理解等任何问题请在评论区留言,看见第一时间回复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值