Unity_개발일지_31

홍신영·2024년 12월 3일
0

Unity

목록 보기
33/62

퍼즐을 만들었으니, 게임에서 플레이해보며 테스트를 해보기로 했다.
환경 에셋을 배치하고, 간단하게 튜토리얼이 되는 맵을 구성하였다.

여기에서 테스트를 하려하니, 스테이지 클리어 조건이 없었다.
퍼즐은 단순히 목적지에 도달하면, 3개 맞춰져 사라질 뿐 스테이지에 대한 조건 설계를 안한 것을 인지하게 되었다.

던전 형식으로 게임을 구성하게 될 것이니, 던전 매니저를 만들어 던전 클리어를 관리하게 하였고, 퍼즐 매니저를 만들어 맵에 존재하는(등록된) 퍼즐이 모두 clear가 된다면 즉 퍼즐의 상태를 등록, 해제, 파괴, 클리어 되었는지의 상태를 관리하도록 구현하였다.

이제 코드를 보자.

퍼즐 클래스 수정

private bool isCompleted = false;
public bool IsComplete
{
    get => isCompleted;
    protected set
    {
        isCompleted = value;
        PuzzleManager.Instance?.UpdatePuzzleState(this, isCompleted);
    }
}

protected virtual void Start()
{
    PuzzleManager.Instance?.RegisterPuzzle(this);
}

protected virtual void OnDestroy()
{
    PuzzleManager.Instance?.UnregisterPuzzle(this);
}

퍼즐 클래스로 상위 공통정보들을 넣는 곳이다.
다양한 퍼즐들은 이 퍼즐을 상속받아 사용되는데 각각의 퍼즐이 생성될 때, 퍼즐매니저를 통해 딕셔너리에 등록을 해주고, 각각의 퍼즐은 퍼즐이 해결이 되었는지 bool값을 가지고 protected를 통해 자식이 접근가능하고 프로퍼티 set을 통해 퍼즐이 해결되면 bool값을 true로 바꾸고, 퍼즐매니저에 업데이트 되도록 구현하였다.

퍼즐 매니저

바로 코드를 보자.

 private Dictionary<Puzzle, bool> puzzleStates = new Dictionary<Puzzle, bool>();
 
  // 퍼즐 등록
 public void RegisterPuzzle(Puzzle puzzle)
 {
     if (!puzzleStates.ContainsKey(puzzle))
     {
         puzzleStates[puzzle] = false; // 초기상태 
     }
 }

매니저는 처음에 리스트를 통해 게임오브젝트만을 등록,해제,파괴만을 다루다가 퍼즐해결 상태를 넣기 위해 딕셔너리로 변경하였다.
키 puzzle, 값은 bool로 생성해주고, 딕셔너리에 []인덱서를 사용해서 초기값인 false를 넣어준다.

    // 퍼즐 상태 업데이트
    public void UpdatePuzzleState(Puzzle puzzle, bool isCompleted)
    {
        if (puzzleStates.ContainsKey(puzzle))
        {
            puzzleStates[puzzle] = isCompleted;
        }
    }

상태업데이트는 아까 puzzle클래스에서 프로퍼티에서 호출된다. 각 퍼즐이 해결되었는지 bool값을 전달해 이 퍼즐의 bool값으로 변경하여 업데이트해준다.

    // 등록된 퍼즐이 다 완료되었는지 확인
    public bool AreAllPuzzlesCompleted()
    {
        foreach (bool state in puzzleStates.Values)
        {
            if (!state) return false;
        }
        return true;
    }

마지막으로 모든 퍼즐이 완료되었는지를 확인한다.
딕셔너리의 값들중 false가 하나라도 있다면 false를 반환하고 아니면 true를 반환하여 bool값을 전달한다.

던전 종료트리거

현재는 클리어 조건을 간단하게 구현하였다.
등록된 퍼즐이 모두 참인 상태에서 특정 위치에(트리거)에 도달하면 클리어 하도록 구현하였다.

private void OnTriggerEnter(Collider other)
{
 if (((1 << other.gameObject.layer) & playerLayer) != 0)
 {
     if (PuzzleManager.Instance.AreAllPuzzlesCompleted())
     {
         DungeonManager.Instance.StageClear();
     }
     else
     {
         Debug.Log("퍼즐 완료하고 오셔야..");
     }
 }
}

이렇게 되면 간단하게 한 스테이지는 구현이되었다. 이제 어제처럼 던전확장성을 고려하여 리펙토링을 진행할 것 같다. 그리고 퍼즐 로직도 하나 더 추가할 예정이다.

profile
게임 클라이언트 개발자

0개의 댓글