본문 바로가기

분류 전체보기

[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 더보기
메세지 기반 프로그래밍 2 싱글 게임의 경우플레이어가 움직였을 경우, 그에 반응해야 하는 모든 컴포넌트들이 이벤트를 구독 싱글 게임에 단순히 Subscribe 노드 하나를 추가해서 멀티로 변경할 수 잇다.Network는 다른 모든 컴포넌트들과 완전히 동등한 레벨에서 이벤트를 구독받는다. 서버에서 패킷이 오는 경우에는 Network 노드가 Publisher 역할을 한다.매번 하는 말이지만, AI, Map등의 컴포넌트들은 네트워크에서 패킷을 받은게 아니라 그냥 평범하게 이벤트를 받아서 처리하는 입장이다. 더보기
카드게임 ㅇㄴ 더보기
[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++의 Nested Namespace http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html C++17 예상 목록에 포함된 중첩 네임스페이스, 이미 죽을대로 다 죽은 망겜에서 진작에 했어야됬는데 안한거 이제서야 패치하는느낌 더보기
[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[] { /.. 더보기