在我的代码中,我试图检测一个密钥,例如A' A'单独按压或按组合按压。我对每个都有不同的if语句。但当我把它们压在一起时,会发生奇怪的事情。我认为问题与XmlDocument doc = new XmlDocument();
doc.LoadXml(str);
doc.Save("HL7.xml");
有关,当我尝试使用Input.Getkey
时,几乎不可能同时按下它们。如何改进我的代码?
这似乎是一个常见问题,但我无法理解。我希望我的变换在仅按A时移动到不同的位置,并且当A与W或S组合按下时,移动到另一个不同的位置。我想要的结果是在图像中。当我点击&& w然后在如下范围内生成随机Vector3:
Input.GeyKeyDown
生成随机位置非常有效,但唯一的问题是当我尝试按组合键时,首先运行
new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
然后这个
if (Input.GetKeyUp(KeyCode.W))
{
activePos = new Vector3(Random.Range(0.95f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
和这个
if (Input.GetKey(KeyCode.A) || (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.A)))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(2f, 4.5f));
return activePos;
}
而我只希望最后一个运行。 我希望只有这个代码才能在w&& a被压在一起时运行
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
这是完整的方法:
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
答案 0 :(得分:1)
我假设这个函数将在Update()函数中调用,该函数在每一帧上执行。
你不必使用逻辑和A&& B对于同时按下两个键的情况,只需单独定义A和B的情况,当两者都被调用时,更改将按顺序顺序,但很快,如此之快,以至于没有人可以检测到符合您要求的序列。
if (Input.GetKeyUp(KeyCode.A)) {...}
if (Input.GetKeyUp(KeyCode.B)) {...}
// if (Input.GetKeyUp(KeyCode.A) && Input.GetKeyUp(KeyCode.A)) {...} //Avoid this!
更新:
if (Input.GetKeyUp(KeyCode.A)) {
activePos += ... //Let activePos to be class level variable, no need to return;
}
答案 1 :(得分:1)
问题不在于
if(Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.A))
因为这对你想做的事情来说非常好。
问题在于你使用了很多if-else语句。
您的代码正在按顺序运行,这意味着从上到下。如果您同时按下A和W键,它将通过您的代码,它将找到的第一个匹配将是
else if(Input.GetKeyUp(KeyCode.W)) { activePos = new Vector3(Random.Range(0.95f,-0.95f),0,Random.Range(4.5f,6f));
return activePos; }
因为你确实按下了W,它将执行这个if语句中的代码并突破所有其他情况。永不到达
else if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
有多种方法可以解决这个问题,每种方法各有利弊。
我个人可能会做的是嵌套你的if语句。这意味着您将首先检查按键A是否被按下,并且在if语句中,您可以再次检查W是否也被按下,例如:
if(Input.GetKey(KeyCode.A)) { //some logic goes here for when A is pressed if(Input.GetKey(KeyCode.W)) { //some logic for when both A and W are pressed } }
这是你可以在同一个if语句中同时进行A和W检查。
或者你可以这样做:
if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
//logic for both A And W pressed
}
if(Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.A))
{
//by checking if A is NOT pressed you will prevent this code from
//running if you press both A and W
//Logic for just W pressed
}
简而言之;摆脱整个if-else结构并坚持使用if,如果由于某种原因你真的想坚持使用if-else结构来反转你检查一切也会做的顺序(例如检查双键按下首先,单键按下之后,因为你在第一次正面击中后突破了if-else,但我不推荐这种方法。
你也不必返回活动的pos。只需使用= new Vector3进行设置就可以了!
如果帖子的格式有点混乱,请在移动设备上快速输入,这表示道歉!
答案 2 :(得分:0)
您可以尝试在每次按键时设置一个值,因此当您按下a键时,它会设置bool a = true
。之后您可以查看if (a && d)
或类似内容。
答案 3 :(得分:0)
试试这个:
if ((Input.GetKey(KeyCode.S) && Input.GetKeyUp(KeyCode.Q)) || (Input.GetKey(KeyCode.Q) && Input.GetKeyUp(KeyCode.S)))
{
DoCode();
}