Unity에서 작업하다 보면, Inspector에서 어떤 오브젝트를 직접 수동으로 끌어다가 연결해 두었는데, 씬을 바꾸고 돌아오면 그 연결이 Missing으로 표시되는 경우가 있습니다. 처음엔 버그처럼 느껴지지만, Unity 구조상 이건 아주 당연한 현상입니다.
왜 연결이 끊어질까?
Inspector에서 연결한 오브젝트는 현재 씬 안에 존재하는 오브젝트입니다. 그런데 씬을 전환하면, 해당 씬 안에 있던 오브젝트들은 메모리에서 사라지고, 다음 씬의 새로운 오브젝트들로 바뀝니다.
즉, 연결되어 있던 오브젝트가 씬 전환 시 사라지기 때문에 그 필드는 자동으로 Missing 상태가 됩니다.
그럼 다시 원래 씬으로 돌아오면 연결이 복구될까?
안타깝게도 그렇지 않습니다. Unity는 Inspector 에서 손으로 연결한 참조를 자동으로 복구해주지 않습니다. 그래서 씬을 다시 로드하더라도 연결은 끊긴 상태로 유지됩니다.
해결 방법은? 코드로 직접 연결해주자
이럴 때 사용할 수 있는 방법이 바로 SceneManager.sceneLoaded 이벤트입니다.
이 이벤트는 Unity의 SceneManager 클래스에 포함된 전역 이벤트로, 씬이 로드될 때마다 자동으로 호출됩니다.
그리고 이 sceneLoaded는 Action 델리게이트 기반이기 때문에, += 연산자로 나만의 콜백 함수를 쉽게 등록할 수 있습니다.
예시 :
void Awake()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
GameObject scoreObj = GameObject.Find("Score");
if (scoreObj != null)
{
score = scoreObj.GetComponent<TextMeshProUGUI>();
}
}
이 구조를 사용하면, Score 오브젝트가 존재하는 씬으로 돌아왔을 때 GameObject.Find()를 통해 다시 연결해줄 수 있습니다.
씬 전환으로 인해 연결이 끊어지더라도, 필요한 시점에 코드로 다시 연결할 수 있다는 점이 큰 장점입니다.
마무리
Inspector에서 수동 연결한 오브젝트는 씬 전환 시 끊어지는 것이 정상입니다.
SceneManager.sceneLoaded 이벤트를 활용하면 씬이 로드될 때마다 필요한 오브젝트를 코드로 찾아서 다시 연결할 수 있습니다.
특히 DontDestroyOnLoad()된 싱글톤 오브젝트와 씬 내 오브젝트를 연결할 때 유용하게 쓰입니다.
이제부터는 연결 끊김에 당황하지 말고, 씬 전환 후 자동 연결 구조를 코드로 만들어보세요
'Unity' 카테고리의 다른 글
Audio Clip 을 Dictionary 로 관리하기 : Serializable 과 List 활용 (0) | 2025.04.08 |
---|---|
SceneManager.sceneLoaded 에 대해 (0) | 2025.04.05 |
유니티에서 플레이 모드인지 아닌 헤깔릴 때 (0) | 2025.04.05 |
유니티에서 Resources 폴더에 대해 알아보기 (0) | 2025.03.31 |
유니티에서 Scene 전환에도 안전한 GameManager class 만들기 (singleton) (0) | 2025.03.30 |