C# 松开按钮后,Unity将旋转返回到0

C# 松开按钮后,Unity将旋转返回到0,c#,unity3d,C#,Unity3d,我有一个我写的小游戏,其中我有一个向前移动并左右旋转的物体。当用户按下A对象向左旋转时,如果用户按下D对象向左旋转,则在用户按下键后,如何将旋转设置为0 bool slowbtn = Input.GetKey("s"); bool right = Input.GetKey("d"); if (right == true) { rd.AddForce(sideForce * Time.deltaTime, 0, 0,ForceMode.VelocityChange); rd.tr

我有一个我写的小游戏,其中我有一个向前移动并左右旋转的物体。当用户按下A对象向左旋转时,如果用户按下D对象向左旋转,则在用户按下键后,如何将旋转设置为0

bool slowbtn = Input.GetKey("s");
bool right = Input.GetKey("d");

if (right == true)
{
    rd.AddForce(sideForce * Time.deltaTime, 0, 0,ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, 10 , 0);
}
if (Input.GetKey("a"))
{
    rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, -10 , 0);
}
如果我想在用户释放键时将旋转设置回0,我正在使用此键

if (Input.GetButtonUp("a"))
{
    rd.transform.eulerAngles = new Vector3(0, 0, 0);
}
if (Input.GetButtonUp("d"))
{
    rd.transform.eulerAngles = new Vector3(0, 0, 0);
}

但它不起作用,我不明白为什么,而且它也阻止了我以前的代码,所以如果不向前移动,对象就是Unity的Input.GetButtonUp和Input.GetButtonDown处理“虚拟”按钮,这是您在输入设置中设置的。Input.GetKeyUp/Input.GetKeyDown是关于键盘上的键。因此,您应该选择GetKey或GetButton,但不能同时选择两者

如我所见,您希望对象在用户按下某个键的所有时间内旋转。我建议您在类中使用加法“state”属性:

private State state = State.IDLE;
private enum State {
  LEFT, RIGHT, IDLE
};
更新您的代码:

if (Input.GetKeyDown(KeyCode.D)) {
  state = State.RIGHT;
}
if (Input.GetKeyDown(KeyCode.A)) {
  state = State.LEFT;
}
if (Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp(KeyCode.A)) {
  state = State.IDLE;
}
switch (state) {
  case State.LEFT:
    rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, 10, 0);
  break;
  case State.RIGHT:
    rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, -10 , 0);
  break;
  case State.IDLE:
    rd.transform.eulerAngles = Vector3.zero;
  break;
}
若干建议:

  • 在FixedUpdate()方法而不是Update()中使用物理操作
  • 对键盘键使用Unity的KeyCode枚举
  • 保持代码整洁
  • 首先开发一个算法,然后将该算法转换为代码

  • Unity的Input.GetButtonUp和Input.GetButtonDown处理在输入设置中设置的“虚拟”按钮。Input.GetKeyUp/Input.GetKeyDown是关于键盘上的键。因此,您应该选择GetKey或GetButton,但不能同时选择两者

    如我所见,您希望对象在用户按下某个键的所有时间内旋转。我建议您在类中使用加法“state”属性:

    private State state = State.IDLE;
    private enum State {
      LEFT, RIGHT, IDLE
    };
    
    更新您的代码:

    if (Input.GetKeyDown(KeyCode.D)) {
      state = State.RIGHT;
    }
    if (Input.GetKeyDown(KeyCode.A)) {
      state = State.LEFT;
    }
    if (Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp(KeyCode.A)) {
      state = State.IDLE;
    }
    switch (state) {
      case State.LEFT:
        rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, 10, 0);
      break;
      case State.RIGHT:
        rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, -10 , 0);
      break;
      case State.IDLE:
        rd.transform.eulerAngles = Vector3.zero;
      break;
    }
    
    若干建议:

  • 在FixedUpdate()方法而不是Update()中使用物理操作
  • 对键盘键使用Unity的KeyCode枚举
  • 保持代码整洁
  • 首先开发一个算法,然后将该算法转换为代码
  • 当我替换你的

    Input.GetButtonUp("a")
    

    这完全行得通

    您是否尝试自己调试此代码?因为通过在这一行中设置断点可以很容易地确定没有调用
    Input.GetButtonUp(…)

    我会考虑编写这样的输入代码:

    if (Input.GetKey("d"))
    {
        rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, 10, 0);
    }
    else if (Input.GetKey("a"))
    {
        rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, -10, 0);
    }
    else
    {
        rd.transform.eulerAngles = new Vector3(0, 0, 0);
    }
    
    当我替换你的

    Input.GetButtonUp("a")
    

    这完全行得通

    您是否尝试自己调试此代码?因为通过在这一行中设置断点可以很容易地确定没有调用
    Input.GetButtonUp(…)

    我会考虑编写这样的输入代码:

    if (Input.GetKey("d"))
    {
        rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, 10, 0);
    }
    else if (Input.GetKey("a"))
    {
        rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        rd.transform.eulerAngles = new Vector3(0, -10, 0);
    }
    else
    {
        rd.transform.eulerAngles = new Vector3(0, 0, 0);
    }