• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

TextAsset을 Start()에서 불러오는 이유

21.06.30 00:09 작성 조회수 107

0

강의에서는 else에서 불러오면 계속 파일을 불러온다라고 하셨는데 이 말뜻이 이해가 안갑니다

혹시 이미 싱글톤으로 인스턴스가 생겼서, 새로 생성된 인스턴스가 Destroy()될 텐데, 이 없어질 인스턴스에서 파일을 불러오게 되면 NullReferenceException이 생길 경우를 대비한다는 말씀인가요?

답변 1

답변을 작성해보세요.

0

안녕하세요.

현재의 싱글톤의 구조에서 씬이 처음 실행될때 if 로 들어갈텐데요. 그러면 하나가 게임데이터스크립트 의 인스턴스가 생기겠죠. 생기겠죠. 

그래서 씬이 바뀌게 될경우 다시 그씬에 계층뷰에 게임데이터스크립트의 오브젝트와 코드가 있다면 아래의 코드에서 Awake 가 실행될 겁니다. 이건 위에서 생긴 오브젝트와는 다른 오브젝트입니다. 

그런데 저희는 두번째 생기는 오브젝트가 필요하지 않으니 Destroy 가 실행될겁니다. else 부분이요. 

그런데 저희의 데이터는 한번만 로드하면 되는 데이터이므로 Awake 안에 넣지 않는다는 겁니다. 

이상태에서 else 부분에 데이터를 로드하는 코드를 넣으면 씬이 바뀌면 바뀌는 때에 계속 이 내용이 실행됩니다. 

Destroy 가 실행되었어도 그 프레임이 끝나지 않는 이상 실행되던 코드는 모드 실행이 됩니다. 그 프레임이 끝나고 나서 실제 오브젝트의 파괴가 이루어지게 됩니다 

좋은 저녁되세요 감사합니다. 

Hyobin Kim님의 프로필

Hyobin Kim

질문자

2021.06.30

이게 null reference 랑 관계가 없고 예전에 이벤트 함수들의 특성과 관계있네요

말씀하시는것으로 미뤄보아 awake가 호출되는 타이밍은 새로운 scene이 로드 될때마다 가장 먼저 인것 같네요

원하던 그렇지 않던 scene이 로드될 때마다 싱글톤을 사용하는 오브젝트의 인스턴스는 매번 검사를 받겠군요

Dontdestroyonload덕분에 이전 scene에서 인스턴스가 만들어져있기에 첫번째 scene로드 이후로는 항상 awake()의 elses로 가게 되겠네요

만약 여기에 데이터를 불러온다면 scene이 전환 될 때마다 데이터가 로드되겠네요

감사합니다

네 맞습니다 코드란게 한줄씩 실행되지 동시에 실행되지 않습니다만 유니티에서 구현해놓기로는 논리적으로 한프레임안에서 "유니티의 실행순서" 에 따라서 모든 코드가 동시에 실행된다고 생각하시면 될것 같습니다. 

플레이어의 Awake 가 실행되고 적의 Awake 가 실행되고 잠시후에 플레이어의 Start 가 실행되고 적의 Start 가 실행되겠죠. 

유니티의 실행순서 를 웹에서 찾아보시면 순서가 나와있는데요

논리적으로 한프레임은 모두 같은 구간에서 실행된다고 생각하고 나서

다시 논리를 확장해서 보면 회색 사각형 블럭의 실행은 미세한 시간차가 있습니다 . 확인해보시면 좋을 것 같습니다. 

https://docs.unity3d.com/Manual/ExecutionOrder.html