【问题标题】:Keyboard input works on some occasions but not others键盘输入在某些情况下有效,但在其他情况下无效
【发布时间】:2021-10-28 14:26:14
【问题描述】:

所以,过去几周我一直在努力学习 Unity。作为一个入门项目,我决定尝试复制手机游戏 Pop the Lock。现在,我的键盘输入出现了一些问题,我不知道如何解决。

这就是我的游戏屏幕的样子:GameScreen。红条是玩家,黄圈是目标。随着游戏的进行,玩家会围绕圆环向目标旋转。

基本上,如果玩家和目标接触并且玩家同时按下空格键,玩家应该获得一分。目标也应该被摧毁,一个新的目标应该随机生成在游戏屏幕的某个地方。目前,这个系统工作......大部分时间。大约 80% 的时间我的代码正常运行,但大约 20% 的时间我的代码在玩家按下空格键时没有注册,因为两者发生碰撞。这是我的代码:

public class Target: MonoBehaviour {

   public GameObject target; 

   void Update () {
     if (Input.GetKeyDown("space")) {
        Debug.Log("SPACE PRESSED!!");
     }
   }

  private void OnTriggerEnter2D (Collider2D collision) {
    Debug.Log("Collision!");
  }

  private void OnTriggerStay2D(Collider2D other) {

     // This is the part that sometimes isn't registering:
     if (Input.GetKeyDown("space")) {

        Debug.Log("HIT!!");
        Score.score++;
    
        // Code to spawn new Target on random place in the ring:
        // Seems to be working as intended:
        
        float distance = 2.034822f;
        float x = Random.Range(-2f, 2f);
        float y = Mathf.Pow(distance,2) - Mathf.Pow(x,2);
        y =  Mathf.Sqrt(y);
        float[] options = {y, -y};
        int randomIndex = Random.Range(0, 2); 
        y = options[randomIndex];
        Vector3 vector = new Vector3(x, y, 0);
        GameObject newTarget = Instantiate(target, vector, Quaternion.identity);
        Destroy(gameObject);
     }

  }

}

正如你所看到的,我有日志语句,每次玩家和目标触摸时打印一些东西,每次按下空格键,每次在他们接触时按下空格键。这就是一切正常时控制台的样子:Image One。这是我的代码不工作时控制台的样子:Image Two。

因此,即使它不起作用,碰撞和按键仍会同时记录。但是由于某种原因,命中本身没有被注册(所以 if 条件没有通过)。因此,我非常有信心这不仅仅是输入延迟或我在错误的时间按下了键。正如我上面提到的,这只发生在大约 20% 的时间里,这让我更加困惑。 Target 有一个触发器 collider2D,它还有一个动态 RigidBody2D,其重力比例设置为 0(正如我被告知的那样)。任何帮助将不胜感激。

(我的对撞机和刚体的外观:Image)

【问题讨论】:

  • 请使用正确的标签!请注意,unityscript 是或更好地曾经是一种 JavaScript 风格,类似于早期 Unity 版本中使用的自定义语言,并且现在早已弃用了!您的代码显然是c#!你应该做的是标记unity3d,因为这是你在这里使用的主要框架/API
  • 您可能应该查看docs.unity3d.com/Manual/ExecutionOrder.html 并注意触发器作为物理事件发生,输入作为更新(使用脚本顺序)作为游戏逻辑处理。

标签: c# unity3d


【解决方案1】:

您可以做的事情是在更新循环中按下键时设置一个标志变为真,因此更新循环将转换为:

private bool isSpacePressed = false;

update() {
  isSpacePressed = false;
  if (Input.GetKeyDown(KeyCode.Space)){
    isSpacePressed = true;
  }
}

所以每个循环标志都会被设置为 false,除非你按下空格键和 OnTriggerStay2D 而变成类似

OnTriggerStay2D () {
  if(isSpacePressed){
    .. do magic.. 
  }
}

看我把 Input.GetKeyDown('space') 换成 Input.GetKeyDown(KeyCode.Space) 我推荐用这个来避免打字错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多