【UE4】컨트롤러 입력에 대한 셋업을 C++로 실시한다

먼저



이 기사는 조작 입력을 C++측에서 매핑에 추가하거나 처리를 등록해 실제로 거동을 등록하는 곳까지 기사로 한 것이 됩니다. 실수나 더 좋은 방법이 있었을 경우에는 살짝 Twitter( @ 로사무 )나 코멘트, 수정 리퀘스트등으로 알려 받을 수 있으면 매우 고맙습니다.

작업환경



기사 내에서 사용하는 작업 환경은 다음과 같습니다.
  • 언리얼 엔진: 4.23.1
  • Visual Studio: Community 2017 or Community 2017 for Mac or Enterprise 2019

  • 구현 방법



    ①Editor 측에서 Input 키 등을 Mapping하여 C++ 측에서 액션을 등록한다



    먼저 왼쪽 상단 메뉴에서 Edit > Project Settings...를 선택하여 Input를 엽니다. 이번에는 Actiono Mappings에서 Jump를 만들고 Space Bar를 할당합니다.


    할당하면 다음은 C++측에서의 기술을 실시합니다. 전제로 플레이어 캐릭터의 클래스는 C++, 부모 클래스는 ACharacter로 합니다.
    // CPP_PlayerCharacter.h
    
    // Fill out your copyright notice in the Description page of Project Settings.
    
    #pragma once
    
    #include "Characters/Base/CPP_CharacterBase.h"
    #include "CPP_PlayerCharacter.generated.h"
    
    UCLASS()
    class ACPP_PlayerCharacter : public ACPP_CharacterBase
    {
        GENERATED_BODY()
    
    private:
    
        // 2段ジャンプ用
        static const int32 MaxJumpCount = 2;
    
        // Inputに処理を割り当てるためのセットアップメソッド
        virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
    
        // ジャンプ時に、着地した時呼び出すメソッド
        virtual void Landed(const FHitResult& Hit) override;
    
        void Jump();
    
        int32 JumpCount = 0;
    
    };
    
    // CPP_PlayerCharacter.cpp
    
    #include "CPP_PlayerCharacter.h"
    
    #include "Components/InputComponent.h"
    #include "GameFramework/CharacterMovementComponent.h"
    
    void ACPP_PlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
        check(PlayerInputComponent);
    
        // Editor側で設定しているキー`SpaceBar`押下時にJump()を呼び出すように設定
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACPP_PlayerCharacter::Jump);
    
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACPP_PlayerCharacter::StopJumping);
    }
    
    void ACPP_PlayerCharacter::Landed(const FHitResult& Hit)
    {
        Super::Landed(Hit);
        JumpCount = 0;
    }
    
    void ACPP_PlayerCharacter::Jump()
    {
        if (GetCharacterMovement()->IsFalling() && JumpCount < MaxJumpCount)
        {
            //To adjust the height of the second jump.
            const FVector JumpVelocity{ 0.0f, 0.0f, 800.0f };
            LaunchCharacter(JumpVelocity, false, false);
    
            JumpCount++;
        }
        else
        {
            Super::Jump();
            JumpCount++;
        }
    }
    

    이제 Space Bar를 누르면 Jump()를 호출합니다. 또한 지상에 도착하면 Landed()가 호출되고 JumpCount가 재설정됩니다. 또, 점프의 커스터마이즈로서 2단 점프를 할 수 있도록 하고 있습니다.

    ②C++측에서 Input 키 등을 Mapping하여 액션을 등록한다



    여기는 Mapping도 포함하여 C++로 끝내는 방법입니다. .h는 변하지 않기 때문에 cpp측에서 변경할 필요가 있다 SetupPlayerInputComponent() 만 싣습니다.
    void ACPP_PlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
        check(PlayerInputComponent);
    
        // ZキーをJumpという名前のアクションで登録するための情報群(今回は他に押下するキーなしなので0)
        // ("アクションの名前", Keyの種類, Shiftを押下するか, Ctrlを押下するか, Altを押下するか, Cmdを押下するか)
        FInputActionKeyMapping jump("Jump", EKeys::Z, 0, 0, 0, 0);
    
        // 実際に登録を行う
        GetWorld()->GetFirstPlayerController()->PlayerInput->AddActionMapping(jump);
    
        // これでZキー、スペースキーどちらでも反応するようになる
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACPP_PlayerCharacter::Jump);
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACPP_PlayerCharacter::StopJumping);
    }
    

    좋은 웹페이지 즐겨찾기