输入只存储两个值?
Input only stores two values?
当按下两个键再按第三个键时,都没有松开,Input.GetKeyDown不知道第三个键已经按下
这是我的代码:
public class Keys
{
internal bool leftPressed = false;
internal bool rightPressed = false;
internal bool upPressed = false;
internal bool downPressed = false;
}
public Keys keys = new Keys();
void Start () {
}
void Update ()
{
updateButton(KeyCode.LeftArrow);
updateButton(KeyCode.RightArrow);
updateButton(KeyCode.UpArrow);
updateButton(KeyCode.DownArrow);
}
void updateButton(KeyCode key)
{
if (Input.GetKeyDown(key))
{
if (key == KeyCode.LeftArrow)
keys.leftPressed = true;
if (key == KeyCode.RightArrow)
keys.rightPressed = true;
if (key == KeyCode.UpArrow)
keys.upPressed = true;
if (key == KeyCode.DownArrow)
keys.downPressed = true;
}
else if (Input.GetKeyUp(key))
{
if (key == KeyCode.LeftArrow)
keys.leftPressed = false;
if (key == KeyCode.RightArrow)
keys.rightPressed = false;
if (key == KeyCode.UpArrow)
keys.upPressed = false;
if (key == KeyCode.DownArrow)
keys.downPressed = false;
}
}
我只想让玩家 class 在按下某个键时移动游戏对象。如果按下两个方向,它们将相互抵消并将玩家的速度设置为 0。
同时向左和向右敲击会这样做,但尝试向上或向下按下不会改变此时的向上或向下值。好像 Input.GetKeyDown 只包含 2 个值而不是整个键盘键状态?
注意:即使按键盘上的两个随机键也会停止向左、向下、向上或向右更改值。
有人对我的代码有建议或修复吗?
谢谢,
除非我遗漏了什么,否则你最好使用 built in axes system.
此外,您的键盘可能不支持同时按下两个以上的键。
如果按下键,GetKeyDown 也不会 return returns 如果它在最后一帧被按下:https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
如果您不想使用轴系统,您希望 Input.GetKey 获取键的当前状态。
void Start()
{
StartCoroutine(crMoveIt());
}
private IEnumerator crMoveIt()
{
while(true) // have a bool var for this
{
if(Input.GetKeyDown(KeyCode.A))
{
// Move object here
}
yield return null;
}
}
要将对象移动到哪里,请参阅此
https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
或者,如果您使用的是刚体,请阅读
https://docs.unity3d.com/ScriptReference/Rigidbody.html
与其传入键码来检查每一帧,不如让协程处理输入,然后在每一帧之后调用一些东西。协程将执行与 Update 相同的操作,但您可以使用其中的多个 运行 而不是只有一个 Update() 方法。
我会为对象的移动编写更多代码,但您在示例中没有提供对任何 GameObject 的引用。不久前我回答了一个问题,该问题展示了如何以不同的方式移动对象,这里不使用 Vector3.MoveTowards()
Unity; Random Object Movement
希望这对您有所帮助。编辑了,忘记了一些东西。 =)
当按下两个键再按第三个键时,都没有松开,Input.GetKeyDown不知道第三个键已经按下
这是我的代码:
public class Keys
{
internal bool leftPressed = false;
internal bool rightPressed = false;
internal bool upPressed = false;
internal bool downPressed = false;
}
public Keys keys = new Keys();
void Start () {
}
void Update ()
{
updateButton(KeyCode.LeftArrow);
updateButton(KeyCode.RightArrow);
updateButton(KeyCode.UpArrow);
updateButton(KeyCode.DownArrow);
}
void updateButton(KeyCode key)
{
if (Input.GetKeyDown(key))
{
if (key == KeyCode.LeftArrow)
keys.leftPressed = true;
if (key == KeyCode.RightArrow)
keys.rightPressed = true;
if (key == KeyCode.UpArrow)
keys.upPressed = true;
if (key == KeyCode.DownArrow)
keys.downPressed = true;
}
else if (Input.GetKeyUp(key))
{
if (key == KeyCode.LeftArrow)
keys.leftPressed = false;
if (key == KeyCode.RightArrow)
keys.rightPressed = false;
if (key == KeyCode.UpArrow)
keys.upPressed = false;
if (key == KeyCode.DownArrow)
keys.downPressed = false;
}
}
我只想让玩家 class 在按下某个键时移动游戏对象。如果按下两个方向,它们将相互抵消并将玩家的速度设置为 0。
同时向左和向右敲击会这样做,但尝试向上或向下按下不会改变此时的向上或向下值。好像 Input.GetKeyDown 只包含 2 个值而不是整个键盘键状态?
注意:即使按键盘上的两个随机键也会停止向左、向下、向上或向右更改值。
有人对我的代码有建议或修复吗? 谢谢,
除非我遗漏了什么,否则你最好使用 built in axes system. 此外,您的键盘可能不支持同时按下两个以上的键。 如果按下键,GetKeyDown 也不会 return returns 如果它在最后一帧被按下:https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
如果您不想使用轴系统,您希望 Input.GetKey 获取键的当前状态。
void Start()
{
StartCoroutine(crMoveIt());
}
private IEnumerator crMoveIt()
{
while(true) // have a bool var for this
{
if(Input.GetKeyDown(KeyCode.A))
{
// Move object here
}
yield return null;
}
}
要将对象移动到哪里,请参阅此
https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
或者,如果您使用的是刚体,请阅读
https://docs.unity3d.com/ScriptReference/Rigidbody.html
与其传入键码来检查每一帧,不如让协程处理输入,然后在每一帧之后调用一些东西。协程将执行与 Update 相同的操作,但您可以使用其中的多个 运行 而不是只有一个 Update() 方法。
我会为对象的移动编写更多代码,但您在示例中没有提供对任何 GameObject 的引用。不久前我回答了一个问题,该问题展示了如何以不同的方式移动对象,这里不使用 Vector3.MoveTowards()
Unity; Random Object Movement
希望这对您有所帮助。编辑了,忘记了一些东西。 =)