유니티 씬 초기화 - yuniti ssin chogihwa

도메인 및 씬 재로드 비활성화에 대한 세부 정보

씬 재로드

기본적으로 씬 재로드는 활성화됩니다. 즉 플레이 모드를 시작하면 Unity는 모든 기존 씬 게임 오브젝트를 삭제하고 디스크에서 씬을 다시 로드합니다. Unity가 이 작업을 완료하는 데 걸리는 시간은 씬의 복잡도에 비례합니다. 프로젝트가 복잡해지면 플레이 버튼을 누른 후 씬에 에디터에 완전히 로드될 때까지 걸리는 시간이 길어집니다.

씬 재로드를 비활성화하면 프로세스 시간이 단축됩니다. 이렇게 하면 프로젝트 개발을 더욱 빠르게 반복할 수 있습니다. Unity는 디스크에서 씬을 다시 로드하는 대신, 씬의 수정된 콘텐츠만 초기화합니다. 따라서 씬의 언로드와 재로드가 시간과 성능에 영향을 미치지 않습니다. Unity는 새로 로드된 것처럼 여전히 동일한 초기화 함수(예: OnEnable, OnDisable, OnDestroy)를 호출합니다.

씬 재로드를 건너뛸 경우 미치는 영향

씬 재로드를 비활성화하려면 다음 단계를 따르십시오.

  1. Edit > Project Settings > Editor로 이동합니다.
  2. Enter Play Mode Options가 활성화되었는지 확인합니다.
  3. Reload Scene을 비활성화합니다.

자세한 내용은 플레이 모드 설정 방법을 참조하십시오.

씬 재로드를 비활성화하면 에디터에서 애플리케이션을 시작하는 데 걸리는 시간이 더 이상 빌드된 버전의 시작 시간을 나타내지 않습니다. 따라서 프로젝트를 시작하는 동안 정확히 어떤 일이 발생하는지 디버깅하거나 프로파일링하려면 씬 재로드를 활성화하여 애플리케이션의 빌드된 버전에서 발생하는 실제 로드 시간과 프로세스를 더 정확하게 나타내야 합니다.

씬 재로드를 비활성화하면 프로젝트에 대한 부작용이 최소화됩니다. 하지만 씬 재로드는 도메인 재로드와 밀접한 관련이 있기 때문에 다음과 같은 몇 가지 주요 차이점이 있습니다.

  1. 빌드로 직렬화되지 않은 ScriptableObject 및 MonoBehaviour 필드([NonSerialized], 프라이빗 또는 내부)는 해당 값을 유지합니다. 이는 Unity가 기존 오브젝트를 다시 생성하지 않고 생성자를 호출하지 않기 때문입니다. 또한 Unity는 도메인 재로드 동안 배열/리스트 타입의 null 프라이빗 및 내부 필드를 빈 배열/리스트 오브젝트로 전환하고, 런타임(비 에디터) 스크립트에 대해 null이 아닌 상태를 유지합니다.

  2. ExecuteInEditMode 또는 ExecuteAlways 스크립트를 사용하는 스크립트는 OnDestroy 또는 Awake 호출을 수신합니다. Unity는 Awake를 호출하지 않으며, EditorApplication.isPlaying 프로퍼티를 확인하는 Awake/OnEnable 메서드로 플레이 모드를 변경 시 EditorApplication.isPlaying이 이미 true인 경우에만 OnEnable을 호출합니다. 런타임(비 에디터) 스크립트에 대한 직렬화되지 않은 필드는 편집 모드에서 활성화되지 않으므로 문제가 되지 않습니다. 하지만 ExecuteInEditMode 또는 ExecuteAlways로 표시된 스크립트는 자체적으로 변경되거나 다른 런타임 스크립트의 필드를 터치할 수 있습니다. 이 문제를 해결하려면 OnEnable 콜백에서 영향을 받는 모든 필드를 직접 초기화하십시오.

도메인 및 씬 재로드 비활성화에 대한 세부 정보

안녕하세요?

지난번 포스팅에서 패럴렉스 스크롤을 적용하는 것에는 성공했는데, 문제는 게임을 다시 시작하면 배경화면이 시작위치로 가지 않는다는 것을 언급했습니다. 그래서 자료를 찾아본 결과 씬을 초기화 하는 데 성공했었고, 약간의 문제가 있어서 playAgain을 했을 때 완전히 처음으로 간 것이 아니라는 느낌을 주기 위해서 메뉴에 어느정도 변형을 주고자 합니다.

먼저 GameManager.cs 스크립트를 찾아 가도록 해 봅니다.

유니티 씬 초기화 - yuniti ssin chogihwa

그리고 나서, SceneManagement라는 기능을 첫 머리에 올려서 관련된 기능을 스크립트상에서 사용할 수 있도록 해 줍니다.

다음으로 ReStartGame()메서드의 마지막 줄에다가 SceneManager.LoadScene("씬 이름"); 을 입력합니다.

이렇게 하는 것으로 패럴렉스 스크롤을 다시 게임이 시작하면 첫 위치로 오는데 성공하기는 했는데, 문제가 발생했습니다. 완전히 처음으로 돌아오기 때문에 PlayAgain을 눌러도 Play버튼이 다시금 뜨는 것 입니다.

그래서 게임을 다시 시작하면, 새로운 버튼이 play대신 보이도록 설정하기 위해서 먼저 play버튼을 복사합니다.

그리고 이름을 RunButton으로 게임 오브젝트의 이름을 개명하도록 합니다.

그리고 버튼의 디자인이 마음에 안 들어서, Kenney.nl에서 UI Pack이라는 그래픽 에셋을 다운로드 받도록 합니다.

거기서 red_button을 가지고 오도록 합니다.

이렇게 해서 Run버튼을 만드는 데 까지는 성공하기는 했습니다. 문제는 이게 어떻게 해서 게임을 다시 시작했을 때만 보이게 하느냐 하는 스크립트를 짜는 일입니다.

그래서 다시 GameManager.cs 스크립트를 찾아서 들어가 도록 합니다.

우선 새로운 게임 오브젝트로 runButton을 추가하도록 합니다.

그리고 유니티5로 돌아와서 RunButton항목에 해당하는 새로 만든 게임 오브젝트를 추가하도록 합니다.

그 다음에는 시작하자 마자 일단 기본적으로는 runButton은 SetActive가 false라고 해서 안 보이도록 설정을 해 주도록 합니다.

그 다음에는 oncePlayed라는 변수가 true일 경우에만 playButton 게임 오브젝트를 비활성화 시키고, runButton이 드러나게 해 줍니다.

그런데 여전히 runButton은 나오지 않는 문제점이 발생했습니다.

그래서 어디가 문제인지 몰라서, 일단 PlayerCopntroller.cs를 찾아가 보도록 했습니다.

여기다가 위 스크린샷처럼 PlayerPrefs.SetInt()라는 메서드를 이용해서, 씬이 새로 시작하면, 다른데 있는 변수는 지워지는 것을 볼 수 있었으니, 이번에는 플레이어 프리펩에 관련된 내용을 저장하는 것으로 바꾸었습니다.

그리고 나서 다시 GameManager.cs 스크립트를 열도록 합니다.

일단 위 스크린샷처럼 플레이어 프리펩에서 값을 읽어와서 위와 같은 값이면, runButton이 나타나도록 합니다.

이번에는 MainMenu를 게임오버 뷰에서 눌렀을 경우 위 스크린샷처럼 Run버튼이 나오는 것을 볼 수는 있었는데, 문제는 여전히 PlayAgain을 누르면 run버튼이 안 나오고 Play버튼이 나온다는 것 입니다.

알고봤더니 Start()메서드의 설정이 잘못 되어 있었던 것 이였습니다. 그래서 먼저 위 스크린샷처럼 변형을 시켜 주도록 해서, oncePlayed라는 플레이어 프리펩의 값이 0.0이다=즉, 한번도 플레이 한 적이 없다 하면 Play버튼이 나오게 하고, 아닌 경우에는 run버튼이 나오게 만들어 줍니다.

이렇게 해서 계속해서 Play버튼이 안 보이게 하는 데는 성공했습니다.

Run만 쓰니까 조금 심심한 것 같아서, RunAgain으로 글귀를 바꾸어 놓았는데, 여기서 아직 완성된 것이 아닙니다. 일단 타이틀 부터도 바꾸어야 하고, 해야 할 일이 많다면 많다는 생각이 듭니다. 다음 포스팅은 아마 메뉴를 어느정도 그럴싸하게 바꾸는 작업이 될 듯 합니다.