【Unity随手记】在Update里限制范围边缘抖动问题

发现的问题:如图,我限制了小飞机的移动范围,移动到最左边,再按住左键,会出现左右抖动。
理想状态应该不抖动才对啊,这是什么原因导致的呢?
请添加图片描述


我的实现代码:

    void Update()
    {
    
    
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        GetComponent<Rigidbody>().velocity = movement * speed;
        GetComponent<Rigidbody>().position = new Vector3
        (
            Mathf.Clamp(GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax),
            0f,
            Mathf.Clamp(GetComponent<Rigidbody>().position.z, boundary.zMin, boundary.zMax)
        );

        GetComponent<Rigidbody>().rotation = Quaternion.Euler(0.0f, 0.0f, GetComponent<Rigidbody>().velocity.x * -tilt);
    }

我把代码写在了Update里了,这就是问题所在,Update是每帧都执行一次,每帧时长是有所浮动的,进而造成代码执行的时长也不同,所以导致了上面的那种抖动的效果。假如游戏1秒60帧,此时的每帧时长为1/60秒,你会看到小飞机丝滑的从A点运动到B点,并且期间你还可以轻松的让它停下来;假如1秒30帧,此时的每帧时长为1/30秒,小飞机每走1帧,相当于走了60帧中的2帧;再假如1秒1帧,此时的每帧时长为1秒,你只会看到小飞机瞬间跑到了B,并且由于卡顿你无法让他停止。
现在应该可以理解为什么会出现抖动问题了,每帧的时长不固定,有长有短,长的话代码跑的时间长一点,飞机走的更远一点;短的话,飞机走到近一点,所以就会产生上图的抖动。解决方案也很简单,就是放在FixedUpdate里固定时长执行。
你可以使用不同的FixedTime来模拟不同的帧速率,你会发现帧速率越高,越精确,越能限制到边缘值。


个人粗糙理解,仅供参考,欢迎指正

猜你喜欢

转载自blog.csdn.net/m0_55907341/article/details/123260354
今日推荐