목록Game Dev (263)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DKtsK/btrtRDigq1P/TW6LTGIrlTL8Z3dB5KlnP1/img.jpg)
이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다) 게임플레이 프레임워크 게임의 규칙을 관리하는 게임 모드와 플레이어가 조종하는 액터인 폰에 대해 알아보자. 프로젝트 세팅의 Selected GameMode 를 보면, Default Pawn Class 항목에서 게임에 입장한 플레이어에게 주어질 조종할 수 있는 액터, 폰의 타입을 지정할 수 있다. 언리얼 에디터에서 각각 GameMode, Pawn 을 상속받은 ABGameMode, ABPawn 을 생성하자. 그 후, 월드 세팅에서 GameMode O..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/1mo04/btrs7BGecIJ/yknOQOnztAT8qxXIJ1kdKK/img.jpg)
이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다) 로깅 환경 설정 언리얼은 로깅 환경을 위해 UE_LOG 라는 매크로를 제공한다. UE_LOG(카테고리, 로깅 수준, 형식 문자열, 인자.. ) 로깅 수준은 크게 메시지(Log), 경고(Warning), 에러(Error) 이렇게 세 가지로 나뉜다. 언리얼 형식 문자열은 FString 을 이용해서 처리하는데, 다음과 같은 형식을 띤다. FString::Printf(TEXT("Actor Name : %s, ID : %d, Location X : %...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOtw8b/btrs4OeJw0O/5krW78Onid5pz8CY7hjPok/img.jpg)
이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다) 월드의 개념 월드는 다음과 같은 기초 요소를 제공한다. 공간(Space) : 가상세계를 구성하는 3차원의 영역 (Transform) 이라는 구조체 제공. 단위는 cm 시간(Time) : 가상 공간에서 흐르는 시간 물리(Physics) : 월드 공간에 배치된 물체에 작용하는 물리적인 환경(중력 등). 물체가 월드로부터 물리적인 영향을 받으려면 콜리전(Collision) 정보가 있어야 한다. 렌더링(Rendering) : 엔진이 제공하는 시각적인 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b3lRS8/btroWodk3Dj/OtQO5NWbjNNeuVCGqE1yxK/img.jpg)
이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다) C++ 클래스 만들기 먼저, 가장 기본적인 C++ 클래스를 만들어 보자. 파일->New C++ Class를 선택하고, 모든 클래스를 표시한 뒤 Object를 선택한다. Object는 대화상자에 만들지만, C++ 코드에서 생성할 C++클래스는 UObject이며 대문자 U가 선행된다는 점을 참고로 알아두자. C++ 프로젝트를 열면, 다음과 같은 다섯지가 프로젝트의 빌드 구성을 볼 수 있다. 각 특징은 다음과 같다. DebugGame : 자세한 디버..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cU3iPi/btrnBtAdkeg/ehbzqKks8AfVLaOVV3cLzk/img.png)
먼저 Get Control Rotation을 구한 후, Make Rotator로 degree로 변환된 값을 만든다. 방향 벡터를 추출하고, Normalize를 해 준 뒤, Add MovementInput과 연결시키면 끝. 추후 달리기 기능을 구현할 텐데, 속력으로 동작을 구분지으면 된다. Character Movement: Walking에서 Max Walk Speed를 조정해 속력을 결정하자. 뛰기의 경우, 위의 Max Walk Speed 를 조정해 주기만 하면 된다. 액션 매핑에서 Run을 추가하고, 다음과 같이 만들어준다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/MBfqU/btrmAKigsjs/VAaDSCaag6P5sLQWpHVVN0/img.jpg)
언리얼 엔진 - 시점 변환 및 카메라 설정 위와 같이 Blueprint class -> Character class를 만든 다음, Capsule Component를 이용해 Collision을 만들어 주자. Mesh는 이미 만들어둔 Skeleton mesh를 적용하고, SpringArm과 Camera를 만들어준다. 축 매핑에 위와 같이 VerticalLook과 HorizontalLook을 만들어 준 다음, Player를 컨트롤하는 BP_Player를 열어 이벤트 그래프를 다음과 같이 구성한다. 그후, BP_Player(셀프, 플레이어의 블루프린트 클래스이다)의 속성에서 Pawn -> Use Controller Rotation Yaw 체크박스 해제, Auto Possess Player에 Player0을 지정..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cLKSLu/btrlxg8SLvU/dqqtS58Mtv7Y8bRn3p2P01/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 4-4. 시간 측정과 애니메이션 (타이머, GameTimer 클래스) 알아 두어야 할 개념들 : 1. 성능 타이머 정밀한 시간 측정을 위해, 이 책의 예제들은 Windows가 제공하는 성능타이머(perfomance timer)를 사용한다. 이를 성능 카운터(performance counter)라고도 부른다(Windows.h 를 include). 성능 타이머의 시간 측정 단위는 '지나간 클럭 틱(tick)'들의 개수(count)이다. 성능 타이머로부터 틱 수 단위의 현재 시간을 얻을 때에는 다음과 같이 QueryPerformanceCounter 함수를 사용한다. __int64 currTim..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LwuAd/btrlnSOlbhz/1rZrgerZzpQIcS1m4R1n7K/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 4-3. Direct3D 초기화 (ID3D12Device, Fence, 4X MSAA 점검 등) Direct3D 초기화 과정은 다음과 같은 단계들로 구성된다. 1. D3D12CreateDevice 함수를 이용해서 ID3D12Device를 생성한다. 2. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다 3. 4X MSAA(Multisample anti-aliasing) 품질 수준 지원 여부를 점검한다. 4. 명령 대기열과 명령 목록 할당자, 그리고 주 명령 목록을 생상한다. 5. 교환 사슬을 서술하고 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/blqhry/btrlgStARAD/OLT0dtRuxcpt58NuFsOY70/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 4-2. Direct3D 기초 : CPU와 GPU의 상호작용 , 명령 대기열, CPU/GPU 동기화 알아 두어야 할 개념들 : 명령 대기열과 명령 목록 CPU는 GPU와 상호작용하며 그래픽을 그려준다. 우리는 GPU와 CPU가 각각 쉬지 않고 열심히 일하기를 원한다. CPU/GPU 사이에는 동기화가 필요하지만, 동기화는 병렬성을 망칠 수 있다. 즉, 명령 대기열이 꽉 차 CPU가 놀거나 명령 대기열이 비어 있어 GPU가 노는 상황은 방지해야 한다. Direct3D 12에서 명령 대기열을 대표하는 인터페이스는 ID3D12CommandQueue이다. 이 인터페이스를 생성하려면 대기열을 서술하..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qGubi/btrk6LCt828/YsCR2QaCKYiV9QAvyWbPi1/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 4-1. Direct3D 기초 : COM, 텍스쳐 형식, 교환사슬과 페이지 전환, 깊이 버퍼링, 다중 표본화, DXGI, 상주성 알아 두어야 할 개념들 : COM(Component Object Model) COM은 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술이다. COM 객체를 C++ 클래스로 간주하고 사용해도 무방하다. 프로그래머는 COM 인터페이스의 함수들과 메서드를 이용하기만 한다. (new로 생성할 일이 없다는 뜻이다.) 또한 delete로 메모리를 해제하는 것이 아니라 release를 통해 더 이상 해당 객체를 사용하지 않음을 명시해 주어야 한다. ..