簡體   English   中英

在Block Breaker游戲中(Unity3D)我試圖在所有積木都毀掉時加載關卡

[英](Unity3D) in Block Breaker game I'm trying to load levels when all bricks destroyed

早安開發人員! 因此,這就是我想要做的事情:我創建了一個破壞塊游戲,並編寫了一些代碼,以便當場景中的所有積木都被銷毀時,會加載下一個關卡。 它工作正常,但是有一個錯誤! 當我在銷毀所有積木之前輸了錢,然后按“再次播放”時,負責計算現場積木的靜態變量不會重置為0! 它會在我丟失之前保留磚的數量,並在新場景中添加磚的數量!因此,與其返回ex的24(這是場景中正確的磚的數量),不如返回35(11 + 24)我可以解決這個問題嗎? 這是我正在使用的代碼:首先是Brick腳本:

public int maxHits;
public int timesHit;
public Sprite[] hitSprites;
public static int breakableCount = 0;

private bool isBreakable;
private LevelManager levelManager;
// Use this for initialization
void Start () {
    isBreakable = (this.tag == "Breakable");
    if(isBreakable){
        breakableCount++;
    }
    print (breakableCount);
    timesHit = 0;
    levelManager = GameObject.FindObjectOfType<LevelManager> ();
}
void OnCollisionEnter2D(Collision2D collision) {
    if (isBreakable) {
        HandleHits ();
    }
}

void HandleHits(){
    //TODO remove the print!!
    print ("collison");
    timesHit++;
    if (timesHit >= maxHits) {
        breakableCount--;
        print (breakableCount);
        levelManager.BrickDestroyed ();
        Destroy (gameObject);
    } else {
        LoadSprite ();
    }
}
// Update is called once per frame
void Update () {

}

//TODO Remove this when player can WIN
void NextLevel(){
    levelManager.LoadNextLevel ();
}

void LoadSprite(){
    int spriteIndex = timesHit - 1;
    this.GetComponent<SpriteRenderer> ().sprite = hitSprites [spriteIndex];
}

這是我用來管理關卡的LevelManager腳本:

public void LoadLevel (string name) {
    Debug.Log ("level change requested for : " + name);
    Application.LoadLevel (name);
}
public void ExitRequest() {
    Debug.Log ("Exit game requested");
    Application.Quit ();
}
public void LoadNextLevel () {
    Application.LoadLevel (Application.loadedLevel + 1);
}
public void BrickDestroyed () {
    if(Brick.breakableCount <= 0) {
        LoadNextLevel ();
    }
}

希望我能正確解釋,對不起,如果我犯了一些英語錯誤,我不是母語使用者,謝謝,祝您有愉快的一天^^

-由於誤解而編輯-我不知道那是您的BRICK腳本。 重置應該在我們的LevelManager中。

在LevelManager中加載新關卡的函數中的第一行應為:

breakableCount = 0;

這樣可以確保在初始化級別時重置計數器。

同樣,一旦您確定某人已超過當前水平,就可以以相同的方式重置。


另外,我從Ben Tristram的Unity開發課程中也認識到這一點。 您應該嘗試使用班級內置的工具來解決問題,這些特定練習為您提供了很多支持!

堆棧溢出雖然很棒,但是當這些東西落空時,它是一個很好的來源。 另一個要檢查的地方是https://gamedev.stackexchange.com/

private static int breakableCount = 0;
public static int BreakableCount 
{ 
    get{ return breakableCount; }
    set{
         breakableCount = value;
         if(breakableCount <= 0){ EndOfLevel() }
    }
}

將變量轉換為屬性(或者如果願意,可以使用方法),現在可以在修改變量時添加一些邏輯。

EndOfLevel只是您調用的一種方法,用於加載下一個級別,保存一些數據並在離開之前重置一些靜態值。

我想更新此帖子,因為我找到了解決方案,並且在同一主題中還有另一個問題! 首先,我將告訴您如何修復它:如@JorgeSantos所建議,我在負載級別腳本中創建了一個ResetGame功能:

void ResetGame(){
    Brick.breakableCount = 0;
    print ("breakableCount set to 0 ");
}

然后我在我的LoadLevel功能中稱該字體為:

public void LoadLevel (string name) {
    ResetGame ();
    Debug.Log ("level change requested for : " + name);
    Application.LoadLevel (name);

現在變量可以很好地重置唯一的問題(這並不是真正的問題,因為游戲可以正常運行,只是我想知道為什么會這樣),例如,假設我運行游戲,銷毀了4塊積木,並且然后我輸了(記住場景中有24塊磚),所以我留下了20塊未毀的磚! 當我再次按播放鍵時,在控制台中,我注意到當我銷毀一塊磚塊時,breakableCount變量未采用新值,那么當我銷毀4塊磚塊時,(這意味着我所剩磚塊的數量與我以前所剩的磚塊數量相同)在輸掉之前),然后breakableCount變量取值為20(這是正確的值),並在我正常銷毀積木時繼續減小!,您現在可以看到游戲繼續正常運行,但是我不明白為什么該變量不起作用再次單擊播放后重置為正確的磚塊數量,並且僅在達到與我的拳頭嘗試相同的銷毀磚塊數量時才生效嗎? 希望我能說清楚一點,期待您的回答,並謝謝大家^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM