프로젝트PF (1) - 230623

지용현·2023년 6월 23일

프로젝트PF

목록 보기
3/30

1. ICharacter 인터페이스 생성

#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에 빙의해서 직접 컨트롤 할 수 있는 방향으로도 개발해볼까 생각하고 이 인터페이스를 설계할 생각을 일단 가지고 있다.

2. CPlayableCharacterBase 생성(ACharacter, IICharacter)

기본적으로 프로젝트를 만들면 생성되는 ThirdPersonCharacter(C++)의 코드를 많이 복붙해와서 만든 플레이 가능한 캐릭터의 베이스가 되는 클래스이다.
ICharacter 인터페이스를 상속받아 ThirdPersonCharacter의 Move, Look, Jump 함수들을 인터페이스의 Move, Look, Jump 로 바꾸어 override 하여 구현하였다.
모든 플레이어블 캐릭터가 가져야 할 공통 기능은 이 Base 클래스에 구현 할 계획이다.

3. CDA_CharacterBase 생성 (DataAsset)

애당초 설계 목표를 블루프린트에서 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;
};

4. InputMappingKey 변경 구현

보통 게임들은 환경 설정에서 키 입력을 원하는 키로 변경할 수 있다. 나중에 환경 설정에서 이 기능을 구현할 예정이기에 Input을 만져보면서 구현해보게 되었다.
처음 생각한 방법은 바꿀 키를 미리 InputAction으로 구현해둔 뒤 EnhancedInputComponent->BindAction을 다시 해주는것이였으나 SetupPlayerInputComponent 함수를 다시 콜하는게 이상한 것 같아서 이 방법은 아니라고 생각했다.
생각해보니 InputAction은 InputMappingContext에 등록되고, InputMappingContext에서 Key가 정해지므로 InputMappingContext에서 변경하는 무언가가 있겠다 생각해서 InputMappingContext의 함수들을 본 결과 맞는 생각이였다.
그래서 임시로 테스트겸 원래 점프가 SpaceBar에 할당되어 있는데 이것을 J나 마우스 우클릭으로 바꿔보았는데 성공적이였다.
이 Key변경은 따로 글로 작성해두었다.

profile
게임 개발자 지망생

0개의 댓글