【问题标题】:Block user input without affecting the movement在不影响移动的情况下阻止用户输入
【发布时间】:2020-01-14 00:57:39
【问题描述】:

我有这个移动脚本来移动我的角色:

Vector3 vector = Vector3.zero;

if (Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S))
{
   vector += Vector3.forward;
}
else if (Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.W))
{
   vector += Vector3.back;
}

if (Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.D))
{
   vector += Vector3.left;
}
else if (Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.A))
{
   vector += Vector3.right;
}

if (grounded) 
{
   transform.Translate(vector.normalized * movementSpeed * Time.deltaTime);
}

我还有一个碰撞检测代码会影响布尔值grounded。我用它来检测玩家何时跳跃。
当角色不在地面上时,我想这样做,玩家无法移动它,但角色仍在跳跃前的方向移动。现在,如果我跳跃,角色就会停在半空中。 我想我可以使用我的 RidgidBody,但我认为这不是正确的选择。
有什么想法吗?

【问题讨论】:

  • 如果您希望您的角色继续移动,例如他向前奔跑,现在跳跃,那么使用刚体移动似乎很合乎逻辑。您不想要的只是您不希望用户输入改变他最初前进的方向或能够再次跳跃
  • 您为什么认为Rigidbody 不正确?
  • @BugFinder 我可以使用 RidgidBody.MovePossition(),但我仍然要怎么做才能不让玩家在空中移动角色? (我对这些东西有点陌生)
  • 使用刚体你给它动量或速度,它会为你处理它

标签: c# unity3d


【解决方案1】:

在您的代码中,transform.Translate(vector.normalized * movementSpeed * Time.deltaTime); 是使您的角色实际移动的原因。由于您已将if (grounded) 置于下方,这意味着如果接地为假,该角色将完全停止移动(只要您没有其他任何东西使其移动)。

相反,您想要做的是保持vector 在您跳跃时所处的状态,以便您的角色将继续朝同一个方向移动。您可以通过将整个输入块置于if (grounded) 条件下并将向量作为全局变量而不是局部变量来实现。如下所示:

在类中而不是在函数中声明vector

Vector3 vector;

然后是实际的逻辑代码:

if (grounded) 
{
  vector = Vector3.zero;

  if (Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S))
  {
     vector += Vector3.forward;
  }
  else if (Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.W))
  {
     vector += Vector3.back;
  }

  if (Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.D))
  {
     vector += Vector3.left;
  }
  else if (Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.A))
  {
     vector += Vector3.right;
  }
}

transform.Translate(vector.normalized * movementSpeed * Time.deltaTime);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多