2017-04-04 102 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; 
    }