[이득우의 언리얼 C++ 게임 개발의 정석] Chapter 2. 액터의 설계

수민·2023년 3월 14일
0
post-thumbnail

이득우의 언리얼 C++ 게임 개발의 정석을 읽고 개인 공부 목적으로 요약 정리한 글입니다@

구매링크


👀 월드

개념

월드 (World) : 게임 콘텐츠를 구동하기 위해 필요한 필수적인 환경

월드가 제공하는 요소

  • 공간 (Space)
    가상 세계를 구성하는 3차원의 영역
    Transform 구조체 사용
    기본 단위 : cm

  • 시간 (Time)
    가상 공간에서 흐르는 시간
    시간의 스케일 조정 가능
    단위 : 초, 현실과 동일

  • 물리 (Physics)
    월드 공간에 배치된 물체에 작용하는 물리적인 환경
    공간에 배치된 물체가 월드로부터 물리적인 영향을 받으려면 Collision 정보가 필요하다!!!
    ex. 중력

  • 렌더링 (Rendering)
    엔진이 제공하는 시각적인 기능
    빛, 이에 반응하는 Material
    물리기반 렌더링 시스템 제공


👀 액터

개념

액터 (Actor) : 언리얼 엔진에서 콘텐츠를 구성하는 최소 단위의 물체
자신에게 주어진 역할을 수행하는 물체!!

액터의 구성

  • 이름
  • 유형 (클래스 이름)
  • Transform (액터는 반드시 월드에 존재해야 하므로)
  • Property (액터에 설정된 속성값)
  • 게임 로직 (프로그래밍 코드)

👀 레벨

레벨(Level) : 월드에 배치된 액터들의 집합
플레이어에게 주어지는 스테이지라고 생각해도 될듯!

흰색 : 레벨을 구성하는 미리 만들어진 액터
노란색 : 플레이 이후 생성된 액터


👀 컴포넌트

액터의 주요 기능은?

  • 시각적 기능 : 플레이어에게 어떻게 보여질 것인가?
  • 물리적 기능 : 액터의 이동과 액터들 간의 상호 동작을 어떻게 할 것인가?
  • 움직임 : 액터가 어떤 움직임을 가질 것인가?

개념

컴포넌트 (Component) : 액터가 조합할 수 있도록 규격화된 기능들
액터는 여러 개의 컴포넌트를 가질 수 있다.

주요 컴포넌트

  • StaticMesh Component
    StaticMesh(애니메이션 없음) 사용
    시각적 기능 + 물리적 기능
    주로 배경 물체

  • SkeletalMesh Component
    SkeletalMesh(애니메이션O) 사용
    시각적 기능 + 캐릭터의 물리 기능 + 애니메이션
    주로 캐릭터

  • Collision Component
    지정한 영역에 물리적인 기능 설정
    Sphere/Box/Capsule

  • Camera Component

  • Audio Component

  • ParticleSystem Component

  • Light Component

  • Movement Component

RootComponent

: 액터의 컴포넌트 중 대표하는 하나의 컴포넌트
반드시 지정해야 함


👀 UPROPERTY

언리얼 오브젝트

언리얼 오브젝트 : 언리얼 실행 환경에 의해 관리되는 C++ 객체
언리얼 오브젝트라면 UPROPERTY 매크로를 활용하여 언리얼 실행 환경에서 자동으로 메모리 관리 가능
(더이상 사용되지 않는 객체는 할당된 메모리를 자동으로 소멸시켜줌!!)

언리얼 오브젝트 클래스가 되기 위한 규칙들

  • 클래스 선언 매크로
    : 해당 클래스가 언리얼 오브젝트임을 선언하기 위한 매크로
    클래스 선언의 맨 윗줄 : UCLASS
    클래스 내부 : GENERATED_BODY

  • 클래스 이름 접두사
    A : Actor 클래스
    U : Actor가 아닌 클래스

  • generated.h 헤더파일
    generated.h : 언리얼 헤더 툴에 의해 자동으로 생성되는 부가 파일

  • 외부 모듈에의 공개 여부
    DLL 내 클래스 정보를 외부에 결정하는 키워드
    이 키워드가 없으면 다른 모듈에서 해당 객체에 접근할 수 없다
    '모듈명_ API'

예시

#include "MyCharacter.generated.h"							// generated.h

UCLASS()													// 클래스 선언 매크로
class HUNT_PROTOTYPE_API AMyCharacter : public ACharacter	// HUNT_PROTOTYPE_API
{															// AMyCharacter에서 A!!
	GENERATED_BODY()										// 클래스 선언 매크로
		
public:
	UPROPERTY(VisibleAnywhere, Category = Collision)
		UCapsuleComponent* Capsule;
...

}

👀 객체 유형과 값 유형

언리얼 엔진이 제공하는 값 유형

  • 바이트 : uint8
  • 정수 : int32
  • 실수 : float
  • 문자열 : FString, FName
  • 구조체 : FVector, FRotator, FTransform

👀 에셋 경로 지정

{오브젝트 타입}'{폴더명}/{파일명}/{에셋명}

에셋 경로 정보는 게임 실행 중 변경될 일이 없으므로 static으로 선언해 처음 한 번만 초기화한다!

// SkeletalMesh 불러오기
static ConstructorHelpers::FObjectFinder<USkeletalMesh> SK_KWANG_GDC(TEXT("SkeletalMesh'/Game/ParagonKwang/Characters/Heroes/Kwang/Meshes/Kwang_GDC.Kwang_GDC'"));
if (SK_KWANG_GDC.Succeeded())
{
	GetMesh()->SetSkeletalMesh(SK_KWANG_GDC.Object);
}

만약 블루프린트 에셋의 클래스 정보를 넘겨받고 싶다면, 에셋 경로에 '_C' 접미사를 붙이면 된다!

// Blueprint 클래스 정보 불러오기
static ConstructorHelpers::FClassFinder<UAnimInstance> ANIM_BP_KWANG(TEXT("AnimBlueprint'/Game/Animation/ABP_MyCharacter.ABP_MyCharacter_C'"));
if (ANIM_BP_KWANG.Succeeded())
{
	GetMesh()->SetAnimInstanceClass(ANIM_BP_KWANG.Class);
} 
profile
우하하

0개의 댓글