1 . 코드로 카메라, 암 붙이기
1 ) APlayerBase.cpp 생성자에서 Arm과 Camera 생성, 부모 컴포넌트 지정
APlayerBase::APlayerBase()
{
PrimaryActorTick.bCanEverTick = true;
mArm = CreateDefaultSubobject<USpringArmComponent>( L"Arm" );
mCamera = CreateDefaultSubobject<UCameraComponent>( L"Camera" );
mArm->AttachToComponent( GetCapsuleComponent(), FAttachmentTransformRules::KeepRelativeTransform );
mCamera->AttachToComponent( mArm, FAttachmentTransformRules::KeepRelativeTransform );
mArm->TargetArmLength = 500.f;
mArm->SetRelativeLocation( FVector( 0, 80, 0 ) );
mArm->SetRelativeRotation( FRotator( -30, 0, 0 ) );
}
▶️CreateDefaultSubobject<타입>(TEXT(“오브젝트이름”));
CreateDefaultSubobject<USpringArmComponent>(TEXT(“Arm”));
오브젝트 생성
▶️mArm->AttachToComponent( GetCapsuleComponent(), FAttachmentTransfromRules::KeepRelativeTransform );
GetCapsuleComponent() : 캡슐 컴포넌트 얻어오기
AttachToComponent() : 해당 컴포넌트에 붙이기 ( 부모 컴포넌트 선택 )
▶️FAttachmentTransformRules
: 다른 컴포넌트에 오브젝트를 부착할 방법을 지정
- KeepRelativeTransform: 자식의 상대적 트랜스폼을 유지
- KeepWorldTransform: 자식의 월드 트랜스폼을 유지
- SnapToTargetIncludingScale: 부모와 트랜스폼(위치, 회전, 스케일) 모두 동일하게 맞춤
- SnapToTargetNotIncludingScale: 부모의 위치, 회전은 맞춤. 스케일은 유지
▶️SetupAttachment: 컴포넌트-컴포넌트 관계
BeginPlay보다 먼저 호출
▶️SetupAttachment vs AttachToComponent
- 공통점 : 부모 컴포넌트의 자식 계층으로 설정하며, 소켓 이름을 지정한 경우계층뿐만 아닌 소켓 위치로 원점이 정해짐
- 차이점
1️⃣ SetupAttachment은 생성자에서 사용. AttachToComponent는 생성자에서 사용되지 않는다.
2️⃣ AttachToComponent는 부착 규칙이 존재
2) PlayerBase 상속받는 PlayerKnight 클래스 생성
(1) PlayerBase에서 EngineMinimal.h include 했으니까
PlayerKnight 헤더에선 제거
(2) cpp inlude 경로 수정 (폴더명 삭제)
(3) 생성자, BeginPlay(), Tick(), SetupPlayerInputComponent() 함수 오버라이드 해주고
구현부 만들고, 함수들 내부에서 부모함수 호출
(4) 생성자
APlayerBase::APlayerBase()
{
PrimaryActorTick.bCanEverTick = true;
mArm = CreateDefaultSubobject<USpringArmComponent>( L"Arm" );
mCamera = CreateDefaultSubobject<UCameraComponent>( L"Camera" );
mArm->AttachToComponent( GetCapsuleComponent(), FAttachmentTransformRules::KeepRelativeTransform );
mCamera->AttachToComponent( mArm, FAttachmentTransformRules::KeepRelativeTransform );
mArm->TargetArmLength = 500.f;
mArm->SetRelativeLocation( FVector( 0, 80, 0 ) );
mArm->SetRelativeRotation( FRotator( -30, 0, 0 ) );
}
(5) 방금 생성한 PlayerKnight 맵에 띄우기
월드세팅 - 게임모드 - 디폴트 폰 클래스 Player Knight로 변경해주기

=> 실행해보면 화면에 플레이어 캐릭터 정상적으로 출력된다.
▶️ 블루프린트에서는 z가 y고 y가 z인데 코드상에선 기존대로 사용하니까 주의
⭐ 헤더파일에서 해당 헤더파일 include문은 제일 아래 있어야함
ex) PlayerBase.h에서
#include “EngineMinimal.h”
#include “GameFramework/Charactor.h”
#include “PlayerBase.generated.h” // ←—---------- 이렇게 !
▶️GENERATED_BODY()
핵심 기능들을 활성화 하는데 필수적인 코드들을 자동으로 생성해줌.
리플렉션 시스템을 사용하는 클래스 또는 구조체의 헤더 파일에 반드시 포함되어야하는 매크로.
- 리플렉션 메타데이터 생성
- UObject 기반 기능 활성화 : ex) 가비지 컬렉션, 에디터통합, 블루프린트 연동, 네트워크 동기화 등을 사용할수 있또록 필요한 코드 생성
- 구조체 지원 : 구조체 쓸 수 있도록 세팅
▶️ 레퍼런스 복사하기
: 에셋 경로를 가져와준다.

▶️ConstructorHelpers
static ConstructorHelpers::FObjectFinder<USkeletalMesh> mesh( TEXT( "레퍼런스복사 경로 복붙” ) );
에셋 참조하기
2. 코드로 입력 처리
1) UObject 상속받고, input폴더에 DefaultInputSystem 클래스 생성
header
public :
UDefaultInputSystem();
public :
class UInputMappingContext* mContext;
class UInputAction* mMove;
cpp
#include "InputMappingContext.h"
#include "InputAction.h"
UDefaultInputSystem::UDefaultInputSystem()
{
static ConstructorHelpers::FObjectFinder<UInputMappingContext>
context( L"/Script/EnhancedInput.InputMappingContext'/Game/Blueprint/Input/IA_Context.IA_Context'" );
if( context.Succeeded() )
mContext = context.Object;
static ConstructorHelpers::FObjectFinder<UInputAction>
moveAction( L"/Script/EnhancedInput.InputAction'/Game/Blueprint/Input/IA_Move.IA_Move'" );
if ( moveAction.Succeeded() )
mMove = moveAction.Object;
}
2) PlayerBase에서 입력 처리
header에
class UDefaultInputSystem* mDefaultInput; // 입력 처리할 변수 추가
cpp
#include "EnhancedInputSubsystems.h"
#include "EnhancedInputComponent.h"
#include "../Input/DefaultInputSystem.h"
#include "InputActionValue.h"
void APlayerBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
UEnhancedInputComponent* inputCp = Cast<UEnhancedInputComponent>( PlayerInputComponent );
if ( !IsValid( inputCp ) )
return;
mDefaultInput = NewObject<UDefaultInputSystem>( this );
}
3) APlayerBase에서 input 들어오면 호출되는 함수 만들고 연결
(1) APlayerBase header
protected:
void MoveAction( const struct FInputActionValue& value ); // 선언 및 구현
(2) 컨트롤러와 매핑 컨텍스트 연결
APlayerBase::BeginPlay()
{
Super::BeginPlay();
APlayerController* controller = Cast<APlayerController>( GetController() );
if ( !IsValid( controller ) )
return;
UEnhancedInputLocalPlayerSubsystem* subSystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>( controller->GetLocalPlayer() );
subSystem->AddMappingContext( mDefaultInput->mContext, 0 );
}
(3) APlayerBase.SetupPlayerInputComponent() 맨아래줄
{ ..
// 함수바인드 : 입력 들어오면 어떤 함수 호출될건지 설정
inputCp->BindAction( mDefaultInput->mMove, ETriggerEvent::Triggered, this, &APlayerBase::MoveAction );
}
(4) MoveAction() 구현. 움직임 구현
FVector2D axis = value.Get<FVector2D>();
AddMovementInput( GetActorForwardVector(), axis.X );
AddMovementInput( GetActorRightVector(), axis.Y );
(5) 이상태에서 실행하면 이동 잘됨
'Unreal Engine5 > KDT 2024' 카테고리의 다른 글
[UE5 KDT2024] 6. TMap, TSet, TQueue (0) | 2025.02.18 |
---|---|
[UE5 KDT2024] 5. 입력 키 변경하기 EnhanceInput_KeyChange (0) | 2025.02.17 |
[UE5 KDT2024] 3. EnhancedInput 입력 테스트 (0) | 2025.02.15 |
[UE5 KDT2024] 2. 블루프린트 액터 생성 해보자. (0) | 2025.02.14 |
[UE5 KDT2024] 1. 개발환경 세팅 (0) | 2025.02.13 |
댓글