【问题标题】:How Would I Make an Object Curve With Vector3.MoveTowards Unity?如何使用 Vector3.MoveTowards Unity 制作对象曲线?
【发布时间】:2021-08-13 03:15:05
【问题描述】:

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

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

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

【问题讨论】:

  • 你能画出你想要达到的效果吗?
  • 您可以使用Bezier Curve。绘制弯曲的弹丸很常见。

标签: c# unity3d


【解决方案1】:

如 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);
    }
}

【讨论】:

  • 我怎样才能改变他们的移动速度
  • 将 Vector3.MoveTowards 的 Time.deltaTime 乘以一个因子
  • 哦,非常感谢您的帮助!让它工作
  • 我有一个问题,我的玩家,如果他的目标对象改变了位置,它不再向它弯曲我该如何解决这个问题,我的对象有时可能会升高或降低,所以我想不断检查位置
  • 这是因为曲线的点是在Start方法中计算的。您可以创建一个在 Start 中运行 for 循环的方法。因此,每当目标移动时,调用此方法并更新点。重要的是要知道,你也可以在update方法中运行代码,让起点为玩家的位置,终点为目标的位置;但是,三次曲线的 t 参数会立即为 1,从而导致奇怪的行为(更改代码并查看)。如果你设法找到更好的方法来增加 t,曲线会自动更新。
【解决方案2】:

尝试在统一的动画系统中使用动画曲线。希望这会有所帮助?

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2019-07-21
    相关资源
    最近更新 更多