Kiki Devlog

씬 이동 시 오브젝트에 할당한 다른 오브젝트들을 잃어버리는 에러 본문

Unity/내가 얻은 교훈

씬 이동 시 오브젝트에 할당한 다른 오브젝트들을 잃어버리는 에러

kimkiki 2022. 4. 9. 01:33
728x90

Awake() 는 씬이 처음 시작될때 호출됨.

한 script에서 캐싱으로 가져와서 사용하는 다른 오브젝트들은 보통 Awake() 에서 캐싱을 해오는데. (아래 코드처럼)

 private void Awake()
{
	anim = GetComponentInChildren<Animator>();
	rigid = GetComponent<Rigidbody>();
}

이 스크립트가 오브젝트에 붙어있는게 아닌, 아래 코드처럼 다른 script에서 instantiate 로 생성되는 script라면, 

manager = GameManager.Instance;
// GameManager는 특정 object에 할당된 script가 아님
// 다른 script 내부에서 생성된 script임.

씬 이동시 Awake()가 불리지 않음. 

 

그래서 awake()내부에서 캐싱된 모든 변수들은 새로운 씬의 새 값으로 초기화가 안됨.

 

해결법

: 오브젝트 형태로 존재하지 않는 script는 다른 오브젝트를 캐싱해와 사용할 시 awake()에서 가져오지 말고 그떄그때 필요한 함수 내에서 Instance 로 불러오자.

 

예시

public void Talk(int currentQuestNum, ObjectData obj)
{
    //Player,TalkUI 가 필요하면 awake()에서 받아오지 말고 그때그때 받아오기
	Player Player = GameManager.Instance.Player; 
	TalkUI TalkUI = TalkUI.Instance;

	string dialogue = TalkData.Instance.GetTalkData(currentQuestNum, obj.npcNum, talkIndex);

	TalkUI.SetTalkText(dialogue);
	TalkUI.ShowPanel();
}
Comments