본문 바로가기

C#

[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.. 더보기
[C#] Thread.Abort시에도 안전한 코드 작성하기 private static int g = 0; static void Foo() { while (true) { try { } finally { for (int i = 0; i < 100; i++) g++; } } } static void Main(string[] args) { var t = new Thread(Foo); t.Start(); Console.Read(); Console.WriteLine("ABORT"); t.Abort(); Console.WriteLine(g); Console.Read(); } Thread.Abort가 일어나면 작업이 중간에 끊기게 된다,만약 해당 스레드가 전역적인 상태(위의 예제에서는 g)를 건드리는 코드가 포함되었을 경우에는 상태가 망가져 프로그램 전체가 오작동하게 되는 원.. 더보기
[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 ) 이를 해결하는 (아마 유.. 더보기
[C# 7.0] 패턴 매칭, 디컴포지션 public class Data { public string name { get; set; } public int age { get; set; } } var data = new Data() { name = "Park", age = 11 }; if (data is Data {age is var a, name is "Park"}) { Console.WriteLine(a); } 패턴 매칭의 디컴포지션(decomposition) 기능을 사용하면, 타입 검사 + 프로퍼티 검사 + 변수 별명 붙이기를 한줄로 해결할 수 있습니다. 위 코드는 실제로 아래와 같이 해석됩니다. var _data = data as Data; if (_data != null && _data.name == "Park") { var a = _d.. 더보기
[C#] 슬랙(Slack) 봇 만들기 슬랙(https://slack.com/) 봇을 만들 수 있는 프레임워크를 제작하였습니다. 봇은 C# 스크립트로 동작하며, 아래는 가장 기본적인 예제입니다. [Subscribe("Hello")] public void OnHello(Message msg) { msg.Reply("Hi, " + msg.sender + "!"); } 프로젝트 깃허브 사이트 : https://github.com/pjc0247/Slacker* 봇을 헤로쿠에서 돌릴 수 있는 빌드팩과 가이드 또한 준비되어 있습니다.https://github.com/pjc0247/slacker_buildpack 더보기
[Unity] IL2CPP 에서 MissingMethodException 가 발생할 때 리플렉션 등을 이용할 때, 코드 스트리핑에 의해서 해당 생성자에 대해서 CPP 코드가 생성이 안된 경우 (리플렉션이 게임 코드에 없더라도, 게임 내부에서 사용하는 다른 라이브러리 코드에 있을 수 있다.)유니티는 쓰지 않는다고 판단하는 코드는 자동으로 제거하기 때문에, 쓰는척을 해줘야한다. 아래 코드는 코드 스트리핑을 방지하기 위한 트릭 (아래 익셉션은 주로 json 라이브러리에서 일어난다.,)MissingMethodException: Method not found: 'Default constructor not found...ctor() of System.ComponentModel.Int32ConverterMissingMethodException: Method not found: 'Default const.. 더보기
PubSub 기반의 게임 프로그래밍 * 오브젝트끼리의 디커플링* 메세지(이벤트)를 보낸사람이 누구인가는 중요하지 않다. * 네트워크에서오던, 로컬에서오던 똑같은 프로토콜로 통신하고 그냥 받아서 처리만 한다.* 쓸데없는 게임 매니저 잔뜩 만들어놓지 않아도 됨* 온라인/싱글간에 전환이 쉽다.* 목업 만들기 쉽다.* 이벤트를 시간순대로 출력하면 그 자체로 액티비티 로그가 완성됨* 이벤트의 순서와 값들을 살펴보면 어디부터 잘못 흘러가는지 알 수 있어 디버깅이 용이* 리플레이 제작이 용이, 그냥 이벤트 시간순대로 로컬에서 다시쏘면 코드 변경 없이 리플레이 됨* 내부적으로만 사용되지만, 외부에서 불르기는 해야하기때문에 무조건 public 으로 만들어야만 했던 메소드들을 완벽하게 숨길 수 있음.* 잘못된 씬 또는, 없는 오브젝트에 패킷을 배달할일이 없.. 더보기
[C#] Activator.CreateInstance 가 생성자를 못 찾을 때 Activator.CreateInstance 메소드가 가끔 생성자를 찾지 못하고 MissingMethodException 을 발생시킬때가 있습니다. 이는 해당 메소드가 조금 멍청해서, 주어진 정보로 알맞은 생성자를 찾아내지 못해서 발생하는 문제인데, 이 경우에는 Activator.CreateInstance 메소드를 사용하는것이 아닌 직접 생성자 메소드를 찾아서 Invoke로 호출해줘야 합니다. 코드는 아래와 같습니다. var instance = new TypeToConstruct(1234, "hello"); Type[] argTypes = new Type[] { /* TYPES */ typeof(int), typeof(string) }; object[] argValues = new object[] { /.. 더보기
[C#] 필립스 Hue 라이트 제어하기 필립스 Hue 라이트의 써드파티 SDK인 Q42.HueAPI 라이브러리를 이용하여 조명을 제어하는 방법을 알아봅니다.https://github.com/Q42/Q42.HueApi 다른 언어의 SDK 목록은 아래 링크에서 찾아볼 수 있습니다. http://www.developers.meethue.com/tools-and-sdks 먼저 NuGet 패키지 관리자에서 Q42.HueAPI를 설치합니다. using Q42.HueApi; using Q42.HueApi.Interfaces; IBridgeLocator locator = new HttpBridgeLocator(); IEnumerable bridgeIPs = await locator.LocateBridgesAsync(TimeSpan.FromSeconds(5).. 더보기
[C#] 콜스택 가져오기 using System.Diagnostics; var st = new StackTrace(); foreach (var frame in st.GetFrames()) { Console.WriteLine(frame.GetFileLineNumber()); Console.WriteLine(frame.GetFileName()); Console.WriteLine(frame.GetMethod()); } StackTrace기능을 사용하면 로그에 콜스택 정보를 포함시키거나, 자동적으로 호출자의 이름과 위치가 출력되는 는 Logger를 만들 수 있다. * System.Linq.Skip 같은 기능을 이용하여 위에서 몇번째의 콜스택은 무시하도록 만들 수 있다.* 이 기능은 옛날에 Unity와 IL2CPP 환경에서 동작하지 않았.. 더보기