본문 바로가기

반응형

C#

(31)
FoV - 쉐도우 캐스팅(Shadow Casting) 들어가며 로그라이크 게임의 핵심 요소 중에는 FoV라는 것이 있다. FoV란, 'Field of View' 또는 'Field of Vision'의 약자로써, 아래 이미지 처럼 플레이가 던전과 같은 필드의 특정 위치에서 볼 수 있는 오브젝트와 가려지는 오브젝트를 구분하여 디스플레이하는 기능을 말한다. FoV를 구현하기 위해 간단하게 사용되는 방법으로는 '라이트 트레이싱(Light tracing)'이 있다. 라이트 트레이싱이란 시작점 - 일반적으로 플레이어 캐릭터 - 에서 바깥 쪽으로 가상의 빛을 쏘아 장애물에 의해 막히는 맵 셀을 탐지하는 방법이다. 라이트 트레이싱은 간단히 구현할 수 있다는 장점이 있는 반면, 아래 이미지 처럼 같은 셀에 대해 여러번 같은 연산을 수행하게 되어 CPU의 낭비가 발생한다는 ..
[C#] 문자열(string) 완벽 가이드 System.String 클래스 C#에서는 문자열을 처리하기 위해 System.String 클래스를 제공한다. String 클래스는 문자열을 안전하게 작성, 조작 및 비교할 수 있도록 다양한 메서드들을 제공하며 문자열 관련 작업을 단순화하기 위해 연산자 오버로드도 제공한다. C# 프로그래밍 예제에 흔히 등장하는 소문자로 시작하는 string 클래스는 System.String 클래스의 별칭으로 System.String 클래스와 완전히 동일하다. 본 포스트에서는 System.String 대신 string 키워드를 사용할 것이며 이는 System.String으로 대체해도 무방하다. ※ 설명의 편의를 위해 본 포스트에서는 String 객체 자체를 지칭할 때는 '스트링'이란 용어를 사용하고, 문자의 배열 또는 텍..
[C#] MiniDump 남기기 들어가며 추리 영화에서 살인 피해자들이 항상 다잉 메시지를 남기듯 우리의 어플리케이션도 어떤 이유로 죽게 되었는지 알릴 수 있는 '코어 덤프'라는 것을 남길 수 있다. 하지만 코어 덤프를 남기기 위해서는 최소한의 작업을 개발자가 해줘야만 한다.이번 포스트에서는 윈도우 플랫폼에서 C#으로 작성된 프로그램에서 코어 덤프를 남길 수 있는 방법에 대해 살펴 보도록 하겠다. 참고로 리눅스에서 코어 덤프를 남기는 방법은 [여기]를 참고하면 된다. 처리 되지 않은 예외 본격적인 내용에 앞서 간단한 개념 정도는 알고 넘어 가도록하자. 굳이 몰라도 코어 덤프를 남기는 데는 문제 없는 내용이니 궁금하지 않다면 다음 섹션으로 바로 넘어가도 괜찮다(바쁘신 분들은 [여기]의 전체 코드를 복붙해서 사용해도 상관 없다). '예외(..
[Unity] Physics.Raycast 완벽 가이드 들어가며 Unity의 Physics.Raycast는 직선을 씬에 투영하여 대상에 적중되면 true를 리턴하는 물리 함수다. Raycast 함수는 캐스팅 성공 실패에 따른 결과만 리턴하는 간단한 형태에서 부터 대상과 Ray의 충돌에 관련된 자세한 정보를(직선과 객체의 교차 정보. 거리, 위치, 캐스팅에 검출 된 객체의 Transform에 대한 참조 등) 리턴하는 다양한 버전이 제공 되고 있다. 이번 포스트에서는 Raycast 함수를 사용하기 위해 알아야할 필수적인 요소들을 살펴 보는 시간을 갖도록 하겠다. Unity에서 Raycast를 사용하는 법 Unity 2020.3 버전 기준으로 Physics.Raycast는 아래와 같이 다양한 버전으로 오버로드 되어 제공되고 있다. bool Raycast(Vecto..
[C#] C# 구조체(struct)로 메모리 절약하기 들어가며 C++에 익숙한 사용자라면 class와 struct의 차이라고 해봐야 멤버에 대한 기본 접근한정이 private이냐 public이냐 정도차이 라고 알고 있을 것이다. 하지만 C#에서는 class와 struct의 차이가 매우 크다. 이 포스트에서는 C#에서 struct와 class에 대한 차이를 설명하고 struct를 이용해 많은 메모리를 절약한 시나리오에 대해 알아 보도록 하겠다. 메모리의 타입(유형) 코드에서 객체를 생성할 때 마다 객체는 어느 정도의 메모리를 필요하게 된다. 객체에 대한 메모리는 사용 중이 아닌 영역에 할 당되어야 하며, 이 할당 되어야 하는 메모리는 크게 '스택'과 '힙'이라는 두 가지 종류가 있다. 본론에 들어가기 앞서 이 두가지 유형의 메모리에 대해 간단히 살펴 보도록 ..
[C#] 두 시간의 차이 구하기 - TimeSpan C#에서는 현재 시간을 나타내기 위해 DateTime이라는 자료구조를 제공한다. 이번 포스트에서는 두 DateTime 간의 시간의 차이를 구하는 TimeSpan의 사용 방법에 대해 알아 보도록 하겠다. using System; using System.Threading; DateTime start = DateTime.Now; // 현재 시각 구하기 Thread.Sleep(5000); // 5초 정도 슬립 TimeSpan span = DateTime.Now - start; Console.WriteLine(span); Console.WriteLine(span.TotalSecone); // 초 단위 시간차 구하기 Console.WriteLine(span.TotalMilliSecone); // 밀리 초 단위 시간..
[C#] Generic Constraints 들어가며 클래스에 제네릭을 적용할 때 제네릭 인자를 특정 클래스를 상속 받은 것만 사용 할 수 있도록 하고 싶은데 어떻게 해야 할지 몰라 찾아 보니 [여기]에 설명이 되어 있길래 번역해본다. C#은 제네릭 타입을 사용 할 때 제약 사항을 줄 수 있다. 이 제약 사항들을 이용하여 제네릭 타입의 인스턴스를 생성하는 코드를 컴파일 타임에 에러를 찾아 낼 수 있다. where 키워드를 이용해 제네릭 타입에 대해 하나 또는 이상의 제약사항을 설정 할 수 있다. GenericTypeName where T : constraint1, constraint2 아래 예제는 보여준다. 제약 사항과 함께하는 제네릭 클래스에 제약사항을 class DataStore where T : class { public T Data { ge..
[C#] CONST와 READONLY의 차이 C#에서 READONLY와 CONST의 차이는 무엇일까? 변수가 단순히 읽을 수만 읽고 변경이 불가능하다는 '상수'를 정의하는 것이라면 둘 다 같은 것인가? 대답은 당연히 '아니오'다. 만일 같다고하면 이 포스트는 시작도 하지 않았을 것이다. 그렇다면 둘의 차이는 무엇인가? 가장 기본적인 부분에서 부터 출발해보자. 일단 겉보기에는 둘다 같은 기능을 가졌지만 이름만 다른것 처럼 보인다. 하지만 우리가 이 둘의 차이를 제대로 이해하지 못하고 남발하게 되면 꽤나 심각하고 많은 문제을 일으키게 될 가능성이 높다. C#에서 상수를 정의하기 위해서는 아래와 같이 사용한다. public const double PI = 3.14; const 한정자는 컴파일러에게 이 변수는 할당 된 값을 절대 변경하지 않을 것임을 알려..
[C#] AppDomain.GetAssemblies 메소드 사용하기 들어가며 서버를 만드는데 메시지를 핸들링하는 클래스를 만들때 마다 디스패칭을 해줄 수 있는 어딘가에 매번 등록하는게 귀찮았다. 'C#에는 리플렉션도 있는데 특정 클래스를 상속 받으면 해당 클래스들을 자동으로 찾아서 디스패처에 등록하는 방법은 없을까?' 있더라... GetAssemblies() 메소드를 이용해 현재 로드된 어셈블리의 목록을 가져 오고, 그 어셈블리에서 내가 필요한 타입만을 쏙쏙 뽑아 올 수 있었다. 아래는 한줄 한줄 설명하며 진행 된다. 만일 설명 필요 없고 그냥 예제 코드가 필요하다 하시는 분이나 나는 전체 예제를 봐야 윤곽이 쉽게 잡힌다 하시는 분들은 [여기]를 클릭하도록 하자. 코드 살펴 보기 먼저 베이스가 될 BaseMsgHandler 클래스가 있다고 가정하자. 우리는 이 클래스를 ..
[C#] 비동기 프로그래밍 - 코루틴(coroutine) 기반 비동기 서버 이번 포스트에서는 node.js와 같은 싱글 스레드 기반 비동기 서버(? 정확하게는 싱글 스레드는 아니지만..이건 다음에 설명하자) 프레임워크를 C# 프로그래밍 언어를 이용해 만드는 방법에 대해 살펴 보도록하겠다. 추가하여 콜백을 사용하지 않고도 비동기 작업을 처리 할 수 있는 부분도 함께 살펴 본다. 들어가며 일반적으로 네트워크 프로그래밍을 하게 되면(특히 서버) 대용량 트래픽을 처리하기 위해 비동기 핸들링을 선호하게 된다. 예를 들어 IO를 처리 할 때 메시지를 보내고 응답을 받을 때 까지 블로킹 되는 시간을 줄이기 위해 비동기를 많이 사용한다. 비동기 IO는 성능상으로는 확실히 이점을 가질 수 있지만, 비동기 작업이 완료 되었을 때 운영체제로 부터 작업 완료 통보를 받을 수 있는 별도의 콜백 함수를..

반응형