목록Game Dev (263)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/1sX0F/btrSW5oqvCp/tUiKj3xUl0l4xM7kt722ek/img.jpg)
슬레이트 구조 (아키텍처) 사실 언리얼에는 이미 UMG 라는, 매우 편리한 위젯 관련 툴이 존재한다. 하지만 코드로 UI 를 컨트롤할 수 있다는 장점 때문에, 실제로 많은 곳에서 슬레이트(Slate) 를 활용하고 있다. 슬레이트는 어떤 녀석이고, 어떻게 디자인되어 있는지, 공식 문서(번역본)를 통해 먼저 간단하게 짚고 넘어가도록 하자! 이번 글에서는 슬레이트가 추구하는 방향과 철학에 대해 다룬다. 일단, 에디터 인터페이스의 대부분은 슬레이트로 제작되어 있다. Contents Browser 뿐만 아니라 블루프린트 에디터, 애니메이션 에디터 등 엔진 인터페이스의 대부분을 차지하고 있다. 슬레이트는 다음과 같은 접근법을 사용한다 : (불투명 캐시와 중복 스테이트를 피하기 위해. 전통적으로 UI 는 스테이트를 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dEl2Bp/btrSQThHp2U/cLjDteoVy7NXpxVkY2b1u1/img.jpg)
UUserWidget 의 Native 함수 //native SObjectWidget methods (see the corresponding BlueprintImplementableEvent declarations above for more info on each) friend class SObjectWidget; virtual void NativeOnInitialized(); virtual void NativePreConstruct(); virtual void NativeConstruct(); virtual void NativeDestruct(); virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime); UserWidget 에는 위..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2xJub/btrSCrqTanu/aSmuRUH890lreEkR08Yaz0/img.jpg)
더티 플래그 패턴이란? 더티 플래그 패턴에 대해서는, 이전 블로그 글에서 간단하게 언급한 바 있다. 더티 플래그 패턴은 일반적으로 렌더링 과정에서, 계층 구조가 존재할 경우, 필요할 때 / 필요한 타이밍에 화면을 갱신하는 부분에서 자주 쓰인다. 또한 더티 플래그를 체크해 UI 를 갱신하게 되면, Tick 마다 UI 업데이트가 중복해서 일어나는 것을 막을 수 있다. 그렇다면 이 패턴을 언리얼에서는 어떤 방식으로 적용해 볼 수 있을까? 예를 들어, 우리가 어떤 UI 를 갱신 하는데,Dirty Flag 를 두어 해당 더티 플래그가 켜져 있을 때만 UI 를 갱신한다고 가정해 보자. 일단, 실제로 UI 클래스를 만들기 전에, 더티 플래그 패턴을 사용할 위젯들이 공통적으로 사용할 인터페이스를 다음과 같이 정의할 수..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DhTwJ/btrRppNTz6d/1r4h1GNnIzPtoytM8RrS1K/img.jpg)
위젯 리플렉터 언리얼의 위젯 리플렉터 기능을 이용하면, 현재 플레이하고 있는 창에서 어떤 위젯이 어떤 블루프린트를 사용하고 있는지, visibility 상태는 어떠한지 등을 한눈에 파악할 수 있다(위젯 리플렉터 : 창 > 개발자 툴 > 위젯 리플렉터). 더 자세한 사항은 이득우님 블로그의 에디터 확장 기초 글을 참고하자. 위의 히트 테스트 가능 위젯을 누르면, 다음과 같이 플레이 화면과 위젯 리플렉터 창이 바뀌는 것을 확인할 수 있다(이미지는 공식 문서에서 가져옴) 해당 위젯의 계층 구조를 파악할 수 있으며, 실시간으로 위젯을 끄고 킬 수도 있어 위젯 관련 디버깅에 매우 유용한 기능이다!
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QHTg6/btrP7MEffXr/9AskiEpxkm6kwIwuZ8bItK/img.png)
Asio 는 Asynchronous IO 의 약자이다. Asio 를 이해하기 위해서는, 다음과 같은 용어들을 알고 있어야 한다. IO Service 클래스 : 커널에서 발생한 입출력 이벤트를 디스패치 해주는 기능을 수행. 디스패치란, 우선순위가 높은 작업이 우선적으로 수행될 수 있도록 시스템 자원을 할당하는 것을 의미한다. IO Service 클래스는 커널에서 발생한 네트워크상의 접속 및 데이터 처리 이벤트를 처리한다. 종단점(Endpoint) : 네트워크 상의 특정 컴퓨터에서 실행되고 있는 하나의 프로그램. 구체적으로 IP 주소와 포트 번호의 한 쌍을 종단점이라고 함. DNS(Domain Name Server) : Boost Asio 에서는 도메인 주소를 이용, IP 주소를 알아내어 종단점을 구한다. ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ryvPh/btrP6iwBWy7/tsCJYQQ5el5t6cVtk8COHK/img.png)
IOCP는 CPU 개수만큼만 쓰레드를 쓰는 서버이다. IOCP 를 사용한 모든 Send/Recv 는 Overlapped I/O 로 동작한다. 멀티쓰레드에서 동작하며, 콜백함수들을 동시에 동작해서 성능을 높인다. IOCP가 사용하는 IOCP 객체는 커널 안에서 관리된다. 커널 내에는 DEVICE LIST 라는 자료구조가 존재하는데, 소켓을 IOCP 에 등록하면 IOCP 객체는 DEVICE_LIST 에 소켓들을 등록해서 처리한다. 프로그래머는 DEVICE_LIST 를 직접 보거나 제어할 수 없다. 흐름을 다음과 같이 요약해 볼 수 있을 것 같다 : I/O 디바이스(소켓, FD) IOCP 에 등록 : CreateIoCompletionPrt 함수를 통해 디바이스와 CompletionPort(이하 CP) 를 바인..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ylokv/btrPQLZKR2j/zv4I7E2orbMMkwIu7K60pK/img.jpg)
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 변환 행렬의 역행렬 다양한 변환 행렬들의 역행렬을 알아보자. 크기 변환행렬 각 기저벡터의 크기를 각각 a, b 만큼 키우는 크기 변환행렬의 역행렬은 다음과 같다. 전단 변환행렬 평행사변형 처럼 미끄러지게 생긴 전단 변환행렬의 역행렬은 다음과 같다. 회전 변환행렬 회전 변환행렬의 역행렬은 다음과 같다. θ 만큼 반시계 방향으로 회전시키는 행렬의 역행렬을 구하기 위해서는, -θ 만큼 반시계 방향으로 회전시키는 행렬을 생각해보면 된다! 삼각함수의 성질을 이용하면 간단히 구할 수 있다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TrJy8/btrPycRYM4g/jzAktlor1oJ27CdZ7J9Fuk/img.jpg)
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 행렬을 이용한 회전변환 행렬을 이용해 어떤 물체를 반시계 방향으로 90 도 회전시키는 행렬을 구한다고 생각해 보자. 위의 그림을 보면, 두 벡터가 다음과 같이 변환된다. 표준기저벡터 e1 : (1, 0) -> (0, 1) 표준기저벡터 e2 : (0, 1) -> (-1, 0) 따라서 반시계로 90 도 회전 변환을 수행하는 행렬을 다음과 같이 설계할 수 있다. 시계방향으로 90 도 회전을 하는 경우는 다음과 같을 것이다 : 사실 90 도 회전의 경우는 행렬을 사용하지 않고 간단하게 다음과 같이 구할 수 있다. - 시계 방향으로 90 도 회전 : (x, y) ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/XwKUB/btrPx1iJK2A/pvGXiyKkuT1dUr3Wreky61/img.jpg)
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 극좌표계 우리는 기본적으로 데카르트 좌표계를 많이 이용하는데, 사실 회전을 할 때마다 x 와 y 의 변화를 매번 계산하는 것은 매우 번거로운 일일 수 있다. 이 경우, 원점으로부터의 거리 r 과 θ 의 두 요소로 구성된 극좌표계(Polar coordinate system) 을 사용할 수 있다. 일반적으로 arctan 함수를 이용하면 벡터의 각도를 얻어낼 수 있는데(tanθ = y/x 이므로, θ = arctan(y/x) 이 됨), arctan 함수는 치역이 -180도에서 180도까지 밖에 되지 않는다. 따라서 이를 해결하기 위해, x 와 y 값을 따로 전..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LyLrz/btrPjHRviaF/RHfLWje54jnOy18gPPwDJ0/img.jpg)
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 삼각함수를 활용한 물체의 회전 삼각함수를 통해 물체를 회전하면 좌표값이 어떻게 변할까? 먼저, 다음과 같이 좌표 (1, 1) 을 θ 만큼 반시계 방향으로 회전하면, 다음과 같이 그려지게 된다. 위에서, 벡터 v 는 기저 벡터 e1 와 e2 의 합으로 표현되며, 이를 각 θ 만큼 회전 시킨 녀석을 (cosθ - sinθ, sinθ + cosθ) 로 표현할 수 있음을 알 수 있다. 동일한 원리로, 임의의 벡터 (x, y) 를 각 θ 만큼 회전시켜 (x', y') 를 구해보자. 식은 다음과 같이 쓸 수 있다. 기저벡터를 활용하면, 임의의 벡터 u 를 각 θ 만..