GameMode : 언리얼 엔진에서 제공하는 클래스로 일종의 총괄 관리자 게임매니저 클래스 역할
GameMode 와 GameModeBase 의 차이
GameModeBase : 초보자들이 사용하거나 굉장히 간단한 게임을 만들때 사용 멀티플레이 로직이 존재하지 않음
GameMode : GameModeBase 의 자손이긴하지만 제공하는 기능들이 굉장히 많고 싱글플레이도 사용가능하며 멀티플레이에선 필수적이다.
생성한 C++ 클래스를 블루프린트로 한번 감싸서 사용하는것이 좋다 에디터 내에서 파라미터를 수정하기 편리하고 유용할 때가 많다.
게임모드를 설정하는 두가지 방법
에디터에서 설정 : 프로젝트의 전역설정 모든 레벨에 적용
레벨에 월드 세팅 설정 : 현재 플레이중인 레벨에만 적용
레벨설정이 1순위 지정해준게 없다면 에디터 설정따라감
캐릭터 클래스와 폰 클래스의 차이
CharacterClass : 대부분의 캐릭터의 기능이 전부 구현되어있지만 이족보행하는 인간형 캐릭터만 만드는데 적합 자동차나 비행기 등 움직임이 다양할 경우 폰클래스를 사용하는것이 적합
PawnClass : 플레이어나 AI 어떤 객체나 소유가능하고 그런 객체의 가장 부모가 되는 상위클래스 내부에 구현된게 거의 없어서 기능을 하나 하나 구현할때 굉장히 유용함
캐릭터 클래스의 포함된 컴포넌트
CapsuleComponent : 캐릭터의 충돌처리를 담당하는 상위 컴포넌트 콜리전을 처리
ArrowComponent : CapsuleComponent의 하위 컴포넌트로 언리얼 엔진 기준 캐릭터가 바라보는 전방을 표시해주는 컴포넌트 X축기준
Mesh : StaticMesh 와는 다른 캐릭터의 3D모델링을 나타네는 SkeletalMesh 해당컴포넌트를 자세히 보면 3D캐릭터 모델링을 볼 수 있으며 해당 모델링에 하나하나 뼈가 계층구조로 이루어진 것을 확인할 수 있다. 세부적인 움직임을 표현가능
CharacterMovement : 엔진 자체에서 캐릭터의 논리적인 이동로직을 구현해놓은 컴포넌트 ex) 중력가속도, 점프 ,수영 등
1.SpringArm 및 CameraComponent 조정하기


스프링암 내부에 socketoffset 이라는 벡터를 발견했다 해당 벡터의 값을 수정하면 스프링암의 위치를 조정할 수 있고 스프링암 끝에 붙어있는 카메라 컴포넌트 또한 맞춰서 수정된다.

TargetArmLength 를 160으로 앞으로 줄여주었고 socketoffset 값을 할당하여 상단 에서 정면기준 좌측으로 살짝 기울어지게 설정했다.
컴파일 후 확인 :

적용한 값에따라서 바뀐위치를 확인 할 수 있었다.
2.Pawn vs. Character 개념 점검하기
Pawn C++ 클래스 만들어서 간단한 이동 구현해보기


앞서 배웠던것처럼 Pawn 클래스는 Character 클래스와는 다르게 구현이 되어있는것이 없어서 캐릭터처럼 움직이려면 내부컴포넌트를 구현해주어야한다. Pawn 클래스 같은 경우는 캐릭터보단 움직임이 특수한 대상이 적합함으로 움직이는 박스를 구현해본다.
필요한 컴포넌트 정리
1. 충돌을 처리할 boxComponent
2. 전방을 표시해줄 ArrowComponent
3. 박스의 형태를 표시해줄 StaticMesh
필요한 변수들의 클래스를 전방선언한 후 리플랙션 매크로 시스템을 이용해 변수들을 구현


해당 컴포넌트들을 부착 후 실행하여 중간확인

마찬가지로 컴포넌트들이 잘 부착되어 있는모습을 확인 가능
staticmesh 는 따로 값을 할당하지 않았기때문에 블프 에디터 내부에서 직접 넣어줌
마찬가지로 카메라 컴포넌트와 스프링암 구현


이후 과제 목표인 간단한 이동로직 구현


우선 AddActorLocaloffset 이용하여 초당 100만큼움직이는 로직 구현 후 이동확인
오류 기록 :

스프링암이 캐릭터를 따라가지 않는 이슈확인

Pawn이 움직이더라도 실제론 컴포넌트가 움직이기 때문에 SpringArm이 boxcomponent에 붙어있어야함 캐릭터 컴포넌트는 RootComponent에 Setup을 하게 되면 자동으로 CapsuleComponent 하위에 부착

설정해놓은 축방향으로 카메라가 따라 움직이며 잘 이동하는것을 확인
AddMovementInput 사용방법

AddMovementInput 함수를 그대로 사용해서 움직임을 구현해보려고 했으나, 단순히 인자값에 값을 곱해주는 방식으로는 이동을 하지 않기에 찾아보니 폰을 움직이려면 폰의 움직임을 제어하는 컴포넌트가 존재한다는것을 찾아내었다 UFloatingPawnMovement 제공되는 클래스를 이용해 만들어주면

이런식으로 폰의 움직임을 제어하는 컴포넌트를 부착할 수 있는데 이 컴포넌트의 속성을 보면

폰을 움직이게 할 수 있는 값들을 이미 제공한다 이를 이용해서 간단하게 AddMovementInput 함수를 사용해 앞으로 가는 Pawn을 만들 수 있었고 실행결과,

AddActorLocalOffset 보단 디테일하게 가속도까지 붙으며 앞으로 일정하게 움직이는 Pawn을 구현할 수 있었다.
AddMovementInput 자체가 너무 생소해서 여러가지로 다양하게 찾아서 구현하였다. 만족스럽게 혼자 생각해내서 구현한것은 아니라 만족감은 적었으나 직접 구현을 해보면서 컴포넌트의 구성이나 언리얼 엔진에서 제공하는 시스템만으로 간단한 로직같은것을 c++ 로 구현해볼 수 있어서 엔진시스템 파악 측면에선 많은 도움이 되었다. 추가적으로 UPROPERTY를 계속 활용하면서 리플렉션시스템에 점차 적응해 갈 수 있게 실력향상이 된 것 같다.