using System.Collections.Generic; private readonly Dictionary<TYPE, IValue> _values = new Dictionary<TYPE, IValue>(); private void SetTable(TYPE type, IValue origin) { Assert.IsFalse(_values.ContainsKey(type), type.ToString()); _values.Add(type, origin); } public ITable GetTable(TYPE type) { IValue value = null; Assert.IsTrue(_values.TryGetValue(type, out value)); return value; }
유니티에서 위의 코드를 사용하고 있었는데 지속적으로 핸드폰에서만 문제가 발생했다.
에디터에서는 재현이 되지 않아 로그를 추가하여 APK를 빌드하고 기기에 설치하여 Logcat 으로 로그를 확인해 보았다.
_values 에는 분명 값이 있고 _values.TryGetValue 를 사용하면 정상적인 값을 얻을 수 있었지만, GetTable 함수를 사용하면 null 만 반환되는 문제였다.
몇 줄 되지 않는 코드라 대체 어떤것이 문제인지 도통 감을 잡을수가 없었다.
마지막이라는 심정으로 GetTable 함수의 Assert 를 제거하고 다시 APK를 빌드하여 핸드폰에서 실행하자 거짓말처럼 GetTable 함수가 정상적인 값을 반환했다.
대체 이해가 불가하여 옆자리 동료에게 물어보니 이유를 들을 수 있었다.
Assert 함수들의 소스 코드를 보면
[Conditional("UNITY_ASSERTIONS")] public static void IsTrue(bool condition) { Assert.IsTrue(condition, (string) null); }
[Conditional("UNITY_ASSERTIONS")] 가 붙어있음을 확인 할 수 있다.
에디터에서 Assert 함수들이 잘 동작하는 이유는 유니티가 C# 프로젝트 파일을 만들때
속성에 위 스크린샷 처럼 UNITY_ASSERTIONS 속성을 강제로 넣어주기 때문이다.
APK에서는 UNITY_ASSERTIONS 속성이 정의되어 있지 않고, Assert 함수들은 동작하지 않게 된다.
게다가 GetTable 함수의 Assert 코드 위에 IValue value = null; 로 초기화까지 해 버렸다.(C++ 쓰던 습관으로)
아마 IValue value; 로 했었으면 APK 빌드 도중 컴파일 에러가 나서 더 빨리 문제를 찾을수 있었을 지도.
APK에서도 Assert 함수들을 사용하고 싶으면 UNITY_ASSERTIONS 디파인을
Player Settings -> Other Settings -> Scripting Define Symbols 에 추가하면 된다.