Unity中物体以指定的速度匀速移动至目标点

前言

在使用Unity开发时,有时会使用到物体以指定的速度匀速移动至目标点这个功能,用着的DOTween插件里也没有这个功能,本来想在网上搜索找个现成的来使用来着,但没找着合适的… … 所以自己写了个.

方法

    /// <summary>
    /// 当前物体以指定的速度匀速移动至目标点
    /// </summary>
    /// <param name="self"></param>
    /// <param name="target"></param>
    /// <param name="speed"></param>
    /// <param name="onComplete"></param>
    /// <param name="onUpdate"></param>
    /// <returns></returns>
    public static IEnumerator IEConstanSpeedMove(this Transform self, Vector3 target, float speed, Action onComplete = null, Action onUpdate = null)
    {
        while (self.position != target)
        {
            self.position = Vector3.MoveTowards(self.position, target, speed * Time.deltaTime);
            onUpdate?.Invoke();
            yield return 0;
        }
        onComplete?.Invoke();
    }

采用携程的方式便于随时控制取消,而且可以添加位置更新和完成时的回调函数;

测试

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public Vector3 target = new Vector3(0, 6, 0);
    public float speed = 2;

    float t;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopAllCoroutines();
            transform.position = Vector3.zero;
            t = 0;
            StartCoroutine(transform.IEConstanSpeedMove(target, speed, () =>
            {
                print("运动完成,当前位置:" + transform.position + "总用时:" + t);
            }, () =>
            {
                print("当前位置:" + transform.position);
                t += Time.deltaTime;
            }));
        }
    }
}

补充

当前我这个方法是以物体position操作进行匀速目标点移动的.
如果想通过以物体的localPosition来操作进行移动的话可以把localPosition的目标点转换为position就可以了.
例如:如果物体想localPosition移动至new Vector3(8,0,0)的话,采用 target=transform.parent.TransformPoint(new Vector3(8, 0, 0))方法转换为position后再采用那个方法就好了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值