如 cmets 中所述,您可以使用Bezier Curve 来解决您的问题。我写了一个简单的代码来演示。它首先计算初始位置和目标位置之间的所有点,然后将脚本附加到的对象移动到每个点。更改 control1 和 control2 将改变曲线的形状。 Gizmos 方法用于调试,可以去掉。
[SerializeField] private Transform target;//the destination
[SerializeField] private Vector3 offset = new Vector3(4.58f, 4.52f, 0);//determines arch of the curve
private const float DistanceToTarget = 1;
private Vector3 _initialPosition;
private List<Vector3> _allPositions;
private int _counter;
private void Start()
{
_initialPosition = transform.position;
_allPositions = new List<Vector3>(100);
for (var i = 0; i < 100; i++)
{
var newPosition = CubicCurve(_initialPosition, _initialPosition + offset, _initialPosition + offset,
target.position, (float)i / 100);
_allPositions.Add(newPosition);
}
}
private void Update()
{
if (_counter < _allPositions.Count)
{
transform.position = Vector3.MoveTowards(transform.position, _allPositions[_counter], Time.deltaTime);
if (Vector3.Distance(transform.position, _allPositions[_counter]) < DistanceToTarget) _counter++;
}
}
private Vector3 CubicCurve(Vector3 start, Vector3 control1, Vector3 control2, Vector3 end, float t)
{
return (((-start + 3 * (control1 - control2) + end) * t + (3 * (start + control2) - 6 * control1)) * t +
3 * (control1 - start)) * t + start;
}
//since _initialPosition is set on start, the drawn curve is from (0,0,0) if the code is not executed
private void OnDrawGizmos()
{
for (var i = 0; i < 100; i++)
{
var newPosition = CubicCurve(_initialPosition, _initialPosition + offset, _initialPosition + offset,
target.position, (float)i / 100);
Gizmos.DrawSphere(newPosition, 1f);
}
}