2017-04-04 97 views
0

我想改变int速度值,但它不起作用。有人能帮我吗?如果你的信息太少,请问我。 这是我的代码:有人知道我在C#Unity3D中的if语句有什么问题吗?

if (Input.GetKeyDown (KeyCode.W)) { 
     sprint1 = true; 
    } else if (Input.GetKeyUp(KeyCode.W)){ 
     sprint1 = false; 
    } 
    if (Input.GetKeyDown(KeyCode.LeftShift)){ 
     sprint2 = true; 
    } else if (Input.GetKeyUp(KeyCode.LeftShift)){ 
     sprint2 = false; 
    } 
    if (sprint2 == false && Input.GetKeyUp(KeyCode.W) && Input.GetKeyUp(KeyCode.A) && Input.GetKeyUp(KeyCode.S) && Input.GetKeyUp(KeyCode.D)){ 
     speed = 0; 
    } if (sprint2==false && (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))){ 

     speed = 4; 

    }if (sprint1 == true && sprint2 == true && Scoped==true) { 
     speed = 8; 
    } 
+3

此代码在'Update()'循环中吗? – Smartis

+1

你调试了吗? –

+0

如果'Input.GetKeyDown(KeyCode.W)'== false,'Input.GetKeyUp(KeyCode.W)'也可以为false吗?这个怎么样:'sprint1 = Input.GetKeyDown(KeyCode.W)' –

回答

2
if (sprint2 == false && Input.GetKeyUp(KeyCode.W) && Input.GetKeyUp(KeyCode.A) && Input.GetKeyUp(KeyCode.S) && Input.GetKeyUp(KeyCode.D)){ 
    speed = 0; 
} 

在这种特殊情况下,除非,完全相同的框架中,你松开W,A,S和D看看Input.GetKeyUp documentation你将永远不会进入:

在帧期间返回true 用户释放由KeyCode枚举参数标识的密钥。

你要组织它,而不是这样:

// If you are sprinting, set the speed to 8 
if (sprint1 == true && sprint2 == true && Scoped==true) { 
    speed = 8; 
} 
// Else if one of those keys has been touched during this frame, set the speed to 4 
else if (sprint2==false && (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D))){ 
    speed = 4; 
} 
// Else, just set the speed to 0 
else 
    speed = 0; 
+0

感谢您的评论,你是唯一能帮助我的人。 –

0

如果键不下来,就看。无需检查两者。无论如何,这是我解释你的方式。

sprint1 = Input.GetKeyDown(KeyCode.W); 
sprint2 = Input.GetKeyDown(KeyCode.LeftShift); 

if (sprint2) 
{ 
    if (sprint1 && Scoped) 
     speed = 8; 
    else 
     speed = 4; // do you want speed 0 or 4 if either of these others are false 
} 
else 
{ 
    if (sprint1 
    || Input.GetKeyDown(KeyCode.A) 
    || Input.GetKeyDown(KeyCode.S) 
    || Input.GetKeyDown(KeyCode.D)) 
     speed = 4;  
    else 
     speed = 0; 
} 

我觉得会更好地工作,如果我解释你的愿望,是

sprint1 = Input.GetKeyDown(KeyCode.W); 
sprint2 = Input.GetKeyDown(KeyCode.LeftShift); 

if (sprint1 && sprint2 && Scoped) 
    speed = 8; 
else if (sprint1 
    || Input.GetKeyDown(KeyCode.A) 
    || Input.GetKeyDown(KeyCode.S) 
    || Input.GetKeyDown(KeyCode.D)) 
    speed = 4;  
else 
    speed = 0; 
+0

事实上,你的第一个陈述(如果一个关键没有关闭,它是up._)由于Unity处理关键事件的方式并不严格地讲是真的。在仅有** 1帧**期间(当用户按下该键时),“GetKeyDown”是真实的,在仅有** 1帧**期间(当用户释放该键时),“GetKeyUp”也是真实的,并且最终'GetKey'在**所有框架**按住按键。但在这种情况下,只使用'GetKey'应该足够了:) – Kardux

0

这里是做这件事,所以你没有办法让所有这些不必要的标志短跑。

if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.LeftShift) && Scoped) 
     speed = 8; 
    else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.S)) 
     speed = 4; 
    else 
     speed = 0; 
0

我已经解决了我自己的问题。 感谢您的所有意见,但我想告诉你我的解决方案:

 if (Input.GetKey (KeyCode.W)) { 
     sprint1 = true; 
    } else { 
     sprint1 = false; 
    } 
    if (Input.GetKey (KeyCode.LeftShift)) { 
     sprint2 = true; 
    } else { 
     sprint2 = false; 
    } 
    if (sprint2 == false && sprint1==false && !(Input.GetKey (KeyCode.A)) && !(Input.GetKey (KeyCode.S)) && !(Input.GetKey (KeyCode.D))){ 
     speed = 0; 
    } if ((sprint1==true && sprint2==false) || Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.S) || Input.GetKey (KeyCode.D)){ 

     speed = 4; 

    }if (sprint1 == true && sprint2 == true && Scoped==true) { 
     speed = 8; 
    }