You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이러한 입력 처리를 어디서 구현할지 정리하시오. ( PlayerController, Character )
액터와 컴포넌트
월드에 속한 콘텐츠의 기본 단위를 액터라고 한다. 액터는 트랜스폼을 가지며, 월드로부터 틱과 시간 서비스를 제공받는다. 이는 논리적개념일 뿐 컴포넌트를 감싸는 포장 박스에 불과하다. 실질적인 구현은 컴포넌트를 통해서 진행하고 대부분 다수의 컴포넌트를 가지고 있다. 다수의 컴포넌트를 대표하는 컴포넌트를 루트 컴포넌트라고 한다. 액터는 루트 컴포넌트를 기준으로 트랜스폼을 가지며 트랜스폼은 액터의 트랜스폼을 의미한다.
계층 구조를 가지기에 아래로 추가된 컴포넌트는 상위 컴포넌트의 자식이 된다. (상대적 트랜스폼)
C++액터에서 컴포넌트 제작
컴포넌트는 언리얼 오브젝트이므로 UPROPERTY 매크로를 설정해주고 TObjectPtr라고하는 탬플릿 클래스를 사용해 선언해야 한다.
언리얼 5부터 적용된 기능으로 헤더에 언리얼 오브젝트를 선언할 때 일반 포인터에서 TObjectPtr로 변경되었다.
컴포넌트 등록
CDO에서 생성한 컴포넌트는 자동으로 월드에 등록된다.
하지만 NewObject로 생성한 컴포넌트는 수동으로 월드에 등록해야 한다. (RegisterComponent를 이용)
등록된 컴포넌트는 월드의 기능을 사용할 수 있으며, 물리와 렌더링 처리에 합류한다.
컴포넌트의 확장 설계
에디어 편집 및 블루프린트로의 승계를 위한 설정
UPROPERTY에 지정자 (Specifier)를 설정할 수 있다.
컴포넌트 지정자
Visible: 에디터에서 보이게 함(객체 타입)
Edit: 에디터에서 보이게 함 (값 타입)
AnyWhere, DefaultsOnly, InstanceOnly: 에디터에서 편집 가능 영역 (보통 AnyWhere를 사용)
BlueprintReadOnly, BlueprintReadWrite: 블루프린트에서 접근 가능 영역 (읽기 전용, 읽기 쓰기)
Category: 에디터에서 보여지는 카테고리 이름
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include"CoreMinimal.h"
#include"GameFramework/Actor.h"
#include"AB_Fountain.generated.h"UCLASS()
class ARENABATTLE_API AAB_Fountain : public AActor
{
GENERATED_BODY()
public:// Sets default values for this actor's propertiesAAB_Fountain();
protected:// Called when the game starts or when spawnedvirtualvoidBeginPlay() override;
public:// Called every framevirtualvoidTick(float DeltaTime) override;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Mesh)
TObjectPtr<classUStaticMeshComponent> Body;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Mesh)
TObjectPtr<classUStaticMeshComponent> Water;
};
아래 Body와 Water는 객체타입을 에디터에서 보이게하고, 편집 가능영역을 말해준다. 또한, 블루프린트에서 읽기 쓰기가 가능하다. 카테고리는 Mesh로 설정되어 있다.
TObjectPtr라는 탬플릿 클래스를 사용
// Fill out your copyright notice in the Description page of Project Settings.
#include"Prop/AB_Fountain.h"
#include"Components//StaticMeshComponent.h"// Sets default valuesAAB_Fountain::AAB_Fountain()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Body = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Body"));
Water = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Water"));
RootComponent = Body;
Water->SetupAttachment(Body);
Water->SetRelativeLocation(FVector(0.0f, 0.0f, 132.0f));
static ConstructorHelpers::FObjectFinder<UStaticMesh> BodyMeshRef(TEXT("/Script/Engine.StaticMesh'/Game/ArenaBattle/Environment/Props/SM_Plains_Castle_Fountain_01.SM_Plains_Castle_Fountain_01'"));
if (BodyMeshRef.Object)
{
Body->SetStaticMesh(BodyMeshRef.Object);
}
static ConstructorHelpers::FObjectFinder<UStaticMesh> WaterMeshRef(TEXT("/Script/Engine.StaticMesh'/Game/ArenaBattle/Environment/Props/SM_Plains_Fountain_02.SM_Plains_Fountain_02'"));
if (WaterMeshRef.Object)
{
Water->SetStaticMesh(WaterMeshRef.Object);
}
}
// Called when the game starts or when spawnedvoidAAB_Fountain::BeginPlay()
{
Super::BeginPlay();
}
// Called every framevoidAAB_Fountain::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
CreateDefaultSubobject를 통해 컴포넌트를 생성하고 초기화한다. (탬플릿 함수로 예제에서는 UStaticMeshComponent를 생성하고 있다.)
RootComponent는 루트 컴포넌트를 설정하고 그 하위인 Water은 SetupAttachment를 통해 Body에 붙여준다. SetRelativeLocation를 통해 상대적인 위치를 설정해준다.
ConstructorHelpers를 통해 에디터에서 사용할 메쉬를 찾아서 설정해준다.
ConstructorHelpers는 FObjectFinder를 통해 찾아서 설정해주는데, UStaticMesh를 찾아서 설정해주고 있다. (Resource Load의 기능)
코드에 참조 주소값이 리터럴 값으로 들어가 있어서 위험해 보인다.
캐릭터의 제작
폰의 기능과 설계
폰이란, 액터를 상속받은 특별한 클래스이며, 플레이어가 빙의해 입출력을 처리하도록 설계되어 있다. 기능으론 길찾기를 사용할 수 있으며, 일반적으로 세 가지 주요 컴포넌트로 구성된다.
기믹과 상호작용을 담당하는 충돌 컴포넌트 컴포넌트(루트컴포넌트)
시각적인 비주얼을 담당하는 메시 컴포넌트
움직일을 담당하는 컴포넌트
컴포넌트 중에서 트랜스폼이 없이 기능만 제공하는 컴포넌트를 액터컴포넌트라고 한다.
캐릭터의 기본 구조
캐릭터는 인간형 폰을 구성하도록 언리얼이 제공하는 전문 폰 클래스를 의미한다. 캐릭터는 세 가지 주요 컴포넌트로 구성되어 있다.
기믹과 상호작용을 담당하는 캡슐 컴포넌트 (루트 컴포넌트)
애니메이션 캐릭터를 표현하는 스켈레탈 메시 컴포넌트
캐릭터의 움직임을 담당하는 캐릭터 무브먼트 컴포넌트
private:/** The main skeletal mesh associated with this Character (optional sub-object). */UPROPERTY(Category=Character, VisibleAnywhere, BlueprintReadOnly, meta=(AllowPrivateAccess = "true"))
TObjectPtr<USkeletalMeshComponent> Mesh;
실제로 Character 클래스에서 위에서 C++로 커스텀한 컴포넌트와 같은 형태로 선언되어 있다.
C++ 캐릭터 생성 실습
UCLASS()
class ARENABATTLE_API AABCharacterBase : public ACharacter
{
GENERATED_BODY()
public:// Sets default values for this character's propertiesAABCharacterBase();
};
생성자를 통해서만 초기화하기 위해 기본적인 코드는 삭제하고 진행한다. ACharacter를 상속받았기에 해당 클래스에 접근하여 데이터를 세팅한다.
2강: 캐릭터와 입력 시스템
액터와 컴포넌트
월드에 속한 콘텐츠의 기본 단위를 액터라고 한다. 액터는 트랜스폼을 가지며, 월드로부터 틱과 시간 서비스를 제공받는다. 이는 논리적개념일 뿐 컴포넌트를 감싸는 포장 박스에 불과하다. 실질적인 구현은 컴포넌트를 통해서 진행하고 대부분 다수의 컴포넌트를 가지고 있다. 다수의 컴포넌트를 대표하는 컴포넌트를 루트 컴포넌트라고 한다. 액터는 루트 컴포넌트를 기준으로 트랜스폼을 가지며 트랜스폼은 액터의 트랜스폼을 의미한다.
블루프린터로 액터 제작
Add
버튼을 눌러서 블루프린트 액터 클래스를 선택C++액터에서 컴포넌트 제작
UPROPERTY
매크로를 설정해주고TObjectPtr
라고하는 탬플릿 클래스를 사용해 선언해야 한다.TObjectPtr
로 변경되었다.UPROPERTY
에 지정자 (Specifier)를 설정할 수 있다.Visible
: 에디터에서 보이게 함(객체 타입)Edit
: 에디터에서 보이게 함 (값 타입)AnyWhere
,DefaultsOnly
,InstanceOnly
: 에디터에서 편집 가능 영역 (보통AnyWhere
를 사용)BlueprintReadOnly
,BlueprintReadWrite
: 블루프린트에서 접근 가능 영역 (읽기 전용, 읽기 쓰기)Category
: 에디터에서 보여지는 카테고리 이름아래
Body
와Water
는 객체타입을 에디터에서 보이게하고, 편집 가능영역을 말해준다. 또한, 블루프린트에서 읽기 쓰기가 가능하다. 카테고리는Mesh
로 설정되어 있다.TObjectPtr
라는 탬플릿 클래스를 사용CreateDefaultSubobject
를 통해 컴포넌트를 생성하고 초기화한다. (탬플릿 함수로 예제에서는UStaticMeshComponent
를 생성하고 있다.)RootComponent
는 루트 컴포넌트를 설정하고 그 하위인Water
은SetupAttachment
를 통해Body
에 붙여준다.SetRelativeLocation
를 통해 상대적인 위치를 설정해준다.ConstructorHelpers
를 통해 에디터에서 사용할 메쉬를 찾아서 설정해준다.ConstructorHelpers
는FObjectFinder
를 통해 찾아서 설정해주는데,UStaticMesh
를 찾아서 설정해주고 있다. (Resource Load의 기능)코드에 참조 주소값이 리터럴 값으로 들어가 있어서 위험해 보인다.
캐릭터의 제작
폰의 기능과 설계
폰이란, 액터를 상속받은 특별한 클래스이며, 플레이어가 빙의해 입출력을 처리하도록 설계되어 있다. 기능으론 길찾기를 사용할 수 있으며, 일반적으로 세 가지 주요 컴포넌트로 구성된다.
컴포넌트 중에서 트랜스폼이 없이 기능만 제공하는 컴포넌트를 액터컴포넌트라고 한다.
캐릭터의 기본 구조
캐릭터는 인간형 폰을 구성하도록 언리얼이 제공하는 전문 폰 클래스를 의미한다. 캐릭터는 세 가지 주요 컴포넌트로 구성되어 있다.
실제로
Character
클래스에서 위에서 C++로 커스텀한 컴포넌트와 같은 형태로 선언되어 있다.C++ 캐릭터 생성 실습
생성자를 통해서만 초기화하기 위해 기본적인 코드는 삭제하고 진행한다.
ACharacter
를 상속받았기에 해당 클래스에 접근하여 데이터를 세팅한다.너무 깊게 들어가지말고, 쉽게
ACharacter
에 있는 멤버변수에 접근하여 세팅해주는 코드이다. 순서대로 앞서 말한 구조를 따라간다.ConstructorHelpers
FClassFinder
를 통해 찾아서 설정해주었다.입력 시스템 개요
플레이어의 입력은 컨트롤러를 통해 폰으로 전달됨 (우선순위를 컨트롤러가 가진다.) 여기서 입력을 컨트롤러가 처리할 수도, 폰이 처리할 수도 있는데, 일반적으로는 폰이 처리하도록 설정
다양한 입력에 대해서 컨트롤러가 개개인의 폰에 대해서 처리하다보면 결합도가 높아지고 의존성이 방대해짐.
이번 강의에선 향상된 입력 시스템을 사용한다. 이는 사용자의 입력 설정 변경에 유연하게 대처할 수 있도록 구조를 재수립한다. 사용자의 입력 처리를 네 단계로 세분화하고 각 설정을 독립적인 에셋으로 대체한다. (원래는 유연한 입력을 대체하기 힘듬)
향상된 입력시스템 동작 구성
사용자가 기본적으로 입력을 진행하면 입력 매핑 컨텍스트라고 하는 것을 통해서 입력과 연결이 되고, 입력에 따라 액션이 수행된다. 이 액션에서 입력에 대해서 재가공할 것인지 결정하고 트리거를 활성화한다. 이후 게임로직에 맞게 수행된다.
게임로직의 부담을 줄여주고 (비즈니스 로직과 입력 로직을 분리) 유연한 입력 처리를 가능하게 한다.
유니티의 New Input System과 비슷한 구조로 보인다.
입력 시스템 실습
마찬가지로
ConstructorHelpers
을 통해 사용할 Input 매핑 컨텍스트, 각 액션을 가져온다.추가적으로 Action에선 Extension처럼 각 액션에 대한 처리를 확장할 수 있다.
정리
Visible
,Edit
,AnyWhere
,DefaultsOnly
,InstanceOnly
,BlueprintReadOnly
,BlueprintReadWrite
,Category
The text was updated successfully, but these errors were encountered: