Unity之用代码移动物体(平滑移动)

因为移动的起点和终点都是不确定,所以这里用代码进行实现而不是动画(试过动画,但是发现无法成功添加clip)

物体移动常用的有两个方法,一个是Mathf.MoveTowards,一个是Mathf.Lerp,他们都用于值的平滑过渡

  • Mathf.MoveTowards 
MoveTowards(float current, float target, float maxDelta);

        current:起点位置

        target:目标位置

        maxDelta:每一帧变化的量

        Mathf.MoveTowards:这个函数以固定的步长从当前值逐渐移向目标值。它提供了每帧最大的变化量,确保过渡是平滑的,但速度是固定的

  • Mathf.Lerp
Lerp(float a, float b, float t);

        a:起点位置

        b:目标位置

        t:插值参数,取值范围为0到1,表示要从a过渡到b的进度。

        Mathf.Lerp:这个函数通过根据插值系数在两个值之间进行线性插值来实现平滑过渡。它接受一个范围在0到1之间的插值参数,可以通过调整该参数来控制过渡速度和效果

  • MoveToward和Lerp的区别

        Mathf.MoveTowards:适用于需要按照固定速度进行平滑移动的场景,例如物体的平移、旋转或缩放等。

        Mathf.Lerp:适用于需要根据插值系数进行平滑过渡的场景,例如颜色的渐变、淡入淡出效果、相机的平滑跟随等。

注意:不论是MoveToward还是Lerp,每次运行只会让值变化一次,要让物体实现平滑移动,需要将MoveToward和Lerp方法放进while循环语句中

   while (elapsedTime < moveDuration)
        {
            // 使用插值方法计算当前位置
            float t = elapsedTime / moveDuration;
            Vector3 newPosition = Vector3.Lerp(initialPosition, targetPosition, t);

            // 更新物体的位置
            transform.position = newPosition;

            // 等待一帧
            yield return null;

            // 更新已经经过的时间
            elapsedTime += Time.deltaTime;
        }

这里是用时间条件来限制,在持续时间内移动物体,速度会随着路程的变长而加快,因为Lerp的插值参数是移动百分比,这样物体就能平滑的移动了

  • 扩展

        在unity中可以用Vector3.MoveTowards和Vector3.Lerp来实现物体的位移,这比用Mathf更加的方便,他是一个三维坐标的点对点移动,同时包含了xyz坐标的信息,如果是二维情况下可以用Vector2来代替

由于本人需要物体实现「这种转向一次的移动,所以需要添加中间点,这里如果是用Mathf的方法,代码就要复杂多了

Vector3 targetPosition1 = new Vector3(targetPosition2.x, startPosition.y, 0);

while (obj.transform.position != targetPosition1)//当前位置等于目标位置是跳出循环
        {
            float t = elapsedTime / moveDuration;

            Vector3 newPosition = Vector3.Lerp(startPosition, targetPosition1, t);

            obj.transform.position = newPosition;//新的位置要赋值给物体
            // 等待一帧
            yield return null;

            elapsedTime += Time.deltaTime;
            if(elapsedTime > 5f)
            {
                Debug.Log("移动物体进入死循环");
                break;
            }
        }

这里还用了协程实现了每次移动后等待一帧的操作,最后的if语句是为了防止进入死循环,至此,一个让物体移动的功能就实现了

猜你喜欢

转载自blog.csdn.net/zsdxdfs/article/details/131746305