在 Block Breaker 游戏中,我尝试在所有砖块被摧毁时加载关卡

问题描述 投票:0回答:3

我创建了一个方块破坏游戏,并编写了一些代码,以便当场景中的所有砖块都被破坏时,加载下一个级别。

它工作正常,但有一个错误!当我输了,在销毁所有砖块然后按“再次播放”之前,负责计算场景中砖块的静态变量不会重置为 0!它保留了我丢失之前的砖块数量,并添加了新场景中的砖块数量!因此,例如,它不会返回 24(这是场景中正确的砖块数量),而是返回 35 (11 + 24)。

我该如何解决这个问题?

这是我正在使用的代码。一、砖块脚本:

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 ();
    }
}
c# unity-game-engine
3个回答
1
投票

-因误解而编辑- 我没有意识到那是你的 BRICK 脚本。 重置应该在我们的 LevelManager 内部。

在 LevelManager 中加载新关卡的函数中的第一行应该是:

breakableCount = 0;

这将使水平初始化时计数器重置。

此外,一旦您确定某人已超过当前级别,您就可以以相同的方式重置。


此外,我从 Ben Tristram 的 Unity 开发课程中认识到了这一点。 您应该尝试使用他的课程中内置的工具来解答问题,这些特定练习有很多支持!

Stack Overflow 很棒,当那些东西失败时,它是一个很好的来源。 另一个要检查的地方是https://gamedev.stackexchange.com/


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

将变量转换为属性(或者如果您愿意,也可以使用方法),现在您可以在修改变量时添加一些逻辑。

EndOfLevel 只是您在离开之前调用来加载下一个级别、保存一些数据并重置一些静态值的方法。


0
投票

我想更新这篇文章,因为我找到了解决方案,并且我在同一主题上还有另一个问题! 首先我会告诉你我是如何修复它的: 正如 @JorgeSantos 建议的那样,我在加载级别脚本中创建了 ResetGame 功能:

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

然后我在我的 LoadLevel 函数中调用了该 fontion :

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

现在变量重置得很好 唯一的问题(这并不是真正的问题,因为游戏运行良好,只是我想知道为什么会发生)是,例如,我运行游戏,摧毁 4 个砖块,然后我输了,(继续请注意场景中有 24 块砖块)所以我留下了 20 块砖块未损坏! 当我在控制台中再次按下播放按钮时,我注意到当我销毁一块砖块时,breakableCount变量没有采用新值,然后当我销毁4块砖块时(这意味着我剩下的砖块数量与原来相同)在失败之前),然后,breakableCount变量的值为20(这是正确的值),并在我正常摧毁砖块时继续减少!,你现在可以看到游戏继续正常工作,但我不明白为什么该变量不当我再次点击播放后,重置为正确的砖块数量,并且只有当我达到与第一次尝试相同的被破坏砖块数量时才会生效?! 希望我的观点清楚,期待您的答复,谢谢大家^^

© www.soinside.com 2019 - 2024. All rights reserved.