2016-09-19 3 views
0

안녕하세요! 그래서 여기에 내가하려고하는 것이 있습니다 : 나는 블록 브레이커 게임을 만들었고 장면의 모든 벽돌이 파괴되면 다음 레벨이로드되도록 코드를 작성했습니다. 잘 작동하지만 버그가 있습니다! 내가 모든 벽돌을 파괴하기 전에 잃어 버렸을 때 "다시 연주"를 누르면 장면의 벽돌 계산에 책임이있는 정적 변수가 0으로 재설정되지 않습니다! 그것은 잃어 버리기 전에 벽돌의 수를 유지하고 새로운 장면에서 벽돌의 수를 더합니다! 그래서 ex 대신 24를 반환하는 대신 (장면의 정확한 벽돌 수입니다) 35 (11 + 24)를 반환합니다 제발 그걸 고칠 수 있을까요? 먼저 벽돌 스크립트 : 여기 내가 사용하고 코드입니다(Unity3D) 모든 벽돌이 파괴되면 레벨을로드하려고합니다.

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(); 
    } 
} 

희망이 내가 제대로 설명, 그리고 죄송합니다 내가 영어 오류를 만든다면 원어민이 아닌데 감사합니다. 좋은 하루 되세요 ^^

+0

필요한 모든 값을 재설정하는'ResetGame' 함수를 만들 것을 제안합니다. –

+0

@ JorgeSantos 여러분의 제안에 감사드립니다. Brick 스크립트에서 ResetGame 함수를 만들었습니다. 이제 다음 레벨을로드 할 때 해당 함수를 실행하여 Brick 스크립트를 다시 실행하여 숫자를 계산합니다. 새로운 장면의 벽돌? –

답변

1

- 오해로 인해 편집 됨 - 나는 그것이 당신의 BRICK 스크립트라는 것을 깨닫지 못했습니다. 리셋은 LevelManager 내부에 있어야합니다. 함수에서

첫 번째 줄은 LevelManager에서 새로운 수준이어야로드 : 레벨이 카운터가 초기화되면 초기화 될 때 있도록

breakableCount = 0; 

이 그것을 만들 것입니다.

또한 사람이 현재 레벨보다 높다고 판단한 경우 동일한 방법으로 재설정 할 수 있습니다.


또한 Ben Tristram의 Unity Dev Course에서이 사실을 알고 있습니다. 당신은 질문을 위해 자신의 수업에 내장 된 도구를 사용해보십시오, 거기에 이러한 특정 운동에 대한 지원이 많이 있습니다!

스택 오버플로는 매우 유용하며, 스택 오버플로가 발생하면 큰 도움이됩니다. 확인하는 또 다른 장소는 https://gamedev.stackexchange.com/

+0

Ethan, 답변 해 주셔서 감사합니다. breakableCount = 0; Start()에서 변수는 0에 머물러 있고 장면의 벽돌을 증가시키지 않습니다. 그렇습니다. 실제로 Ben Tristram의 코스입니다.하지만 불행히도 코스의 질문과 토론에 액세스 할 수 없기 때문에 코스를 구입하고 사본을 준 사람은 내 사촌입니다. 하지만 stil, 거기에 stackoverflow 및 웹 사이트는 내가 나중에 볼 것입니다 준^ –

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

재산으로 변수를 켜기 (또는 당신이 선호하는 경우이 방법을 사용할 수 있습니다)가 수정됩니다 때, 당신은 지금 어떤 로직을 추가 할 수 있습니다.

EndOfLevel은 다음 레벨을로드하고 일부 데이터를 저장하고 나가기 전에 일부 정적 값을 재설정하기 위해 호출하는 메소드 일뿐입니다.

+0

당신의 대답에 대해 Everts, 난 그냥 bigginer 롤 오전 난 당신에게 말하고 싶어요 난 아직 사용 방법을 배웠어요 그것들, 그래서 당신이 나에게 도움이 될 코드를 둘 곳을 알려주십시오. 고마워요 ^^ –

+0

재산을 들여다 보면, 그것은 내부적으로 작동하는 방법을 사용하는 다른 방법 일뿐입니다. https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx – Everts

0

나는 해결책을 찾고 나는 동일한 주제에있는 다른 질문이 있기 때문에이 포스트를 새롭게하고 싶다!내가 그것을 해결하는 방법을 먼저 난 당신을 말할 것이다 : @JorgeSantos로 내가 내 loadlevel 스크립트에 ResetGame의 fonction을 만들어 제안 :

public void LoadLevel (string name) { 
    ResetGame(); 
    Debug.Log ("level change requested for : " + name); 
    Application.LoadLevel (name); 
: 난 내 LoadLevel의 fonction에서 그 fontion라는 다음
void ResetGame(){ 
    Brick.breakableCount = 0; 
    print ("breakableCount set to 0 "); 
} 

이제 변수가 올바르게 재설정됩니다. 유일한 문제입니다. 게임이 잘 실행되기 때문에 실제로 문제가 아닙니다. 왜 그런 일이 일어나고 있는지 알고 싶습니다. 예를 들어 제가 게임을 실행하고 4 개의 벽돌을 파괴한다고 가정합니다. , 그리고 나는 잃는다. (명심해라. 24 개의 벽돌이있다. ne) 그래서 나는 파괴되지 않은 20 개의 벽돌을 남겼다! 내가 콘솔에서 다시 재생을 누르면 브리 블을 파괴 할 때 breakableCount 변수가 새 값을 가져 오지 않는다는 것을 알았습니다. 그런 다음 4 개의 브릭을 파괴 할 때 (즉, 브릭이 같은 수의 브랜치에 있음을 의미합니다. 전에 잃어 버리기 전에) breakableCount 변수는 값 20 (올바른 값)을 취하고 정상적으로 벽돌을 파괴 할 때 계속 감소합니다! 이제 게임이 계속 잘 작동하는지 확인할 수 있지만 왜 그 변수가 있는지 이해할 수 없습니다 재생을 다시 클릭 한 후 올바른 번호의 브릭으로 리셋되지 않으며, 주먹만큼 파괴 된 벽돌에 도달 할 때만 효과가 나타납니다. 나는 당신의 대답을 기다리면서 명확한 대답을하기를 희망하며, 모두 감사합니다. ^^

관련 문제