캐릭터와 입력 시스템

Unreal 이론|2024. 10. 19. 23:16

[이득우의 언리얼 프로그래밍 Part2 수업의 정리]

 

액터의 구조

  • 월드에 속한 컨텐츠의 기본 단위 - 액터
  • 액터는 트랜스폼을 가지며, 월드로부터 틱과 시간서비스를 제공받는다
  • 사실 액터는 논리적 개념. 컴포넌트를 감싸는 포장 박스에 불과함
  • 실질적 구현은 컴포넌트가 진행하며 액터는 다수의 컴포넌트 소유하고 있음
  • 다수의 컴포넌트를 대표하는 컴포넌트를 루트 컴포넌트(Root Component)라고 함
  • 액터는 루트 컴포넌트를 가져야 하며, 루트 컴포넌트의 트랜스폼은 액터의 트랜스폼을 의미한다.

DefaultSceneRoot는 임시로 생성한 아무 기능 없는 컴포넌트

 

C++ 액터에서 컴포넌트의 생성

  • 컴포넌트는 언리얼 오브젝트이므로 UPROPERTY를 설정하고 TObjectPtr로 포인터를 선언
    • 언리얼5버전부터 헤더에 언리얼 오브젝트를 선언할 때 일반 포인터에서 TObjectPtr로 변경
  • 컴포넌트의 등록
    • CDO(Class Default Object - 생성자)에서 생성한 컴포넌트는 자동으로 월드에 등록된다.
    • NewObject로 생성한 컴포넌트는 반드시 등록절차를 거쳐야한다.(예: RegisterComponent)
    • 등록된 컴포넌트만이 월드의 기능을 사용할 수 있으며, 물리와 렌더링 처리에 합류한다.
  • 컴포넌트의 확장 설계
    • 에디터 편집 및 블루프린트로의 승계를 위한 설정
    • UPROPERTY에 지정자(Specifier)를 설정할 수 있다.
  • 컴포넌트 지정자
    • Visible / Edit : 크게 객체타입과 값타입으로 사용
    • Anywhere / DefaultsOnly / InstanceOnly : 에디터에서 편집 가능 영역
    • BlueprintReadOnly / BlueprintReadWrite : 블루프린트로 확장시 읽기 혹은 읽기쓰기 권한을 부여
    • Category: 에디터 편집 영역(Detail)에서의 카테고리 지정
  • C++로 최대한 만들어 놓은 후 블루프린트에서 최소한만 추가해서 액터를 생성하는것이 필요
  • 블루프린트에서 Static Mesh에다가 Mesh를 입혀 만들수도 있지만, 아래처럼 C++에서 어느정도 틀을 만들수도 있다.
AABFountain::AABFountain()
{
 	// 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("/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("/Game/ArenaBattle/Environment/Props/SM_Plains_Fountain_02.SM_Plains_Fountain_02"));
	if (WaterMeshRef.Object) {
		Water->SetStaticMesh(WaterMeshRef.Object);
	}
}

ClassSetting에서 Parent Class를 C++로 만들어놓은 액터로 설정한 후 라이팅만 추가

 

폰의 기능과 설계

  • 폰은 액터를 상속받은 특별한 액터이며, 플레이어가 빙의해 입출력을 처리하도록 설계되어 있음
  • 폰에 카메라를 부착하면 폰이 바라보는 세상이 플레이어 화면에 출력됨
  • 입력을 지정하면 폰에 입력이 전달되어 플레이어가 폰을 움직이도록 조종할 수 있게됨
  • 폰은 길찾기를 사용할 수 있으며, 일반적으로 세 가지 주요 컴포넌트로 구성된다.
    • 기믹과 상호작용을 담당하는 충돌 컴포넌트 (루트컴포넌트)
    • 시각적인 비주얼을 담당하는 메시 컴포넌트
    • 움직임을 담당하는 컴포넌트
  • 컴포넌트 중에서 트랜스폼이 없이 기능만 제공하는 컴포넌트를 액터컴포넌트라고 한다.
  • 트랜스폼이 있는 컴포넌트 = 씬 컴포넌트

 

캐릭터의 기본구조

  • 캐릭터는 인간형 폰을 구성하도록 언리얼이 제공하는 전문 폰 클래스를 의미
  • 캐릭터는 세가지 주요 컴포넌트로 구성됨
    • 기믹과 상호작용을 담당하는 캡슐 컴포넌트(루트 컴포넌트)
    • 애니메이션 캐릭터를 표현하는 스켈레탈 메시 컴포넌트
    • 캐릭터의 움직임을 담당하는 캐릭터 무브먼트(CharacterMovement) 컴포넌트

Character의 정의로 이동해보면 이미 private으로 세가지 컴포넌트가 선언되있는걸 확인 가능

 

입력 시스템의 동작 방식

  • 플레이어의 입력은 컨트롤러를 통해 폰으로 전달됨
  • 입력을 컨트롤러가 처리할 수도, 폰이 처리할 수도 있는데, 일반적으론 폰이 처리하도록 설정
    • ex) GTA같은 다양한 사물에 빙의하는 게임의 경우 폰이 유리 (GTA는 사람, 자동차, 헬기, 오토바이 등등 다양한 사물에 빙의)

향상된 입력시스템(Enhanced Input System)

  • 기존 입력시스템을 대체하고 언리얼 5.1부터 새롭게 도입
  • 사용자의 입력 설정 변경에 유연하게 대처할 수 있도록 구조를 재수립
  • 사용자 입력 처리를 네 단계로 세분화하고 각 설정을 독립적인 애셋으로 대체

향상된 입력시스템 동작 구성

  • 사용자의 입력 데이터를 최종 함수에 매핑하는 과정을 체계적으로 구성
  • 플랫폼에 따른 다양한 입력 장치의 설정
    • 예) 게임패드용 입력 매핑 컨텍스트, 키보드용 입력 매핑 컨텍스트
  • 입력 값의 변경
    • 예) AD/WS 입력값을 Y축과 X축으로 변경, 값 반전의 처리
  • 이벤트 발생 조건의 상세 설정
    • 예) 일반 버튼인가? 축 이동인가? 일정 이상 눌러야 하는가?

 

'Unreal 이론' 카테고리의 다른 글

캐릭터 애니메이션 설정  (0) 2024.10.21
캐릭터 컨트롤 설정  (0) 2024.10.20
언리얼 엔진 게임 제작 기초  (0) 2024.10.14
언리얼 빌드 시스템  (1) 2024.10.03
언리얼 오브젝트 관리 - 패키지  (0) 2024.10.01

댓글()