[Unity] SetScriptingDefineSymbolsForGroup으로 define 변경 및 적용이 잘 안될 때
PlayerSettings.SetScriptingDefineSymbolsForGroup을 이용하여 스크립트에 정의된 define을 변경할 때, 컴파일이 되지 않고 변경 전에 define으로 되어 있던 상태의 assembly로 남아있는 경우가 있다.
- 환경
- Unity 2020.3.7f1
- Android Platform on Windows 10
프로젝트 폴더 내에 아래와 같이 Library\ScriptAssemblies 폴더를 보면 Assembly-CSharp 관련 dll들이 있는데 이것들이 컴파일 되어 최신으로 변경되는 지 확인할 필요가 있다. 동일한 기능을 Unity 2017.4에서 문제없이 사용했었기 때문에 현재 버전의 Unity 버그로 보여진다.
Unity issue tracker에서 “PLAYERSETTINGS.SETSCRIPTINGDEFINESYMBOLSFORGROUP BEHAVES DIFFERENTLY WHEN RUNNING IN BATCHMODE”라는 타이틀의 이슈가 등록되어 있는데, SetScriptingDefineSymbolsForGroup이 batch모드와 에디터가 동작을 달리한다는 내용이다. 이 이슈는 닫혀있는데, 안정성을 이유로 당장 고치지는 않겠다고 한다.
어쨌든 에디터 익스텐션을 통해 SetScriptingDefineSymbolsForGroup으로 define을 변경할 때, 항상 컴파일 과정을 거치기 위해 CompilationPipeline.RequestScriptCompilation 함수를 사용하였다. 이 함수는 비동기로 프로젝트 내에 모든 스크립트를 recomplie하고, 컴파일이 끝났을 때 컴파일된 assemblies를 다시 로드해준다. 비동기이기 때문에 실제 컴파일 과정이 끝난 후 완료 이벤트를 받을 수 있다. 아래 코드는 recompile을 요청하고 컴파일 완료 콜백 이벤트를 받는 과정이다.
using UnityEditor.Compilation;
.....
public void RequestScriptCompilation()
{
RegisterCompileEvent(); // 1. 완료 이벤트 콜백 등록
CompilationPipeline.RequestScriptCompilation(); // 2. Recomplie 요청
}
public void OnCompilationFinished(object obj)
{
UnRegisterCompileEvent(); // 3. 완료 이벤트 호출로 이벤트
}
private void RegisterCompileEvent()
{
CompilationPipeline.compilationFinished += OnCompilationFinished;
}
private void UnRegisterCompileEvent()
{
CompilationPipeline.compilationFinished -= OnCompilationFinished;
}
Unity에서 SetScriptingDefineSymbolsForGroup 함수에 대한 버그를 수정해 주거나, 올바른 사용에 대한 Use Case를 메뉴얼에서 기대해본다.