TIL - Today I Learned : Forward Declaration 전방 선언을 통해 불필요한 헤터파일을 추가하지 않을 수 있다.
오늘의 진도: Section 5: Toon Tank 112. project Intro ~ 116. Constructing The Capsule
Project Intro
- 탱크를 만든다!
- WASD와 마우스 클릭으로 탱크를 조종한다!
- 적 탱크도 만든다!
- HP, Damage, Destruction을 구현한다!
- 재미있는 Effect도 만든다!
- HUD 디스플레이를 만들어서 게임의 시작과 끝을 보여준다!
새로운 프로젝트로 시작한다!
Pawn Class Creation
플레이어를 위한 탱크와 적 AI를 위한 배이스 클래스를 만들어준다.
부모가 될 클래스는 Pawn으로 시작한다.
월드에 배치할 수 있고 조작할 수 있지만 이족보행으로 다니지 않을테니 Pawn이 가장 이상적이다.
Actor > Pawn > Character | |
Character | |
이족 보행 캐릭터의 다양한 움직임 가능 |
A Character is designed for a vertically-oriented player representation that can walk, run, jump, fly, and swim through the world |
Pawn | |
컨트롤러에 의해 소유 가능 이동 입력을 처리 가능 |
The Pawn class is the base class of all Actors that can be controlled by players or AI. |
Actor | |
월드에 배치 가능 시각적 표현가능 |
An Actor is any object that can be placed into a level, such as a Camera, static mesh, or player start location. Actors support 3D transformations such as translation, rotation, and scaling |
Components
USceneComponent는 월드의 특정 물리적 위치에 존재할 수 있는 컴포넌트이다.
Transform을 가지고 있고 Attachment를 지원하지만 실제로 볼 수는 없다.
USceneComponent에서 파생된 Component로는 UCapsuleComponent와 UStaticMeshComponent가 있다.
UCapsuleComponent는 충돌을 처리하는 기능이 있고 UStaticMeshComponent는 시각적 표현 기능이 있다.
Pawn Class를 상속받은 BasePawn에서 RootComponent를 확인하면
Actor의 USceneComponent 변수가 나온다.
특정 Pawn의 위치를 가져올때엔 SceneComponent의 Transform을 가져오게 된다.
그리고 Root Component는 다른 컴포넌트를 할당할 수 있다.
SceneComponent는 Attachment를 지원하는데 다른 컴포넌트를 만들어서 연결할 수 있는 것이다.
컴포넌트를 연결하거나 Root Component를 재할당하는 방법은 Blueprint에서 할 수 있다.
원하는 컴포넌트를 드래그해서 RootComponent에 두면 Root Component를 재할당하는 것이고
+Add를 해서 새로운 컴포넌트를 추가하면 연결해주는 것이다.
카와이한 탱크가 만들어졌다
참고 링크 : Components
Forward Declaration
BasePawn Class에 앞으로 생성할 클래스들이 필요로하는 요소들을 담아둔다.
Static Mesh를 위한 StaticMeshComponent나 Collision을 위한 CapsuleComponent 같은 것들이다.
BasePawn의 헤더파일에 UCapsuleComponent 변수를 선언한다고 할 때
UCapsuleComponent를 사용하려면 이게 들어있는 헤더파일을 추가해줘야한다.
#include "Components/CalsuleComponent.h" 를 해주게 되면
preprocessor가 모든 내용을 복붙해버려서 파일이 쓸데없이 커지게 된다.
이를 방지하기 위해 타입 앞에 class를 붙여 전방 선언을 해주면 컴파일러가 이게 뭔지 알게 된다.
하지만 이렇게 하면 이 타입은 불완전한 타입이 되어 나중에 접근할 때 오류가 발생한다.
그래서 실제로 UCapsuleComponent에 접근하려면 CapsuleComponent.h가 필요하다.
헤더파일에 헤더 파일을 추가하면 불필요한 복사가 발생하니
cpp파일에서 실제로 기능이 필요할 때 해당 헤더 파일을 추가해서 사용하면 된다.
만약 Forward Declaration을 하지 않고 컴파일하게 되면 다음과 같은 오류가 발생한다.
CapsuleComp가 ABasePawn의 맴버가 아니라고 한다. (어디서 왔는지도 모르는 애가 있어서 그렇다)
참고 링크 : UCapsuleComponent
Constructing The Capsule
BasePawn의 생성자에 Capsule Component를 추가하고 CapsuleCollider라고 이름을 지어주고
RootComponent를 CapsuleComp으로 지정하였다.
만들어둔 C++클래스로 만든 BasePawn을 월드에 놓으면 클래스의 인스턴스를 생성한다.
생성자에서 정해둔대로 개체가 만들어진다.
'Unreal Engine > Udemy:UE5 C++ 학습하고 게임 만들기' 카테고리의 다른 글
Unreal Day - 33 - Sweep! 감지한다 충돌 (2) | 2024.07.03 |
---|---|
Unreal Day - 32 - Default & Instance of Blueprint (0) | 2024.06.30 |
Unreal Day - 30 - End of Section 4. Crypt Raider (0) | 2024.06.26 |
Unreal Day - 29 - Dependency Injection (1) | 2024.06.26 |
Unreal Day - 28 - GetOverlappingActors() (2) | 2024.06.21 |