inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

게임 설정 (UserSettingsData, SettingsUI)

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

해결된 질문

174

moonfgg

작성한 질문수 10

0

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

또 한 개만 존재해야 할 텐데

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

C# unity 객체지향

답변 2

0

BurningCarrot 버닝캐럿

안녕하세요! BurningCarrot입니다.

 

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

0

moonfgg

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

0

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

1

moonfgg

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

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

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

0

인프런 AI 인턴

안녕하세요, 인프런 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에서 실제로 중복된 객체가 존재하는지 확인하고, 필요 시 로그를 통해 어떻게 객체가 추가로 생성되는지 추적해야 합니다.

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

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

싱글턴패턴

0

7

1

LobbyUIController의 백키가 사라졌는데 왜그런건가요?

0

42

2

무조건 타이틀 씬부터 시작해야하나요?

0

41

1

BaseUI, UIManager

0

51

3

3d프로젝트에 적용해도 무방한가요?ㅁ

0

71

2

UserDataManager 코드 질문입니다.

0

88

2

업적/미션 Pt.3에서 OnClickClaimBtn 호출 시 Sort 부분 호출 동작

0

107

1

데이터 로드 관련 질문

0

88

2

16번 강의에서 ShowUI 함수부분 오타가 있는거 같습니다.

0

72

2

PlayerPrefs 에 대해서 문의드립니다.

0

106

2

다운 받은 자료 용량 관련 문의입니다.

0

93

2

userDataList Json으로 저장

0

101

2

Lobby 프리팹 구성 질문

0

99

3

씬로딩 관련한 질문드립니다.

0

103

2

보충강의를 들었는데도 불구하고 Confirm UI 창이 표시가 되지 않습니다.

0

141

2

Resources폴더의 로드에 대하여 궁금한 것이 있습니다.

1

155

2

LoadData함수가 호출되지 않습니다.

0

87

1

캔버스를 여러 장 사용하는 이유

0

150

1

인피티니스크롤 item의 rect Transform에 Nan값

0

110

2

아이템 필터 기능

0

144

1

[Title씬 구성 관련 질문 : 프리팹]

0

181

2

CSVReader 자세하게 설명 가능하신가요?

0

226

1

안녕하세요 일시정지부분

0

168

2

세션5 게임 셋팅 팝업 창 관련(unity6)

0

204

3