#pragma once #include "CoreMinimal.h" #include "UObject/Interface.h" #include "InputActionValue.h" #include "ICharacter.generated.h" UINTERFACE(MinimalAPI) class UICharacter : public UInterface { GENERATED_BODY() }; class PROJECTPF_API IICharacter { GENERATED_BODY() public: virtual void Move(const FInputActionValue& Value) = 0; virtual void Look(const FInputActionValue& Value) = 0; virtual void Jump() = 0; virtual void StopJumping() = 0; };내가 만들 Character에 쓰일 ICharacter 인터페이스를 생성하였다.
FInputActionValue 변수를 사용하기 위해 InputActionValue.h 헤더를 추가하였다.처음 구상한 것은 지금 만들어둔 Movement용 함수들을 함수오버로딩을 이용해서 Ai용 함수도 만들어서 내가 플레이 하고있는 캐릭터가 Ai로 전환 할 수도 있고, Ai로 컨트롤 되고 있는 Enemy에 빙의해서 직접 컨트롤 할 수 있는 방향으로도 개발해볼까 생각하고 이 인터페이스를 설계할 생각을 일단 가지고 있다.
기본적으로 프로젝트를 만들면 생성되는 ThirdPersonCharacter(C++)의 코드를 많이 복붙해와서 만든 플레이 가능한 캐릭터의 베이스가 되는 클래스이다.
ICharacter 인터페이스를 상속받아 ThirdPersonCharacter의 Move, Look, Jump 함수들을 인터페이스의 Move, Look, Jump 로 바꾸어 override 하여 구현하였다.
모든 플레이어블 캐릭터가 가져야 할 공통 기능은 이 Base 클래스에 구현 할 계획이다.
애당초 설계 목표를 블루프린트에서 Mesh나 AnimInstance등을 데이터 에셋에서 설정 해두면 자동으로 설정되게 하도록 생각하고 있기 때문에 이 DataAsset을 생성하였다.
현재는 SpringArm, Camera, Mesh의 Transform과 Skeletal Mesh, AnimInstanceClass를 변수로 가지고 있다.
CPlayableCharacterBase에 이 DataAsset 클래스의 변수가 들어가있고 현재 블루프린트로 생성한 Base에 이 DataAsset을 기반으로 생성한 블루프린트DataAsset을 넣어주었고, 캐릭터에서 유효성 검사 한 뒤 BeginPlay에서 Transform과 Mesh, AnimInstance를 적용시켜주고 있다.
InputAction과 InputMappingContext도 추가하려 했으나 SetupPlayerInputComponent에서 바인딩이 되고, 이 함수보다 BeginPlay가 늦게 실행 되는 것 같아서 적용이 안되기에 추가하진 않았다.// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "CDA_CharacterBase.generated.h" UCLASS() class PROJECTPF_API UCDA_CharacterBase : public UDataAsset { GENERATED_BODY() public: //CameraBoom UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Transform") FTransform CameraBoom; //FollowCamera UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Transform") FTransform FollowCamera; //CameraBoom UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Transform") FTransform Mesh; //TSubclassOf<USkeletalMesh> 로 하려했는데 원하는데로 나오지 않는다. 이유가 뭘까? UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SkeletalMesh") class USkeletalMesh* SkeletalMesh; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AnimInstance") TSubclassOf<UAnimInstance> AnimInstanceClass; };
보통 게임들은 환경 설정에서 키 입력을 원하는 키로 변경할 수 있다. 나중에 환경 설정에서 이 기능을 구현할 예정이기에 Input을 만져보면서 구현해보게 되었다.
처음 생각한 방법은 바꿀 키를 미리 InputAction으로 구현해둔 뒤 EnhancedInputComponent->BindAction을 다시 해주는것이였으나 SetupPlayerInputComponent 함수를 다시 콜하는게 이상한 것 같아서 이 방법은 아니라고 생각했다.
생각해보니 InputAction은 InputMappingContext에 등록되고, InputMappingContext에서 Key가 정해지므로 InputMappingContext에서 변경하는 무언가가 있겠다 생각해서 InputMappingContext의 함수들을 본 결과 맞는 생각이였다.
그래서 임시로 테스트겸 원래 점프가 SpaceBar에 할당되어 있는데 이것을 J나 마우스 우클릭으로 바꿔보았는데 성공적이였다.
이 Key변경은 따로 글로 작성해두었다.