我创建了一个方块破坏游戏,并编写了一些代码,以便当场景中的所有砖块都被破坏时,加载下一个级别。
它工作正常,但有一个错误!当我输了,在销毁所有砖块然后按“再次播放”之前,负责计算场景中砖块的静态变量不会重置为 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 ();
}
}
-因误解而编辑- 我没有意识到那是你的 BRICK 脚本。 重置应该在我们的 LevelManager 内部。
在 LevelManager 中加载新关卡的函数中的第一行应该是:
breakableCount = 0;
这将使水平初始化时计数器重置。
此外,一旦您确定某人已超过当前级别,您就可以以相同的方式重置。
此外,我从 Ben Tristram 的 Unity 开发课程中认识到了这一点。 您应该尝试使用他的课程中内置的工具来解答问题,这些特定练习有很多支持!
Stack Overflow 很棒,当那些东西失败时,它是一个很好的来源。 另一个要检查的地方是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 函数中调用了该 fontion :
public void LoadLevel (string name) {
ResetGame ();
Debug.Log ("level change requested for : " + name);
Application.LoadLevel (name);
现在变量重置得很好 唯一的问题(这并不是真正的问题,因为游戏运行良好,只是我想知道为什么会发生)是,例如,我运行游戏,摧毁 4 个砖块,然后我输了,(继续请注意场景中有 24 块砖块)所以我留下了 20 块砖块未损坏! 当我在控制台中再次按下播放按钮时,我注意到当我销毁一块砖块时,breakableCount变量没有采用新值,然后当我销毁4块砖块时(这意味着我剩下的砖块数量与原来相同)在失败之前),然后,breakableCount变量的值为20(这是正确的值),并在我正常摧毁砖块时继续减少!,你现在可以看到游戏继续正常工作,但我不明白为什么该变量不当我再次点击播放后,重置为正确的砖块数量,并且只有当我达到与第一次尝试相同的被破坏砖块数量时才会生效?! 希望我的观点清楚,期待您的答复,谢谢大家^^