FE/Unity

[ Unity2D ] 싱글톤 패턴을 이용한 GameManager 설정

HUIcode 2025. 4. 25. 18:36

 

 

캐릭터가 몬스터를 때렸을 때 몬스터의 hp를 어디서 깎는지 캐릭터 객체와 몬스터 객체 각각에서는 알 수 없다. 이를 위해 singleton 패턴을 이용해 단 하나의 GameManager와 같은 객체를 생성한다.

 

싱글톤 패턴의 개념과 이번 주차에서 학습한 전체 내용은 아래 포스트에서 확인할 수 있다.

2025.04.25 - [Study] - [ SJCE 스터디 / 3주차 ] Unity 씬 전환, DontDestroy, 물리엔진, 싱글톤

 

[ SJCE 스터디 / 3주차 ] Unity 씬 전환, DontDestroy, 싱글톤

2024.09.21(토): 원래 3주차는 14일로 예정되어 있었으나, 학교 정전의 이슈로 일주일 미뤄서 진행됐다. 또한, 서버 파트 선배님께서도 일정이 있으셔서 참석하지 못하셔서 유니티 수업으로만 진행

record-coding53.tistory.com

 


 

 

 

Step 1. GameManager 스크립트를 생성

  • Assets > Scripts 폴더에 GameManager 스크립트를 생성한다
  • GameManager 스크립트 자체를 static으로 만들어주기 위해 하이어라키에 GameManager 오브젝트를 생성하고 오브젝트에 해당 스크립트를 달아준다.

 

 

 

 

Step 2. 싱글톤 패턴 구현

  • GameManager.cs에 해당 내용을 추가
#region Singleton
private static GameManager _instance;

public static GameManager instance
{
    get
    {
        if (_instance == null)
        {
            Debug.LogError("GameManager 인스턴스가 존재하지 않습니다!");
        }
        return _instance;
    }
}
#endregion
  • 중복 생성을 막기 위해 static으로 선언
  • 시작하는 Awake() 함수에서 _instance = this 로 할당함으로써 더 이상의 GameManager 오브젝트가 생기지 못하도록 함
  • 외부에서 접근하기 위한 변수가 public static GameManager instance이다
  • * get은 얻어오는 것 set은 세팅해 주는 것
  • if 구문은 만약에 GameManager가 없을 경우 만들어주기 위한 예외처리 구문이다

 

 

 

 

Step 3. GameManager에서 캐릭터와 몬스터를 컨트롤 하기 위한 코드 작성

  • public Character character 선언
  • public Monster monster 선언
  • GameManager 오브젝트에 생긴 Character와 Monster 항목에 각각에 맞는 오브젝트를 달아준다
  • 로그를 찍는 TestSingleTonCharacter, TestSingleTonMonster 함수를 각각 캐릭터, 몬스터 스크립트에 작성한다
public void TestSingletonCharacter()
{
    Debug.Log("캐릭터 연결 확인 완료!");
}
public void TestSingletonMonster()
{
    Debug.Log("몬스터 연결 확인 완료!");
}
  • GameManager.cs의 Start 함수에서 호출
void Start()
{
    character.TestSingletonCharacter();
    monster.TestSingletonMonster();
}

 

 

 

 

캐릭터와 몬스터의 1대 1 전투 형식인 우리의 방치형 게임에서는 캐릭터에 몬스터 정보를 같이 넣거나 그 반대로도 가능하다고 생각할 수 있지만, 볼륨이 큰 RPG에서는 불가능하기 때문에 기본적으로 게임 매니저를 사용해야 한다.

 

 

 

 

 

이제, monster 스크립트에 작성했던 트리거 코드를 삭제하고 게임 매니저 스크립트에 CrashCharacterToMonster 함수를 작성하고 캐릭터 스크립트의 OnTriggerEnter함수에 게임 매니저의 CrashCharacterToMonster 함수 호출구문을 작성할 것이다.

 

Step 4. 캐릭터-몬스터 충돌 처리

Character.cs

void OnTriggerEnter(Collider other)
{
    if (other.tag == "enemy")
    {
        GameManager.instance.CrashCharacterToMonster();
    }
}

GameManager.cs

public void CrashCharacterToMonster()
{
    character.PlayAnimation(Character.PlayerState.attack);
    monster.SetMonsterSpeed(0f);
}

 

  • 캐릭터 스크립트의 다양한 애니메이션 동작 관리를 위해 PlayerState라는 public enum 구문을 작성한다 (none, run, attack 등)
public enum PlayerState
{
    none,
    run,
    attack
}
public void PlayAnimation(PlayerState state)
{
    switch (state)
    {
        case PlayerState.attack:
            anim.Play("character_attack");
            break;
        case PlayerState.run:
            anim.Play("character_run");
            break;
    }
}

 

 

이제 몬스터 속도 조절 함수를 작성할 것이다.

Monster.cs

public void SetMonsterSpeed(float setSpeed)
{
    speed = setSpeed;
}

 

 

이렇게 하면, 싱글톤 패턴을 적용한 게임 매니저 오브젝트 생성이 완료된다.