유니티 버전 - 6000.0.40f1
목차
- Single과 Additive 씬의 이벤트함수 실행 순서
씬이 로드될때 Addtive씬의 PolygonCollider2D를 가져오는 코드가있었습니다, 이때는 Title씬에서 InGame씬으로 넘어올때 InGame씬과 Farm씬이 동기적으로 로딩되어서 InGame의 CinemachineConfinerChange 메서드가 Addtive씬의 오브젝트를 잘 가져왔었습니다
if (obj.CompareTag(Setting.ConfinerTag))
{
PolygonCollider2D polygonCollider2D = obj.GetComponent<PolygonCollider2D>();
cinemachineConfiner2D.m_BoundingShape2D = polygonCollider2D;
cinemachineConfiner2D.InvalidateCache();
그런데 씬 로딩을 비동기적으로바꾸면서 문제가 발생하였습니다, mainScene이 먼저 로드되며 Addtive씬은 로드되지 않은채로 polygonCollider2D를 찾으려고 하니, 참조 오류가 발생하였습니다
public async UniTask StartGame(SceneName mainScene, SceneName additiveScene)
{
await SceneManager.LoadSceneAsync((int)mainScene, LoadSceneMode.Single).ToUniTask();
await SceneManager.LoadSceneAsync((int)additiveScene, LoadSceneMode.Additive).ToUniTask();
Scene additive = SceneManager.GetSceneByBuildIndex((int)additiveScene);
SceneManager.SetActiveScene(additive);
}
Hierarchy를 자세히보니 InGame 로드중 -> Title이 언로드되며 InGame 활성화 -> Addtive씬 로드중 -> Addtive씬 활성화 순서대로 이루어졌습니다, 그래서 mainScene의 오브젝트의 Start()에서 콜라이더를 찾으려고하니 오류가 발생하는 것이였습니다, 그래서 이벤트 매니저를 통해 ChangeConfiner()를 등록하고
private void Start() // InGame의 스크립트
{
EventManager.Subscribe(GameEventType.SceneChange, ChangeConfiner);
}
씬 로드가 완전히 완료된 후 실행되도록 바꾸어 해결했습니다
public async UniTask StartGame(SceneName mainScene, SceneName additiveScene)
{
await SceneManager.LoadSceneAsync((int)mainScene, LoadSceneMode.Single).ToUniTask();
await SceneManager.LoadSceneAsync((int)additiveScene, LoadSceneMode.Additive).ToUniTask();
Scene additive = SceneManager.GetSceneByBuildIndex((int)additiveScene);
SceneManager.SetActiveScene(additive);
EventManager.Dispatch(GameEventType.SceneChange, null);
// 추가
}
메인 씬이 로드된 후 첫 프레임 업데이트가 시작되면 메인 씬의 Start() 함수가 실행되는데, 만약 이 시점에 아직 Additive 씬이 로드되기 전이라면, Additive 씬의 오브젝트를 참조하려 할 때 null 참조 오류가 발생할 수 있습니다
'코드 및 공부 > 씬' 카테고리의 다른 글
allowSceneActivation = false 를 이용한 씬 미리 로딩(PreLoadScene) (0) | 2025.03.21 |
---|---|
씬 전환시 해당씬의 CinemachineConfiner로 교체하기 (1) | 2024.12.23 |
Instantiate시 오브젝트가 Addtive씬에 생기는 문제 (0) | 2024.12.11 |
씬의 이벤트 실행 순서(Awake, Start 이외) (0) | 2024.11.30 |
씬 관리 (1) (4) | 2024.09.22 |