欢迎光临散文网 会员登陆 & 注册

unity:使协程不受帧率干扰的影响

2023-09-02 16:07 作者:钅离_LX  | 我要投稿

(个人记录,记得很随便)

提出问题

这是一个unity的协程方法,可以物体从小到大平滑过渡缩放

很简单的,小学二年级都可以写出来

    private IEnumerator Scale(float speed)
    {
        transform.localScale = Vector3.zero;
        while (localScale.magnitude - transform.localScale.magnitude > 0.01f)
        {
            float y = Mathf.SmoothStep(transform.localScale.y, localScale.y, Time.fixedDeltaTime * speed);
            transform.localScale = new Vector3(localScale.x, y, localScale.z);
            yield return 0;
        }
    }

实操发现,这个协程会受到游戏帧率的影响

我尝试修复,接连尝试了deltaTime、fixedTime、unscaledTime、fixedUnscaledTime都无济于事(修了一上午)

解决问题

后面,我与ChatGPT想到了一个绝妙的方法:

可以考虑使用实际时间(例如使用Time.time)进行缩放过渡,而不是依赖于帧率!!

这是最终的代码,效果非常好:

    private IEnumerator Scale(float speed)
    {
        transform.localScale = Vector3.zero;
        float startTime = Time.time;
        float duration = (localScale.magnitude - transform.localScale.magnitude) / speed;

        while (Time.time - startTime < duration)
        {
            float t = (Time.time - startTime) / duration;
            float y = Mathf.SmoothStep(0f, localScale.y, t);
            transform.localScale = new Vector3(localScale.x, y, localScale.z);
            yield return null;
        }

        transform.localScale = localScale;
    }


unity:使协程不受帧率干扰的影响的评论 (共 条)

分享到微博请遵守国家法律