오늘 한 일 : 캐릭터가 움직였다~
히히 엉망~
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;
}
}
오 너무 거지같은데.
내일은 입력을 관리해주는 컨포넌트를 따로 만들어서, 해당 컨포넌트 통해 입력을 등록/관리하도록 빼주어야겠다.