해결된 질문
작성
·
55
답변 2
0
안녕하세요! BurningCarrot입니다.
어떤 씬(Title, Lobby 또는 InGame)을 재로드할 때 발생하는지 알려주실 수 있을까요? 아니면 어떤 씬이든 재로드할 때 동일하게 발생하는 현상일까요?
안녕하세요! 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;
}
}
m_IsDestroyOnLoad가 false인 싱글턴 인스턴스가 존재하는 씬을 재로드 하는 것이 맞고
최근에 기획안이 변경되어 살짝 갈아엎으니 해당 문제가 개인 프로젝트에서 나타나지 않네요...
질문을 꽤 했는데 매번 친절하게 도와주셔서 감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. moonfgg님.
싱글턴 패턴을 사용할 때, 싱글턴 객체는 일반적으로 게임에서 유일하게 존재해야 합니다. 하지만 씬을 재로드 할 때 새로운 인스턴스가 생성될 가능성은 여러 요인에 의해 발생할 수 있습니다. 가령, 오브젝트가 씬 간 이동과정에서 유지되지 않거나 새로운 인스턴스 생성 로직이 잘못 설정된 경우입니다.
DontDestroyOnLoad 사용 여부:
DontDestroyOnLoad
메소드를 사용하여 해당 객체가 씬이 변경되더라도 파괴되지 않도록 해야 합니다. 이를 사용하지 않으면, 씬이 재로드될 때마다 새로운 인스턴스가 생성될 수 있습니다.중복 인스턴스 검사 및 파괴:
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);
}
}
관련된 질문들과 답변을 참고하시면 문제를 해결하는 데 더 많은 도움이 될 것입니다. 싱글턴 관련해서 질문있습니다 링크에서 싱글턴 클래스와 관련된 개념 설명을 확인해 보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
개인 프로젝트에서 다루는 게임에서 일어납니다