inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Lập trình hệ thống Unity Pt.1 - Gói tất cả trong một về các hệ thống cốt lõi để hiện thực hóa trò chơi thương mại

싱글턴패턴

2

Jorn

3 câu hỏi đã được viết

0

  1. Init 함수에서 m_Instance가 null이 아니면 왜 gameobject를 Destroy하나요?

  2. OnDestroy 함수 호출되면 m_Instance 을 null로 만드는데 그럼 문제가 되지않은 객체도 m_Instance가 null이니 사용못하는거 아닌가요?

    using UnityEngine;
    
    public class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
    {
        //씬 전환 시 삭제할지 여부
        protected bool m_IsDestroyOnLoad = false;
    
        //이 클래스의 스태틱 인스턴스 변수
        protected static T m_Instance;
    
        public static T Instance
        {
            get { return m_Instance; }
        }
    
        private void Awake()
        {
            Init();
        }
    
        protected virtual void Init()
        {
            if(m_Instance == null)
            {
                m_Instance = (T)this;
    
                if(!m_IsDestroyOnLoad)
                {
                    DontDestroyOnLoad(this);
                }
            }
            else
            {
                Destroy(gameObject);
            }
        }
    
        //삭제 시 실행되는 함수
        protected virtual void OnDestroy()
        {
            Dispose();
        }
    
        //삭제 시 추가로 처리해 주어야할 작업을 여기서 처리
        protected virtual void Dispose()
        {
            m_Instance = null;
        }
    }
    

C# unity 객체지향 game-programming

Câu trả lời 1

-1

communityai8509

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

싱글턴 패턴의 구현에 관한 두 가지 질문을 주셨습니다.

1. Init 함수에서 m_Instance가 null이 아니면 왜 gameObject를 Destroy하나요?

이 부분은 싱글턴 패턴에서 중요한 역할을 합니다. 싱글턴 패턴은 클래스의 인스턴스를 하나만 유지하도록 하는 디자인 패턴입니다. m_Instancenull이 아니라는 것은 이미 해당 싱글턴 클래스의 인스턴스가 존재한다는 의미입니다. 따라서 추가로 생성된 인스턴스는 필요가 없으며, 이를 제거하여 중복 생성을 방지하고 메모리 관리 측면에서도 불필요한 리소스를 사용하지 않도록 하기 위해 Destroy(gameObject); 를 호출합니다.

2. OnDestroy 함수 호출되면 m_Instance 을 null로 만드는 이유

OnDestroy 함수가 호출되는 시점은 게임 오브젝트가 파괴될 때입니다. 싱글턴 인스턴스가 파괴되면, 상태를 초기화하여 가능하면 다른 코드에서 싱글턴 인스턴스를 참조할 때 이미 삭제된 객체에 접근하지 않도록 m_Instancenull로 설정합니다.

이를 통해 특정 오브젝트가 파괴된 이후에 시스템이 새 인스턴스를 생성할 수 있도록 준비하는 것입니다. 다른 인스턴스를 사용하기 원한다면, m_Instancenull 상태에서 새로 생성한 오브젝트로 설정될 수 있도록 해줍니다.

이러한 방법은 싱글턴 패턴을 관리하고 시스템이 올바르게 작동하도록 하는 데 매우 효과적입니다. 싱글턴 패턴이 잘못 설정된 경우 잘못된 인스턴스를 참조하여 생기는 오류를 방지하는 역할도 합니다.

더 자세한 설명은 다음 질문에서 확인하실 수 있습니다: 싱글턴 관련해서 질문있습니다

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

0

Jorn

m_instnace를 null로 만든 객체는 그럼 필요가 없는 객체 아닌가요? 어떻게 다시 instnace에 객체를 할당하죠?

AI말고 작성자님이 답변해주세요. 어떤 상황때문에 이렇게 작성한지 알고 싶어요

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

0

41

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

87

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

202

3

마지막 챕터를 클리어했을때 예외처리 질문입니다.

0

135

2