Vector2.MoveTowards不要在协程中移动我的对象

时间:2019-11-06 03:28:55

标签: c# unity3d

我有一个Hookshot类,该类包含一个公共协程,当它附加到的对象(该钩子)在另一个脚本中实例化时,我正在调用该协程。目标是使协程CastHookshot将对象移出设定的距离,然后启动ReturnHookshot协程将其移回播放器。平稳的来回运动。将会有其他设计选择禁止我为此使用Mathf.PingPong或Mathf.Sin,因此它必须是两个协程。无论如何,由于某种原因,对象根本没有移动,我也不知道为什么。我使用Debug.Log进行了测试,并知道协程已被击中。传入的castDistance是50,因此循环的条件距离也不是问题。

public class Hookshot : MonoBehaviour
{

    private Vector2 playerPos;
    private readonly float hookshotCastTime = 0.2f;
    private readonly float hookshotReturnSpeed = 4f;
    private readonly float hookshotDistanceBuffer = 0.2f;

    public IEnumerator CastHookshot(float castDistance, Vector2 aimDir)
    {
        playerPos = gameObject.transform.position;
        Vector2 target = playerPos + (castDistance * aimDir);
        float speed = castDistance / hookshotCastTime * Time.deltaTime;
        while (Vector2.Distance(transform.position, target) > hookshotDistanceBuffer)
        {
            transform.position = Vector2.MoveTowards(playerPos, target, speed);
            yield return new WaitForEndOfFrame();
        }
        transform.position = target;
        StartCoroutine(ReturnHookshot());
    }

    public IEnumerator ReturnHookshot()
    {
        Vector2 pos = gameObject.transform.position;
        while (Vector2.Distance(pos, playerPos) > hookshotDistanceBuffer)
        {
            transform.position = Vector2.MoveTowards(pos, playerPos, hookshotReturnSpeed * Time.deltaTime);
            yield return new WaitForEndOfFrame();
        }
    }

}

1 个答案:

答案 0 :(得分:4)

问题可能在一行中

<meta>

您永远不会更新<meta>的值,因此MoveTowards

  

transform.position = Vector2.MoveTowards(playerPos, target, speed); 移至playerPos

每帧都返回完全相同的值,因为您告诉它始终从同一位置开始并且还使用固定的计算距离。

此外,current的乘积应该在每帧进行,因此您实际上为每帧使用正确的值,而不是仅使用第一帧的值来计算它。


请注意,Vector3Vector2不是target,而是Time.deltaTime,因此 value 类型和 NOT 参考类型。似乎您希望它们是引用类型,因此如果您更改classstructpos将会得到更新,但不是! >

您希望将其更改为

playerPos

在第二个例程中也是如此。特别是这里的循环条件将永远不会返回,因为transform.position从未更新!因此将其更改为

float speed = castDistance / hookshotCastTime;

...

transform.position = Vector2.MoveTowards(transform.position, target, speed * Time.deltaTime);