首页 > 解决方案 > 如何使用 Vector3.MoveTowards Unity 制作对象曲线?

问题描述

我目前正在尝试使对象曲线稍微弯曲,而不仅仅是直接移动到目的地,我将如何做到这一点Vector3.MoveTowards

现在我只有这个物体向另一个叫做“gotocoin”的物体移动;它只是直接移动,感谢您的帮助!

void Update()
{
    if (going == true)
    {
        transform.position = Vector3.MoveTowards(transform.position, gotocoin.transform.position, 3 * Time.deltaTime);
    }
}

标签: c#unity3d

解决方案


正如评论中提到的,您可以使用贝塞尔曲线来解决您的问题。我写了一个简单的代码来演示。它首先计算初始位置和目标位置之间的所有点,然后将脚本附加到的对象移动到每个点。更改 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);
    }
}

推荐阅读