所以我有一个雪橇原型。我目前正在编写一些控件,以补充我已应用的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);
}
}
答案 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 answer和docs:
由于状态每帧都会重置,因此您需要从Update函数调用此函数
关于Rutter对
Update
的评论[...],尽管文档中没有明确说明,但我对GetKey()
所做的评论仍然适用于GetKeyDown()
。