2016-02-29 69 views
1

我有一個簡單的動作街機遊戲與玩家和多個敵人。我寫過一個遊戲,當所有敵人都死了時,關卡結束。我跟蹤敵人有一箇中央GameplayController,它有一個名爲enemiescount的靜態int。我在附加到每個敵人對象的腳本的清醒方法中增加了這個值,當敵人死亡時,我給這個名爲CountEnemies的遊戲控制器調用一個方法,該方法減少變量,如果它等於零,則結束該關卡。Unity3d有時遊戲結束的條件不會觸發

下面是代碼我CountEnemies由敵人類methid稱爲:

GameplayController.instance.CountEnemies(); 

其中instance剛剛返回GameplayController的單一實例。

下面的代碼到我的CountEnemies方法:

Debug.Log("Inside Count Enemies"); 
    Debug.Log("Count Enemies before: " + enemiesCount); 
    enemiesCount--; 
    Debug.Log("Count Enemies after: " + enemiesCount); 

    if (enemiesCount == 0) 
    { 
     Debug.Log("Enemy Count is equal to zero"); 
     //Complete Level 
    } 
    Debug.Log("End Count Enemies"); 

現在的問題是,它使用的工作,大部分的時間。但是,當我嘗試在移動設備上運行時,它會隨機出現,但無法結束關卡。我多次嘗試診斷問題,但每次我在PC上運行它時,它似乎都能夠完美無缺地運行,即使在某些罕見情況下它確實觸發了問題,但我可以發現的是,即使CountEnemies在每個回合都被調用,通過一些奇怪的原因敵人計數變量似乎沒有減少或可能增加。

我已經跟蹤通過Visual Studio代碼映射和引用的代碼,只有代替喚醒方法我增加了變量。請幫我解決這個問題或至少建議我如何調試它,就像這個變量的值更新附加的調試器讓我知道什麼。

+0

何時調用該方法?當某個敵人在某種類型的OnDeath()方法中被殺時? – Chad

回答

1

我在連接到我的每一個敵人的對象腳本的清醒方法增加此值,當和敵人的模具我調用一個方法來這個遊戲控制器命名CountEnemies其遞減變量,如果它等於零終止關卡。

這可能是你的問題。

清醒可能會被多次調用,並導致計數增加過多的問題,導致計數脫離實際剩餘的敵人數量。

更好的解決方案可能是讓腳本定期檢查當前存在於場景中的組件的GameObjects數量。或者,您可以在處置當前存在的敵人時檢查剩餘的敵人數量(您不希望它是UpdateFixedUpdate的一部分)。

FindObjectsOfType可能是您想要的呼叫。您可以使用它來查找所有類型的對象。如果你一次沒有太多的物體,使用這種方法的成本無關緊要。

基本上,重點在於增加一個靜態數字並不是正確的方法,因爲它很容易失控。

+2

我喜歡的一般編程原則是「單一的真相源」。從來沒有,例如,具有「bool isTurnedOn」和「bool isTurnedOnByPlayer」的Switch類 - 應該始終只有一種方法來獲取您的代碼中所需的特定數字或數據。最多可以在計算之前緩存一個派生值(僅當事實證明您需要提高性能時)並嚴格控制對該緩存的訪問。 – Katana314

+0

好吧,我已經在Unity的幾個教程和演練視頻中看到了'GameManager'類,並且我也開始在我的項目中實現類似的邏輯。在這種情況下,場景在其生命中加載的敵人數量將作爲屬性保留在此處。 – Chad

+0

@Polantris 或者,您可以在處置當前存在的敵人時檢查剩餘的敵人數量(您不希望它是更新或固定更新的一部分)。 你是什麼意思,不在更新?我正在檢查在Update方法中處理敵人的條件,然後在其gameObject上調用Destroy。具體而言,對我的情況來說,如果我在GameplayController的CountEnemies方法中調用FindObjectsOfType,那麼它不會是凱嗎? 其次,讓我們說,如果我一次擁有大約15個敵人,那麼稱它爲不是很昂貴? –