前言
在使用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后再采用那个方法就好了.