1 분 소요

1. 에디터 Play 에서 수치확인

DisplayAll PlayerController ControlRotation

Image Image

       

2. Move, Look 함수 분석

//Contorller의 회전값을 Update
AddControllerYawInput(LookAxisVector.X);
AddControllerPitchInput(LookAxisVector.Y);
//특정 방향으로 이동시키는 함수
AddMovementInput(ForwardDirection, MovementVector.X);
AddMovementInput(RightDirection, MovementVector.Y);

       

3. Controller 옵션

사전준비

만들어놓은 CharacterPlayer를 상속시킨 Blueprint에서 옵션을 볼 수 있다

3-1. controller의 회전값과 Pawn의 회전값을 동기화

Image

   

3-2. controller의 회전값과 spring Arm의 회전값을 동기화

Image

Use Pawn Control Rotation : controller와 회전값 동기화 Inherit ~ : 부모로부터 받은 회전값을 적용

   

Image

카메라의 충돌이 발생했을 때 카메라를 당겨주는 옵션

   

Image

Use Pawn Control Rotation -> controller의 회전값을 사용할 것인지?

       

4. Data Asset

Controller나 Movement에 쓰일 여러 데이터 수치들을 모아놓을 수 있다

4-1. PrimaryDataAsset 상속 받아 Class 생성

Image

   

4-2. 원하는 데이터를 삽입

//ABCharacterControlData.h
UCLASS()
class ARENABATTLE_API UABCharacterControlData : public UPrimaryDataAsset
{
	...
	UPROPERTY(EditAnywhere, Category = CharacterMovement)
	uint32 bUseControllerDesiredRotation : 1;
	
	UPROPERTY(EditAnywhere, Category = CharacterMovement)
	FRotator RotationRate;
	
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input)
	TObjectPtr<class UInputMappingContext> InputMappingContext;
	...
};

에디터에서 설정할 데이터들을 Header에 정의

   

4-3. 만든 Class 상속시켜 Data Asset 생성

Miscellaneous > Data Asset
Image

   

4-4. 원하는 데이터 셋팅

Image

   

4-5. C++ 셋팅

//헤더파일
//Enum셋팅 뒤 Map 으로 저장
UPROPERTY(EditAnywhere, Category = CharacterControl, Meta = (AllowPrivateAccess = "true"))
TMap<ECharacterControlType, class UABCharacterControlData*> CharacterControlManager;

//CDO
static ConstructorHelpers::FObjectFinder<UABCharacterControlData> ShoulderDataRef(TEXT("/Script/ArenaBattle.ABCharacterControlData'/Game/ArenaBattle/CharacterControl/ABC_Shoulder.ABC_Shoulder'"));
if (ShoulderDataRef.Object)
{
	CharacterControlManager.Add(ECharacterControlType::Shoulder, ShoulderDataRef.Object);
}

static ConstructorHelpers::FObjectFinder<UABCharacterControlData> QuaterDataRef(TEXT("/Script/ArenaBattle.ABCharacterControlData'/Game/ArenaBattle/CharacterControl/ABC_Quater.ABC_Quater'"));
if (QuaterDataRef.Object)
{
	CharacterControlManager.Add(ECharacterControlType::Quater, QuaterDataRef.Object);
}

   

4-6. 사용

SetCharacterControl(ECharacterControlType::Shoulder);
void AABCharacterPlayer::SetCharacterControl(ECharacterControlType NewCharacterControlType)
{
	UABCharacterControlData* NewCharacterControl = CharacterControlManager[NewCharacterControlType];
	check(NewCharacterControl);

	SetCharacterControlData(NewCharacterControl);

	APlayerController* PlayerController = CastChecked<APlayerController>(GetController());

	//Input Mapping Context 변경
	if (UEnhancedInputLocalPlayerSubsystem* Subsystem = 
		ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
	{
		//기존에 존재하던 Mapping Clear
		Subsystem->ClearAllMappings();
		UInputMappingContext* NewMappingContext = NewCharacterControl->InputMappingContext;
		if (NewMappingContext)
		{
			Subsystem->AddMappingContext(NewMappingContext, 0);
		}
	}

	CurrentCharacterControlType = NewCharacterControlType;
}
void AABCharacterPlayer::SetCharacterControlData(const UABCharacterControlData* CharacterControlData)
{
	// Pawn
	bUseControllerRotationYaw = CharacterControlData->bUseControllerRotationYaw;
	// CharacterMovement
	GetCharacterMovement()->bOrientRotationToMovement = CharacterControlData->bOrientRotationToMovement;
	...
	//Camera
	CameraBoom->TargetArmLength = CharacterControlData->TargetArmLength;
	CameraBoom->SetRelativeRotation(CharacterControlData->RelativeRotation);
	...
}

   

4-7. 정리

Image

댓글남기기