Vector3.Lerp 不会移动我的对象,尽管我的调试说它应该

Vector3.Lerp won't move my object despite my debugging saying it should

所以这是针对 FPS 游戏中瞄准瞄准器的动作。当玩家右键单击时,该协程将被启动,它将玩家的右手从“空闲”位置移动到“瞄准”位置。 到达瞄准位置后,会激活 Hitbox,并播放动画。

public float ChargeTime;
public Vector3 TargetPosition;

public override IEnumerator Attack(PlayerController player)
{
    float elapsedTime = 0f;
    Vector3 currentPos = player.RightHand.transform.localPosition;

    while (elapsedTime < ChargeTime)
    {
        elapsedTime += Time.deltaTime;
        player.RightHand.transform.localPosition = Vector3.Lerp(currentPos, TargetPosition, (elapsedTime / ChargeTime));

        yield return null;
    }

    player.RightHand.transform.localPosition = TargetPosition;

    player.Hitbox.SetActive(true);
    player.RightHandAnimator.SetBool("IsHolding", true);

    yield return null;
}

我一直在检查这段代码,一切都应该按预期工作。 Debug.Logs 会告诉我我已经到达这个代码一次,我正在正确地循环这个 while() 函数,Lerp 的 t 变量确实从 0 正确地增加到 1,并且 hitbox 正确地在 while() 结束时触发...但是手只是拒绝移动。

我已经三重和四重检查了 RightHand 变量是否确实引用了正确的对象,并且没有其他代码干扰(没有其他任何东西可以使该特定对象移动)。

我不明白 Vector3.Lerp 是如何工作的吗?我错过了什么?

谢谢!

编辑:“覆盖”是因为此 class 派生自具有虚拟攻击协程的“武器”,它被不同类型的武器子classes 覆盖。

到底发生了什么?手根本就不动吗? 你的代码在我看来没问题。在这条线的循环结束时手是否移动..?

player.RightHand.transform.localPosition = TargetPosition;

如果不是的话,问题是TargetPosition字段不对。您可以忽略 lerp 并尝试让那一行正常工作,一旦它正常工作,您的 lerp 也应该可以正常工作。

您可以尝试将它从 public Vector3 简单地更改为 Transform 并将对空白游戏对象的引用拖到其中,并在 lerp 中使用它的 transform.position 字段(游戏对象将位于您希望手到达的位置)这对我来说更有意义,但可能不适合您的游戏。我不知道。

在我看来你的播放器上有一个 Animator 会影响右手的位置 - 至少 player.RightHandAnimator 让我想到了 ;)

Animator 是帧中最后执行的事情之一,一旦它在 player.RightHand.transform.localPosition 上保持任何状态的任何关键帧,它总是会否决您在其中所做的任何更改代码!

您可以同时将其关闭并执行例如

public override IEnumerator Attack(PlayerController player)
{
    player.RightHandAnimator.enabled = false;

    var rightHand = player.RightHand.transform;

    var currentPos = rightHand.localPosition;

    for(var elapsedTime = 0f; elapsedTime < ChargeTime; elapsedTime += Time.deltaTime)
    {
        rightHand.localPosition = Vector3.Lerp(currentPos, TargetPosition, elapsedTime / ChargeTime);

        yield return null;
    }

    rightHand.localPosition = TargetPosition;

    player.Hitbox.SetActive(true);
    player.RightHandAnimator.enabled = true;
    player.RightHandAnimator.SetBool("IsHolding", true);
}