Unity 2019.3에서 더 빨리 Play 모드로 들어가세요.(Enter Play Mode faster in Unity 2019.3)
Unity 2022. 11. 22. 15:43원본: https://blog.unity.com/technology/enter-play-mode-faster-in-unity-2019-3
관련 항목
Unity 2019.3에서 더 빨리 Play 모드로 들어가세요.
Play 모드는 Unity를 즐겁게 만드는 핵심 요소입니다. 그러나 프로젝트가 복잡해지면서 시작하는 데 시간이 걸릴 수 있습니다. Play 모드로 들어가고 나갈 수 있는 속도가 빠를수록 변경 사항을 더 빨리 수정하고 테스트할 수 있습니다. 그렇기 때문에 실험적인 기능으로 Unity 2019.3 beta 에서 설정 가능한 Enter Play Mode를 도입하고 있습니다.
현재 Editor에서 Play Mode(재생 모드)를 시작하면, Unity는 스크립팅 상태(도메인 다시 로드)를 재설정하고 씬(scene)을 다시 로드하는 두 가지 작업을 수행합니다. 이 작업은 시간이 걸리고, 프로젝트가 복잡해질수록 재생 모드에서 새로운 변경 사항을 테스트하기 위해 더 오래 기다려야 합니다. 그러나 Unity 2019.3 beta부터는 "도메인 다시 로드" 및 "씬 다시 로드" 작업 중 하나 또는 둘 다를 비활성화할 수 있습니다.
테스트 결과에 따르면, 프로젝트에 따라 대기 시간을 최대 50-90%까지 절약할 수 있습니다.
우리는 AA 타이틀(Production title), 우리의 FPS 샘플, 메가시티, 그리고 빈 프로젝트로 구성 가능한 플레이 모드를 테스트 했습니다. 그래프는 편집기가 재생 모드로 전환하는 데 걸린 시간(초)을 나타냅니다. 해당 숫자가 작을수록 좋습니다.
File > Project Settings > Editor에서 Enter Play Mode Options를 활성화하면 Domain을 다시 로드하고 Scene을 다시 로드하는 옵션을 사용할 수 있습니다. 좀 더 상세한 내용을 원하면 어떻게 플레이 모드를 설정하나?를 확인하세요.
이 옵션을 사용하면 코드 변경이 없을 때 플레이 모드 시작 프로세스에서 Domain 및/또는 Scene 다시 로드를 비활성화할 수 있습니다. 플레이 모드에 들어가기 전에 게임 상태를 재설정하려면 API와 Callback을 통해 이 기능에 액세스할 수도 있습니다.
아래 표는 도메인 리로드 및 Scene 리로드를 비활성화 하기 전과 후의 플레이 모드 시작 프로세스를 보여 줍니다:
보시다시피 도메인 리로드를 방지하는 것은 매우 간단하지만 비용이 많이 듭니다. 플레이 모드가 시작될 때 스크립트 상태가 올바르게 재설정 되도록 스크립트의 정적 필드 및 정적 이벤트 핸들러를 조정해야 합니다.
다음 코드 예제에는 플레이어가 점프 버튼을 누를 때 올라가는 카운터가 있습니다. 도메인 리로드가 활성화된 경우, 플레이 모드로 들어갈 때 카운터가 자동으로 0으로 재설정 됩니다. 도메인 리로드를 사용하지 않도록 설정한 후에는 카운터가 재설정 되지 않고 값이 플레이 모드에 있거나 플레이 모드에서 해제됩니다. 즉, Editor에서 프로젝트의 두 번째 실행에서 카운터가 이전 실행에서 변경된 경우 카운터가 0이 아닐 수 있습니다.
public class StaticCounterExample : MonoBehaviour
{
// 도메인 리로드를 사용하지 않도록 설정한 경우 이 카운터가 0으로 재설정 되지 않습니다.
static int counter = 0;
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Jump"))
{
counter++;
Debug.Log("Counter: " + counter);
}
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] 특성을 사용하고, 값을 명시적으로 재설정하여 도메인 리로드가 비활성화된 경우 카운터가 올바르게 재설정되도록 합니다. 예:
using UnityEngine;
public class StaticCounterExampleFixed : MonoBehaviour
{
static int counter = 0;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
Debug.Log("Counter reset.");
counter = 0;
}
// 프레임당 한 번씩 업데이트가 호출됩니다.
void Update()
{
if (Input.GetButtonDown("Jump"))
{
counter++;
Debug.Log("Counter: " + counter);
}
}
}
도메인 리로드를 사용 불가능으로 설정한 후 플레이 모드를 종료할 때 Unity는 정적 이벤트 핸들러에서 메서드 등록을 취소하지 않습니다. 정적 이벤트 핸들러에 메서드를 등록하는 코드가 있는 경우 이로 인해 문제가 발생할 수 있습니다. 예를 들어, Editor에서 프로젝트의 첫 번째 Play(재생)에서 메소드는 정상으로 등록됩니다. 그러나 프로젝트의 두 번째 재생에서는 이러한 메소드가 첫 번째 메소드 외에 두 번째로 등록되므로 이벤트가 발생할 때 두 번 호출됩니다.
다음 코드는 정적 이벤트 핸들러에 Application.quitting을 등록합니다:
using UnityEngine;
public class StaticEventExample : MonoBehaviour
{
void Start()
{
Debug.Log("Registering quit function");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Quitting!");
}
}
도메인 리로드를 사용하지 않도록 설정한 경우 위의 예에서는 플레이 모드에 들어갈 때마다 '종료' 메서드를 다시 추가합니다. 이렇게 하면 플레이 모드를 종료할 때마다 "종료" 메시지가 추가로 표시됩니다.
[RuntimeInitializeOnLoadMethod] 특성을 사용해, 메서드를 두 번 추가하지 않도록 명시적으로 등록 취소합니다:
using UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Debug.Log("Unregistering quit function");
Application.quitting -= Quit;
}
void Start()
{
Debug.Log("Registering quit function");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Quitting the Player");
}
}
우리의 문서에서 도메인 리로드가 비활성화 된 경우 올바르게 수행되도록 스크립트를 수정하는 방법에 대한 자세한 내용을 참조하십시오.
인기 있는 Asset Store packages가 비활성화된 도메인 및 Scene 리로드와 함께 작동하는지 확인하려고 합니다. 프로젝트에서 발생하는 문제를 Asset packages의 게시자에게 보고하여 도움을 받을 수 있습니다.
현재 프로젝트가 플레이 모드로 전환되는 속도가 느린 경우 이 기능을 사용하면 작업 속도가 상당히 빨라질 것으로 생각됩니다. Unity 2019.3 beta에 가입하여 사용해 보십시오. 포럼에서 귀하의 의견을 들을 수 있기를 기대합니다! 이 기능은 실험적이기 때문에 사용자의 요구에 맞게 구성하는 데 도움이 될 수 있습니다. 우리는 특히 당신이 마주치는 문제에 대해 듣기를 고대하고 있습니다.
이미 이 기능을 테스트하고 귀중한 피드백을 제공함으로써 전체 커뮤니티를 도와준 포럼 사용자 @Sini, @chrisk, @Peter77 및 @Baste에게 큰 감사를 드립니다.
'Unity' 카테고리의 다른 글
ECS(Entity Component System) 튜토리얼: 타입들의 접근성(Types accessibility) (0) | 2022.11.22 |
---|---|
Baking을 통해 데이터 변환(Convert data with Baking) (0) | 2022.11.22 |
ECS(Entity Component System) 튜토리얼: 변환 설정(Conversion settings) (0) | 2022.11.22 |
ECS(Entity Component System) 튜토리얼: 프로젝트 설정(Project setup) (0) | 2022.11.22 |
ECS(Entity Component System) 튜토리얼: 명령어 사용 및 제공된 코드 사용(Using directives and provided code) (0) | 2022.11.22 |