본문 바로가기

카테고리 없음

[언리얼] 2번째. 인풋 - UE5 Enhanced Input

오늘 한 일 : 캐릭터가 움직였다~

 

 

 

히히 엉망~

1. 캐릭터가 왜 빙글 도는지 알아봐야하고

2. 무브먼트컴포넌트 연결시켜줘야하고

3. 애니메이션도 넣어줘야한다

 

 

https://docs.unrealengine.com/5.1/ko/enhanced-input-in-unreal-engine/

 

향상된 입력

향상된 입력 플러그인을 간략하게 살펴봅니다.

docs.unrealengine.com

오늘은 UE5에 추가된 기능인 Enhanced Input을 통해서 캐릭터를 움직이는 부분을 구현할 것이다.

 

좌우 인풋과 줌만 있으면 될 것이다.

 

Lyra 인풋 진짜 잘되어있다.. ULyraHeroComponent  통해서 ULyraInputComponent

void ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)

 

 

 

1.Input Mapping Context 만든다

 

 

2. 향상된인풋을 사용하도록 셋팅해준다.

- 모듈 종속성 Build.cs 의  PublicDependencyModuleNames에 EnhancedInput추가

* 경고 제대로 안뱉고 계속 뭐가 없다고만 뜨면 모듈 종속성부터 의심하기.. ㅠㅠ 오늘도 삼십분 날림 

 

PlayerController의  입력클래스 오버라이드 설정해주기

혹은

 

만든 맵핑 콘테스트와 액션 등록

UENUM(BlueprintType)
enum class EInputType :uint8
{
	None,
	MoveRight,
	Zoom,
	Max
};

USTRUCT(BlueprintType)
struct FActionInfo
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	UInputAction* InputAction;
	
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	EInputType InputType;
};

UCLASS()
class CROPOUTSAMPLEPROJECT_API AMLPlayerController : public APlayerController
{
	GENERATED_BODY()
	
    UPROPERTY(EditAnywhere, Category = Input)
	UInputMappingContext* InputMapping;

	UPROPERTY(EditAnywhere, Category = Input)
	TArray<FActionInfo> ActionInfos;
};
void AMLPlayerController::BeginPlay()
{
	Super::BeginPlay();

	if (const ULocalPlayer* LP = GetLocalPlayer())
	{
		if (UEnhancedInputLocalPlayerSubsystem* Subsystem = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
		{
			Subsystem->AddMappingContext(InputMapping, 0);
		}
	}
}

void AMLPlayerController::SetupInputComponent()
{
	Super::SetupInputComponent();


	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
	{
		for (const FActionInfo& Info : ActionInfos)
		{
			switch (Info.InputType)
			{

			case EInputType::MoveRight:
			{
				EnhancedInputComponent->BindAction(Info.InputAction, ETriggerEvent::Triggered, this, &AMLPlayerController::MoveRight);
			}
			break;
			
			case EInputType::Zoom:
			{
				EnhancedInputComponent->BindAction(Info.InputAction, ETriggerEvent::Triggered, this, &AMLPlayerController::Zoom);
			}
			break;
			case EInputType::Max:
				break;
			default:
				break;
			}
		}
	}
}



void AMLPlayerController::MoveRight(const FInputActionInstance& Instance)
{
	float Value = Instance.GetValue().Get<float>();
	if (Value == 0.0f)
	{
		return;
	}

	APawn* CurrentPawn = GetPawn();
	if (CurrentPawn == nullptr || CurrentPawn->IsValidLowLevel() == false)
	{
		return;
	}
	// find out which way is right
	const FRotator Rotation = GetControlRotation();
	const FRotator YawRotation(0, Rotation.Yaw, 0);

	// get right vector 
	const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
	// add movement in that direction
	CurrentPawn->AddMovementInput(Direction, Value);
}


void AMLPlayerController::Zoom(const FInputActionInstance& Instance)
{
	float Value = Instance.GetValue().Get<float>();
	if (Value == 0.0f)
	{
		return;
	}

}

오 너무 거지같은데. 

내일은 입력을 관리해주는 컨포넌트를 따로 만들어서, 해당 컨포넌트 통해 입력을 등록/관리하도록 빼주어야겠다.