본문 바로가기

C#/Unity

WWW로 렉없이 텍스쳐 로드하기 var www = UnityWebRequestTexture.GetTexture("https://static.pexels.com/photos/236047/pexels-photo-236047.jpeg"); yield return www.SendWebRequest(); var texture = DownloadHandlerTexture.GetContent(www); 더보기
[IL2CPP] Avoid Boxing Avoid BoxingIL2CPP OPTIMIZATION : Avoid Boxing Boxing은 코스트가 높은 연산이다. 이 글에서는 기존 C# 컴파일러는 특정한 상황에서 불필요한 Boxing이 수행되고, IL2CPP가 이를 어떻게 회피하는지를 보여준다.기존 C# 컴파일러의 방식interface HasSize { int CalculateSize(); } struct Tree : HasSize { private int years; public Tree(int age) { years = age; } public int CalculateSize() { return years*3; } }public static int TotalSize(params T[] things) where T : HasSize { va.. 더보기
[Unity] 왜 만들었는지 모를 IL2CPP IL2CPP는 유니티에서 발표한 AOT 컴파일러이다. 특이한점이 있다면, 인풋은 이미 빌드된 IL 코드 (DLL)이며, 아웃풋은 C++ 코드이다.그러니까 이미 빌드된 바이너리를 다시 뜯어서 컴파일 가능한 C++ 소스코드로 만들어낸다는건데, 어떻게보면 AOT가이나리 디컴파일로 생각할수도 있겠다. 유니티가 주장하는 IL2CPP의 장점- 퍼포먼스 : c++로 변환되서 네이티브 어셈블리로 실행되기 때문에 퍼포먼스 향상이 있다고 한다. 근데 처음부터 c++로 짜여진 코드도 아니고, IL을 c++ 코드로 변환한것이기때문에 최종 결과물인 c++ 코드에 .Net VM 호환성을 위한 코드들이 상당히 많이 들어간다. 어차피 Mono도 JIT이니, AOT니 전부 지원하는데 큰 효과가 있느지는 잘 모르겠다. 유니티측 벤치는 .. 더보기
[Unity] Unhandled Exception 처리하기 public void AddExceptionHandler() { // 유니티 메인 스레드가 아닌 다른 스레드에서 발생한 익셉션은 여기로 핸들링됩니다. AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; #pragma warning disable 0618 // 유니티 스레드에서 발생된 익셉션은 여기로 핸들링됩니다. UnityEngine.Application.RegisterLogCallback((condition, stackTrace, type) => { if (type != LogType.Exception) return; SendLog(condition, stackTrace); }); #pragma warning r.. 더보기
[Unity] ISO LanguageCode 가져오기 언어 코드 (language code) 가져오기 [DllImport("kernel32.dll")] private static extern int GetUserDefaultLCID(); var lcid = GetUserDefaultLCID(); var culture = new System.Globalization.CultureInfo(lcid); return culture.TwoLetterISOLanguageName; 유니티에서 C#의 컬쳐 코드를 가져오는 API (CurrentCulture) 를 사용하면 무조건 "en-US" 고정값이 나온다. ( https://feedback.unity3d.com/suggestions/fix-localization-issues-with-cor ) 이를 해결하는 (아마 유.. 더보기
[Unity] IL2CPP 에서 MissingMethodException 가 발생할 때 리플렉션 등을 이용할 때, 코드 스트리핑에 의해서 해당 생성자에 대해서 CPP 코드가 생성이 안된 경우 (리플렉션이 게임 코드에 없더라도, 게임 내부에서 사용하는 다른 라이브러리 코드에 있을 수 있다.)유니티는 쓰지 않는다고 판단하는 코드는 자동으로 제거하기 때문에, 쓰는척을 해줘야한다. 아래 코드는 코드 스트리핑을 방지하기 위한 트릭 (아래 익셉션은 주로 json 라이브러리에서 일어난다.,)MissingMethodException: Method not found: 'Default constructor not found...ctor() of System.ComponentModel.Int32ConverterMissingMethodException: Method not found: 'Default const.. 더보기
[IL2CPP] Assembly.GetCallingAssembly 가 동작하지 않을 때 IL2CPP 환경에서 Assembly.GetCallingAssembly().GetTypes() 메소드가 기대한 것과 같이 동작하지 않을 때 어셈블리 문제알 수 없는 이유(버그?) 로 Assembly.GetCallingAssembly() 메소드는 Mono2x 일때와 IL2CPP 일 때 다른 값이 반환됩니다. 이를 해결하기 위해 해당 메소드 대신 typeof(FooType).Assembly 식의 접근법으로 어셈블리를 가져오는것으로 고칠 수 있습니다. (FooType은 찾고자 하는 어셈블리 안에 들어있는 타입이어야 합니다.) (또는) 코드 스트리핑 http://docs.unity3d.com/kr/current/Manual/iphone-playerSizeOptimization.html 스트립은 정적 코드 분석에.. 더보기
[Unity] Android keystore 경로 상대경로로 지정하기 유니티의 안드로이드 빌드 환경을 설정에서 키스토어 파일을 등록할 때, 일반적으로 Browe Keystore 버튼으로 파일을 등록하게 되면 위 사진과 같이 절대경로가 설정된다. 자동 빌드 환경이나, 서로 다른 빌드 머신에서 빌드하고자 할 때 굉장히 짜증나는 부분이며 제대로된 해결 방법은 없고 편법을 사용해야 하는 것을 보인다. 유니티 상단 메뉴 -> Edit -> Project Settings -> Editor -> Asset Serialization값을 Force Text 로 변경한다. 이 작업은 다른 설정 또는 .unity 파일도 모두 변경합니다. 프로젝트 경로 -> ProjectSettings 폴더 -> ProjectSettings.asset 을 열면 텍스트로 변환되어 있다. 이중 AndroidKey.. 더보기
[Unity] JsonUtility 사용하기 Unity 5.3 버전에서의 변경 사항 중에는 JSON API의 추가가 포함되어 있습니다. (http://blogs.unity3d.com/kr/2015/12/08/unity-5-3-all-new-features-and-more-platforms/)이전 버전의 유니티에서는 JSON을 사용하려면 외부 라이브러리를 사용하여야 했는데, 각각의 JSON 라이브러리는 iOS/IL2CPP와 호환이 좋지 않은 것들도 있었으며, 게임에 추가한 외부 플러그인에서 JSON 라이브러리를 사용하는 경우도 있어 실제 게임 앱은 하나인데 그 안에 JSON 라이브러리만 2~3종류가 들어가있는 경우도 종종 있었습니다. 유니티에서는 아마 이러한 문제점들을 파악하고 이를 위한 해결책으로 Unity 자체적으로 JSON 라이브러리를 제공하게.. 더보기