C#Unity GetKeyDown()未正确检测

时间:2018-08-21 23:36:01

标签: c# unity3d

所以我有一个雪橇原型。我目前正在编写一些控件,以补充我已应用的RigidBody物理原理。我的目标是在向左或向右转的相反方向施加力,以获得某种打滑,边缘捕捉效果,然后向前施加力以补偿动量的损失。

但是我不能走那么远,因为无论出于什么原因我都无法使GetKeyDown()或GetKeyUp()函数正常工作。我已包含以下代码。基本上发生的是“释放按钮”。文本会不断输出,然后偶尔我会得到“按下按钮”的输出,该输出仅发生一次,然后恢复为“释放按钮”。输出。即使这样,也很少见。通常我没有发现任何迹象。

我确定我缺少一些微小的东西,并且我一直在寻找类似的问题,但是似乎没有一个问题能够解决我的问题。如果有人可以给我任何想法,我将不胜感激。同样,任何优化技巧将不胜感激。我还是C#和Unity的新手。

我正在进行调整和实验,因此如果我错过了一些不必要的评论,我深表歉意。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PlayerController : MonoBehaviour
    {

    private Rigidbody rb;
    public bool sidePhysics;
    public bool keyPress;

    // Use this for initialization
    void Awake()
    {
        rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame
    void FixedUpdate()
    {
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * 50.0f;
        // No vertical controlls for now.
        //var z = Input.GetAxis("Vertical") * Time.deltaTime * 40.0f;


        // Get axis against which to apply force
        var turnAngle = rb.transform.position.x;




        transform.Rotate(0, x, 0);
        //transform.Translate(0, 0, z);


        // Debug to test input detection
        keyPress = Input.GetKeyDown(KeyCode.A);
        Debug.Log("keyPress: " + keyPress);

        // On either right or left key input down, apply force
        // Later once keys are being detected - addForce forward too 
        if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.LeftArrow)
           || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))
        {
            Debug.Log("Button pressed. ");

            // Add opposing force proportionate to the degree of the turn
            rb.AddForce((turnAngle * (-x * 10)), 0, 0, ForceMode.Acceleration);
        }
        else
        {
            Debug.Log("Button released.");
        }



        //Debug.Log("RigidBody: " + rb +
        //          "   Rotation: " + x +
        //          "   turnAngle: " + turnAngle);


    }
}

2 个答案:

答案 0 :(得分:3)

如果要在按住键时不断地执行操作,请使用Input.GetKey函数。如果您想在按下键时一次一次做某事,则可以使用Input.GetKeyDown函数,因为只有在释放并再次按下该键时该函数的值为一次。了解两者之间的区别很重要。

现在,要检测按钮何时被释放,请在检查else之后不要使用Input.GetKey语句。您不会获得想要的效果。要检测何时释放按钮,请使用Input.GetKeyUp函数。在此添加另一个if语句。

更像这样:

if (Input.GetKeyDown(KeyCode.A))
{
    //KEY PRESSED
}

if (Input.GetKey(KeyCode.A))
{
    //KEY PRESSED AND HELD DOWN
}

if (Input.GetKeyUp(KeyCode.A))
{
    //KEY RELEASED
}

最后,您应该始终检查Update函数而不是FixedUpdate函数中的输入。

答案 1 :(得分:1)

除了程序员所说的:

请勿在{{1​​}}内使用GetKeyDown()(和类似名称)

FixedUpdate()仅在密钥更改状态后对单次更新调用返回true。由于GetKeyDown()的运行是定期进行的,因此可能会错过(运行得太晚)而无法看到密钥已更改的状态(因为调用了两个FixedUpdate:一个是正确的,然后是下一个将其重新设置为false的对象。

来自this answerdocs

  
    

由于状态每帧都会重置,因此您需要从Update函数调用此函数

  
     

关于Rutter对Update的评论[...],尽管文档中没有明确说明,但我对GetKey()所做的评论仍然适用于GetKeyDown()