인프런 커뮤니티 질문&답변

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

게임 설정 (UserSettingsData, SettingsUI)

싱글턴 적용된 클래스가 현재 씬을 재로드하면 이상해요

해결된 질문

작성

·

55

0

싱글턴이 적용된 클래스는 사라지지 않고

또 한 개만 존재해야 할 텐데

가끔식 씬을 재로드시 한 개가 더 생깁니다

답변 2

0

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다.

 

어떤 씬(Title, Lobby 또는 InGame)을 재로드할 때 발생하는지 알려주실 수 있을까요? 아니면 어떤 씬이든 재로드할 때 동일하게 발생하는 현상일까요?

moonfgg님의 프로필 이미지
moonfgg
질문자

개인 프로젝트에서 다루는 게임에서 일어납니다

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

 

제가 테스트 해 본 결과 씬 재로드 시 싱글턴이 적용된 클래스가 중복으로 생성되는 경우는 아직 확인하지 못했습니다. 수강생 분의 개인 프로젝트에서 재로드하려는 씬의 싱글턴 오브젝트들의 m_IsDestroyOnLoad 값이 어떻게 될까요? 혹시 Title씬과 같이 m_IsDestroyOnLoad가 false인 싱글턴 인스턴스가 존재하는 씬을 재로드 하시려는 것이라면 SingletonBehaviour의 Init()과 Dispose() 함수를 아래와 같이 수정하시고 확인 부탁 드립니다.

    protected virtual void Init()
    {
        if(m_Instance == null)
        {
            m_Instance = (T)this;

            if(!m_IsDestroyOnLoad)
            {
                DontDestroyOnLoad(this);
            }
        }
        else if (m_Instance != this)
        {
            Destroy(gameObject);
        }
    }

    protected virtual void Dispose()
    {
        if (m_Instance == this)
        {
            m_Instance = null;
        }
    }
moonfgg님의 프로필 이미지
moonfgg
질문자

m_IsDestroyOnLoad가 false인 싱글턴 인스턴스가 존재하는 씬을 재로드 하는 것이 맞고

최근에 기획안이 변경되어 살짝 갈아엎으니 해당 문제가 개인 프로젝트에서 나타나지 않네요...

질문을 꽤 했는데 매번 친절하게 도와주셔서 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. moonfgg님.

싱글턴 패턴을 사용할 때, 싱글턴 객체는 일반적으로 게임에서 유일하게 존재해야 합니다. 하지만 씬을 재로드 할 때 새로운 인스턴스가 생성될 가능성은 여러 요인에 의해 발생할 수 있습니다. 가령, 오브젝트가 씬 간 이동과정에서 유지되지 않거나 새로운 인스턴스 생성 로직이 잘못 설정된 경우입니다.

고려해야 할 사항들:

  1. DontDestroyOnLoad 사용 여부:

    • 싱글턴 객체가 동일한 씬 간 생존하는 경우 DontDestroyOnLoad 메소드를 사용하여 해당 객체가 씬이 변경되더라도 파괴되지 않도록 해야 합니다. 이를 사용하지 않으면, 씬이 재로드될 때마다 새로운 인스턴스가 생성될 수 있습니다.
  2. 중복 인스턴스 검사 및 파괴:

    • 싱글턴 객체의 Awake 또는 Start 메소드에서 인스턴스가 이미 존재하는지 확인하고, 존재하면 중복 인스턴스를 파괴하는 로직이 포함되어야 합니다.
   private static Singleton instance;

   public static Singleton Instance
   {
       get
       {
           if (instance == null)
           {
               instance = FindObjectOfType<Singleton>();
               if (instance == null)
               {
                   GameObject singletonObject = new GameObject();
                   instance = singletonObject.AddComponent<Singleton>();
                   DontDestroyOnLoad(singletonObject);
               }
           }
           return instance;
       }
   }

   private void Awake()
   {
       if (instance == null)
       {
           instance = this;
           DontDestroyOnLoad(gameObject);
       }
       else if (instance != this)
       {
           Destroy(gameObject);
       }
   }
  1. 씬 재로드 후 객체 확인:
    • 씬이 재로드되었을 때, Unity의 Hierarchy에서 실제로 중복된 객체가 존재하는지 확인하고, 필요 시 로그를 통해 어떻게 객체가 추가로 생성되는지 추적해야 합니다.

관련된 질문들과 답변을 참고하시면 문제를 해결하는 데 더 많은 도움이 될 것입니다. 싱글턴 관련해서 질문있습니다 링크에서 싱글턴 클래스와 관련된 개념 설명을 확인해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

질문하기