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);
}
所以这是针对 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);
}