Unreal GAS (1) - EnhancedInput, 애니메이션 블루프린트 템플릿

wnsduf0000·2025년 12월 1일

Unreal_GAS

목록 보기
1/34
  • TObjectPtr<>

    • Raw 포인터, 즉 USkeletalMeshComponent* 와 같이 기존 포인터 연산자를 이용하여 선언하던 포인터와 작동은 동일함.
    • 다만, 엑세스 추적이나 선택적 지연 로드 등에 더 용이한 측면이 있어, 언리얼 코드 표준은 점차 TObjectPtr로 옮겨가는 추세임.
  • Animation Blueprint Template

    • 애니메이션 블루프린트의 경우 스켈레탈 메시 별로 따로 생성하느라 상속 구조가 불가능한 줄 알았음.

    • 하지만 애니메이션 블루프린트 템플릿을 이용하면 기존 클래스의 추상화와 마찬가지로 상속 구조를 만들 수 있음.

      < 애니메이션 블루프린트 템플릿>

    • 애니메이션 블루프린트를 생성할 때, 특정 스켈레톤 대신 '템플릿'을 눌러 애니메이션 블루프린트 템플릿을 생성할 수 있음.

    • 템플릿은 특정 스켈레탈 메시를 지정하지 않지만, 여전히 애님 그래프 등을 기존과 같이 작성할 수 있음.

    • 애니메이션 블루프린트를 생성할 때, 특정 스켈레톤을 선택하고 부모 클래스로 생성한 템플릿을 선택하면 됨.

    • 상속받은 애니메이션 블루프린트의 에셋 오버라이드 패널에서 각기 다른 애니메이션 에셋을 지정해 줄 수 있음.

  • Enhanced Input System

    • 입력 매핑 컨텍스트와 입력 액션 에셋을 생성하여 간편하게 설정할 수 있는 입력 시스템

    • 입력 액션을 생성하고 입력받을 값의 타입을 설정하며, 이를 입력 매핑 컨텍스트에서 조합하여 사용하는 형태임.

    • 프로젝트의 Build.cs 파일의 PublicDependency에 EnhancedInput을 추가해주어야 함. (추가 후 솔루션 파일 재생성 필요)

      UEnhancedInputLocalPlayerSubsystem* Subsystem;
      Subsystem->AddMappingContext(InputMappingContext, 0);
    • PlayerController 클래스에서 오버라이드 하는 SetupInputComponent에 아래와 같이 코드를 작성하여
      플레이어 컨트롤러 클래스의 InputComponent 변수에 담긴 EnhancedInputComponent에 접근해야 함.
      (EnhancedInputComponent에 BindAction으로 입력 액션에 함수를 바인딩해야 하기 때문)

      UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);
    • InputComponent가 UEnhancedInputComponent로 형변환 되는 이유는
      프로젝트 세팅 - 엔진 - 입력의 기본 입력 컴포넌트 클래스가 EnhancedInputComponent로 설정되어 있기 때문.
      - EnhancedInputComponent의 BindAction을 호출하여 입력 액션과 입력 처리를 위해 생성한 함수를 바인딩 할 수 있음.

      ```c++
      EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
      ```
      • MoveAction은 입력 액션, ETriggerEvent는 바인딩 함수의 호출 시점, this는 바인딩 함수가 속한 오브젝트임.
      • 바인딩 함수는 FInputActionValue를 매개변수로 받는 형태로 작성되어야 하므로 const FInputActionValue& 변수를 받도록 함.
        (입력 매핑 컨텍스트에 설정한 바에 따라 입력 액션이 생성한 데이터를 받아서 이용해야 하기 때문)
      • 바인딩 함수는 FInputActionValue를 설정한 입력 액션 데이터 타입에 따라 캐스팅하여 사용함.
      • const FVector2D InputAxisVector = InputActionValue.Get();
    • Aura 프로젝트에서 캐릭터의 이동은 평면(XY) 이동을 하되, 카메라가 바라보고 있는 방향을 정면으로 하도록 하려 함.

      • 플레이어 컨트롤러는 기본적으로 카메라가 플레이어를 보고 있는 방향에 대한 정보를 갖고 있음.
      • 플레이어 컨트롤러의 방향 정보는 GetControlRotation()을 통해 접근 가능함.
      • 이 방향(회전) 정보에서 Pitch와 Roll을 제외하면, 바닥면과 평행한 회전 정보를 얻을 수 있음.
    • 위의 내용을 바탕으로 FRotationMatrix의 GetUnitAxis를 통해 방향 벡터로 변환할 수 있음.

      const FRotator Rotation = GetControlRotation();
      const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);
      
      const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
      const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
      
      if (APawn* ControlledPawn = GetPawn<APawn>())
      {
      ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
      ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
      }
  • SetInputMode

    • 플레이어 컨트롤러 블루프린트에서 호출하는 SetInputModeGameAndUI와 같은 기능을 한다고 보면 됨.
    • LineTrace를 C++에서 호출할 때, 블루프린트에서와는 다르게 구조체를 생성하여 넘겨주는 것과 비슷한 방식으로 매개변수를 넘겨주고 있었음.
    • FInputModeDataBase를 상속하는 FInputModeGameAndUI, FInputModeGameOnly, FInputModeUIOnly 중 하나를 생성하고
      구조체에서 SetLockMouseToViewportBehaviour 등의 멤버 함수를 통해 세팅 후 해당 구조체를 SetInputMode로 넘겨주면 됨.
  • check(value)

    • 일종의 nullptr 체크임.
    • 매개변수 value가 nullptr이라면 실행이 중지됨 (크래시가 발생함).
    • check를 통과한다면 매개변수 value가 nullptr이 아니라는 것을 보장받을 수 있음.
      nullptr라면 게임 진행이 불가능한 수준의 심각한 문제라면 차라리 크래시를 발생시키는 것이 나을 수 있기 때문에, 이런 상황에서는 고려할만한 선택지 같음.
      예를 들어, 플레이어가 게임에 어떤 입력도 할 수 없게 된다거나…
    • check(Subsystem);
      • Subsystem이 nullptr라면 크래시가 발생할 것임.
  • 마우스 커서를 언리얼 에디터 탭에 놓고 가운데 버튼 (휠 버튼) 을 클릭하면 쉽게 닫을 수 있음.

profile
저는 게임 개발자로 일하고 싶어요

0개의 댓글