재컴파일 중 빌드
도메인 리로드를 트리거하는 사전 빌드 단계가 있는 경우, 도메인 리로드가 완료될 때까지 어드레서블 빌드 자체가 시작되지 않도록 주의해야 합니다.
PlayerSettings.SetScriptingDefineSymbolsForGroup
으로 스크립팅 정의 기호를 설정하거나 EditorUserBuildSettings.SwitchActiveBuildTarget
로 활성 빌드 타겟을 전환하는 등의 메서드를 사용하면 스크립트가 재컴파일 및 리로드하도록 트리거됩니다. Unity 에디터 코드 실행은 도메인이 리 로드되고 실행이 중지될 때까지 현재 로드된 도메인으로 계속됩니다. 모든 플랫폼별 컴파일 또는 커스텀 정의는 도메인을 다시 로드할 때까지 설정되지 않습니다. 이 경우 코드가 올바르게 빌드되기 위해 이러한 정의에 의존하는 예기치 못한 문제가 발생할 수 있으며, 이러한 문제는 쉽게 놓칠 수 있습니다.
빌드 전 스크립트 변경
플랫폼을 전환하거나 코드에서 에디터 스크립트를 수정한 다음 정의 세트를 계속 사용하려면 도메인을 다시 로드해야 합니다. 이 경우 -quit
인수를 사용해서는 안 되며, 그렇지 않으면 호출된 메서드가 실행된 후 에디터가 바로 종료됩니다.
도메인이 다시 로드되면 InitializeOnLoad
가 호출됩니다. 아래 코드는 스크립팅 정의 기호를 설정하고 에디터 코드에서 해당 기호를 활용하여 도메인 리로드가 완료된 후 어드레서블을 빌드하는 방법을 보여 줍니다. 플랫폼 전환 및 플랫폼별 컴파일에도 동일한 프로세스를 수행할 수 있습니다.
[InitializeOnLoad]
public class BuildWithScriptingDefinesExample
{
static BuildWithScriptingDefinesExample()
{
bool toBuild = SessionState.GetBool("BuildAddressables", false);
SessionState.EraseBool("BuildAddressables");
if (toBuild)
{
Debug.Log("Domain reload complete, building Addressables as requested");
BuildAddressablesAndRevertDefines();
}
}
[MenuItem("Build/Addressables with script define")]
public static void BuildTest()
{
# if !MYDEFINEHERE
Debug.Log("Setting up SessionState to inform an Addressables build is requested on next Domain Reload");
SessionState.SetBool("BuildAddressables", true);
string originalDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
string newDefines = string.IsNullOrEmpty(originalDefines) ? "MYDEFINEHERE" : originalDefines + ";MYDEFINEHERE";
Debug.Log("Setting Scripting Defines, this will then start compiling and begin a domain reload of the Editor Scripts.");
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines);
# endif
}
static void BuildAddressablesAndRevertDefines()
{
# if MYDEFINEHERE
Debug.Log("Correct scripting defines set for desired build");
AddressableAssetSettings.BuildPlayerContent();
string originalDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
if (originalDefines.Contains(";MYDEFINEHERE"))
originalDefines = originalDefines.Replace(";MYDEFINEHERE", "");
else
originalDefines = originalDefines.Replace("MYDEFINEHERE", "");
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, originalDefines);
AssetDatabase.SaveAssets();
# endif
EditorApplication.Exit(0);
}
}