(Unity3D)在Block Breaker游戏中我尝试在所有砖块被摧毁时加载等级

时间:2016-09-19 12:30:17

标签: c# unity3d unityscript

早安开发者! 所以这就是我想要做的事情:我创建了一个块破坏者游戏,并且我编写了一些代码,以便当场景中的所有砖块被破坏时,下一级别被加载。 它工作正常,但有一个错误!当我在摧毁所有砖块之前丢失,然后我再次按下#34;,负责计算场景砖块的静态变量不会重置为0!它保留了我丢失之前的砖块数量,并在新场景中添加了砖块数量!,因此它不是返回24 for ex(这是场景中正确的砖块数量)而是返回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 ();
    }
}

希望我正确解释,如果我犯了一些英语错误,我很抱歉我不是母语lol,谢谢你有愉快的一天^^

3 个答案:

答案 0 :(得分:1)

- 由于误解而被编辑 - 我没有意识到这是你的BRICK脚本。重置应该在我们的LevelManager内。

您在函数中加载LevelManager中新级别的第一行应该是:

breakableCount = 0;

这样可以在初始化电平时重置计数器。

此外,只要您确定某人已超过当前水平,您就可以重置同样的方式。

另外,我从Ben Tristram的Unity Dev Course中认识到了这一点。您应该尝试使用他班级中内置的工具来解决问题,这些特定练习有很多支持!

Stack Overflow虽然很棒,但是当这些东西落空时它是一个很好的来源。另一个需要检查的地方是https://gamedev.stackexchange.com/

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我想更新这篇文章,因为我找到了解决方案,我在同一主题中有另一个问题! 首先我会告诉你我是如何修理它的: 正如@JorgeSantos建议我在我的loadlevel脚本中创建了一个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(这是正确的值)并且当我正常销毁砖时继续减少!,你现在可以看到游戏继续正常工作,但我不明白为什么那个变量我再次点击播放后没有重置到正确的砖块数量,只有当我达到与我的拳头相同数量的被破坏的砖块时才会生效?! 希望我明确表达我的观点,期待你的回答,谢谢大家^^