2014-09-27 206 views
2

我知道這是一個初學者的問題,但我不能繼續我的學習,直到我明白這裏發生了什麼。在我在Update()中執行的if塊中,我無法理解爲什麼兩個if語句同時執行。我認爲只要主動變量在塊的開始處被初始化,編譯器就會下移到第一個if語句來查看條件是否爲真。如果它是真的,它會執行該塊中的代碼,直到定時器達到零。然後它會下移到下一個。如果條件在第一個條件是真的,那麼它在第二個條件是錯誤的,所以它會再次移動到起點。一個新的bool值將被計算用於主動性,並且該過程將被重複。我腦海裏浮現的是,無論我做什麼,兩個塊都被執行,定時器被完全忽略。這很混亂!爲什麼我的if語句中的條件被忽略? C#

我已經提出了一些非常基本的代碼來突出顯示我遇到的問題。我在Unity3d中使用這個C#代碼:

public float firstTimer = 2; 
public float secondTimer = 10; 
public bool initiative; 

void Update() 
{ 

    initiative = InitiativeOrder(); 

    if(initiative == true && firstTimer > 0); 
    { 
     firstTimer -= Time.deltaTime; 
     Debug.Log ("First timer has finished!"); 
    } 

    if(initiative == false && secondTimer > 0); 
    { 
     secondTimer -= Time.deltaTime; 
     Debug.Log ("Second timer has finished!"); 
    } 
} 

public bool InitiativeOrder() 
{ 
    float player = Random.Range(1,10); 
    float enemy = Random.Range(1,10); 

    if(player > enemy) 
    { 
     return true; 
    } 
    else if (player < enemy) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 
+0

取出;從if()if(initiative == true && firstTimer> 0)之後; – JRowan 2014-09-27 03:57:39

回答

0

定時器不工作的原因是因爲;之後您如果()

if(initiative == true && firstTimer > 0);<----remove these from your if 

使您如果()這樣的

if(initiative == true && firstTimer > 0) 
    { 
     firstTimer -= Time.deltaTime; 
     Debug.Log ("First timer has finished!"); 
    } 

    if(initiative == false && secondTimer > 0) 
    { 
     secondTimer -= Time.deltaTime; 
     Debug.Log ("Second timer has finished!"); 
    } 

它不是執行兩種,如果()塊

這個代碼

initiative = InitiativeOrder(); 

被稱爲每一幀女巫都在猜測60 fps,因此對於每秒每幀的數據,它正在執行該方法,並且很多次都有機會每秒它的真實或錯誤是爲什麼它似乎是同時觸發if()模塊,但實際上每一幀更新都會觸發它的真或假,這真的很快

如果您將該調用放入OnStart()它只會觸發一次像

void Start(){ 
initiative = InitiativeOrder(); 
} 

編輯代碼

public float firstTimer = 2; 
public float secondTimer = 10; 
public bool initiative; 
void Start(){ 
initiative = InitiativeOrder(); 
} 
void Update() 
{ 



    if(initiative == true && firstTimer > 0) 
    { 
     firstTimer -= Time.deltaTime; 
     Debug.Log ("First timer has finished!"); 
    } 

    if(initiative == false && secondTimer > 0) 
    { 
     secondTimer -= Time.deltaTime; 
     Debug.Log ("Second timer has finished!"); 
    } 
} 

public bool InitiativeOrder() 
{ 
    float player = Random.Range(1,10); 
    float enemy = Random.Range(1,10); 

    if(player > enemy) 
    { 
     return true; 
    } 
    else if (player < enemy) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 
+0

非常感謝!我仍然有點卡住,因爲即使我把初始化放在Start或OnStart中,它仍然會在true和false之間快速振盪。爲什麼會這樣? – OwenAlexander 2014-09-27 04:01:48

+0

你是否刪除了你的if() – JRowan 2014-09-27 04:02:42

+0

是,刪除了兩個條件。 – OwenAlexander 2014-09-27 04:05:58