게임 엔진/Unreal

[Unreal] 캐릭터와 입력 시스템

겜도리도리 2024. 2. 25. 23:18
반응형

앞서

이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다.

 

액터

액터는 월드에 속한 컨텐츠의 기본 단위이다.

액터는 트랜스폼을 가지고, 월드로부터 틱과 시간 서비스를 받는다.

액터는 논리적 개념이 아니다. 컴포넌트를 감싸는 포장 박스이다. 액터는 다수의 컴포넌트를 소유하고 있고 실질적인 구현은 컴포넌트에서 담당한다.

다수의 컴포넌트 중 컴포넌트를 대표하는 것을 루트 컴포넌트라고 한다.

액터는 반드시 루트 컴포넌트를 가져야하고, 루트 컴포넌트의 트랜스폼이 액터의 트랜스폼이 된다.

 

액터에서 컴포넌트 생성하기

컴포넌트는 언리얼 오브젝트(UObject) 이므로 UPROPERTY() 매크로를 설정해야 하고, TObjectPtr로 포인터 선언한다.

CDO에서 생성한 오브젝트는 자동으로 월드에 등록이 되고, NewObject로 생성한 오브젝트는 등록절차를 거쳐야 한다.

등록된 오브젝트들은 물리 및 렌더링 처리를 받을 수 있고 월드의 기능을 사용할 수 있다.

컴포넌트 지정자로는 객체타입과 값타입으로 사용되는 (Visible / Edit), 에디터에서 편집 가능한 영역을 설정하는 (Anywhere, DefaultsOnly, InstanceOnly), 블루프린트로 확장할 시 읽기 및 쓰기 권한을 설정하는 (BlueprintReadOnly / BluepirntReadWirte) 등이 있다.

 

C++ 클래스에서 액터 컴포넌트 설정하기

앞서 만들었던 분수대 블루프린트를 C++ 클래스로 제작해본다.

StaticMesh였던 Body, Water 두개는 헤더에 TObjectPtr로 전방선언 해준다.

 

Body와 Water의 StaticMesh를 CreateDefaultSubobject를 활용해 각각 생성해준다.

그 후 루트 컴포넌트를 Body를 지정하고, Water의 위치를 조정해준다.

 

그리고 각각 FObjectFinder를 사용해 Mesh의 asset을 경로를 통해 가져온 뒤, StaticMesh로 설정한다.

 

 

에디터에서 확인해보면 라이팅을 제외한 블루프린트로 설정한 것과 C++ 클래스로 설정한 것의 차이가 없음을 볼 수 있다.

폰의 기능

폰은 액터를 상속받아 플레이어가 빙의해 입출력을 처리한다. 폰은 길찾기를 사용할 수 있다.

폰은 크게 충돌 / 비주얼 / 움직임의 3가지 컴포넌트로 구성된다.

트랜스폼 없이 기능만 제공하는 컴포넌트를 액터 컴포넌트라고 한다.

 

Default 폰 직접 만들기

 

Pawn을 상속받아 ABCharacterBase의 헤더와 cpp파일을 생성한다.

그 후에 폰의 회전, 캡슐 컴포넌트, 움직임, 메쉬에 기본 설정을 진행한다.

에디터에서 Default Pawn을 ABCharacterBase로 지정하고 게임을 플레이하면 우리가 생성한 Pawn을 확인할 수 있다.

 

Pawn에 사용할 Skeletal Mesh와 AnimInsatnce의 레퍼런스를 각각 가져오고, Pawn에 각각 설정해준다.

 

움직임은 향상된 입력 시스템을 활용한다. 카메라는 플레이어가 조종하는 캐릭터에만 필요하므로, ABCharacterBase를 상속받은 ABCharacterPlayer에 SpringArm과 CameraComponet를 추가한다.

또한 향상된 입력을 받을 Jump, Move, Look InputAction을 전방선언 해주고 Move와 Look 함수를 각각 선언한다.

 

 

그 후에 cpp에서는 SpringArm과 Camera의 기본 셋팅을 진행한다.

 

향상된 인풋 시스템을 사용할 것이므로 각각의 InputAction에 대한 레퍼런스를 가져온다.

 

향상된 입력 시스템을 받아와 각각 Action에 대해 우리가 새롭게 선언한 Move, Look 등의 함수를 매핑해준다.

 

Move와 Look 함수에서는 각각의 입력에 해당하는 동작을 각각 기술한다.

 

게임이 시작되면, PlayerController의 향상된 입력 시스템을 가져와 우리가 선언한 입력처리에 대해 매핑을 진행해준다.

 

그 후 에디터에서 확인해보면 Default Pawn과 동일한 기능을 하는 Pawn을 볼 수 있다.

이미 생성되어있는 Default Pawn의 기능들을 C++ 클래스를 활용해 직접 생성할 수 있음을 확인했다.

반응형

'게임 엔진 > Unreal' 카테고리의 다른 글

[Unreal] ESlateVisibility  (0) 2024.03.05
[Unreal] 메모리 관리  (0) 2024.01.19
[Unreal] 델리게이트  (0) 2024.01.15
[Unreal] 언리얼 컴포지션과 UENUM  (0) 2024.01.12
[Unreal] 인터페이스  (0) 2023.12.27