[4장] 첫 번째 멀티플레이어 환경 설정

2025. 5. 9. 21:03·책 정리

C++ 헤더 프리뷰

블루프린트 클래스가 마치 C++로 작성된 것처럼 검사 결과를 볼 수 있다.

C++ 헤더 프리뷰 사용법 : 메인 메뉴에서 Tools → C++ 헤더 프리뷰 클릭 → 원하는 클래스 선택

언리얼에서의 세 가지 주요 클래스

UObject : 언리얼 엔진의 기본 클래스

  • 주요 기능
    • 가비지 컬렉션(GC, Garbage Collection)
    • 네트워킹 지원
    • 프로퍼티 및 멤버 함수의 리플렉션

AActor : 에디터 또는 런타임 중에 게임 레벨에 추가할 수 있는 UObject

  • 런타임 중에 추가될 때는 액터가 스폰됐다고 표현한다.
  • AActor는 멀티플레이어 환경에서 네트워킹 중에 복제될 수 있는 기본 타입
    • 동기화가 필요한 모든 컴포넌트의 정보를 제공한다.

UActorComponent : 액터 또는 액터 자체에 속하는 다른 컴포넌트에 연결할 컴포넌트를 정의하는 기본 클래스

언리얼에서의 엔티티

UStruct : 일반적인 데이터 구조를 생성하는 데 사용된다.

  • 특정 클래스에서 확장되지 않는다.

UEnum : 요소의 열거형을 나타내는 데 사용된다.

언리얼에서의 클래스 이름 접두사

U : UObject에서 파생된 일반적인 객체(ex. Component)에 사용된다.

A : AActor에서 파생된 객체에 사용되며 레벨에 추가될 수 있다.

F : FColor 구조체와 같은 일반적인 클래스 및 구조체에 사용된다.

T : TArray 또는 TMap과 같은 템플릿에 사용된다.

I : 인터페이스에 사용된다.

E : 열거형에 사용된다.

B : bool 또는 uint8(bool 대신 사용 가능)에 사용된다.

이러한 대부분의 접두사는 필수다. 액터에서 파생된 클래스의 이름을 A접두사 없이 지정할 시 오류가 발생한다. 따라서 언리얼 엔진은 에디터에서 한 번 접두사를 숨긴다. 이 규칙은 C++ 클래스에만 적용되며, 블루프린트는 이러한 접두사 없이 이름을 지정할 수 있다.

UHT : 언리얼에서 UObject 시스템을 지원하는 사용자 정의 파싱 및 코드 생성 도구.

  • 언리얼용 C++ 헤더를 파싱하고, 사용자가 만든 클래스가 엔진에서 작동하는 데 필요한 상용구 코드를 생성한다.
  • 언리얼 헤더 툴이 자동 생성하는 [클래스 이름].generated.h 파일은 엔진에서 코드가 정상 작동하는 데 필요한 매크로를 모두 포함한다.
    • 이 파일은 헤더에서 선언된 마지막 include 파일이어야 한다. 그렇지 않으면 컴파일러가 오류를 발생시킨다.

언리얼에서의 클래스 생성자

/// ...
UCLASS(Blueprintable, BlueprintType)
class APickup : public AStaticMeshActor
{
	GENERATED_BODY()
public:
	APickup();
	
	//...
};
  • 클래스 생성자는 일반적인 C++ 클래스와 마찬가지로 프로퍼티의 기본값을 설정하는 데 사용되며, 액터 자체에 컴포넌트를 생성하고 추가하는 데도 사용된다.

언리얼 엔진 리플렉션 시스템

리플렉션 : 프로그램이 런타임에 자신의 구조를 검사할 수 있는 기능

  • 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 복제, 블루프린트와 C++ 간의 통신 같은 다양한 시스템을 지원한다.
  • C++에서는 기본 지원이 아니므로 에픽게임즈가 UE에서 사용할 수 있도록 자체 시스템을 개발했다.
  • 리플렉션을 사용하려면 시스템에 표시하려는 타입이나 프로퍼티에 UCLASS(), UFUNCTION(), UPROPERTY()와 같은 매크로를 표기해야 한다.
    • 이러한 매크로를 활성화하려면, #include “Pickup.generated.h” 선언을 사용해야 한다.

매크로 설명

  • UCLASS() : UObject에서 파생되는 클래스의 리플렉션 데이터를 생성하는 데 사용
  • USTRUCT() : 구조체의 리플렉션 데이터를 생성하는 데 사용
  • GENERATED_BODY() : 이 마크업은 해당 타입에 필요한 상용구 코드로 모두 대체된다.
  • UPROPERTY() : 관련된 멤버 변수가 블루프린트 접근성이나 네트워크 복제와 같은 추가 기능이 있음을 엔진에 알리는데 사용된다.
  • UFUNCTION() : 확장된 블루프린트 클래스에서 이 함수를 호출하거나 블루프린트 자체에서 함수를 재정의할 수 있다.
  • 리플렉션 시스템은 가비지 컬렉터에서도 사용되므로 메모리 관리를 걱정할 필요가 없다.

메모리 관리와 가비지 컬렉션

  • 게임 레벨에서 수천 개(혹은 수만 개)의 활성화된 오브젝트가 있을 때, 가비지 컬렉션은 프로그래밍에 반드시 필요하다.
  • 더 이상 필요하지 않은 객체를 자동으로 수집하고 처리해 모든 것을 깔끔하고 정리된 상태로 유지하는데 도움이 된다.
    • 가비지 컬렉션은 프로그램이 원활히 실행될 수 있도록 메모리 누수나 성능 문제를 해결하기 때문에 멋진 기능을 만드는데 더 집중할 수 있다.
  • C++에서는 가비지 컬렉션을 기본적으로 구현하지 않는다. 따라서, 언리얼 엔진이 자체 시스템을 구현한다.
    • 프로그래머는 객체의 참조가 유효한지만 확인하면 된다.
  • 클래스에 가비지 컬렉션을 활성화하려면 UObject에서 상속돼야 한다.
    • 그렇게 되면 시스템은 가비지 컬렉션되지 않아야 할 객체 리스트(root라고도 한다)를 유지한다.
    • 객체가 루트에 리스트 돼 있는 한 객체는 삭제되지 않고 보존된다.
    • 하지만 이 리스트에서 제거되면, 다음에 가비지 컬렉터가 호출될 때(일정 간격)메모리에서 삭제된다.

액터들은 레벨이 종료될 때만 파괴된다. 그러나 Destroy() 멤버 함수를 호출하면 즉시 게임에서 제거되고 가비지 컬렉터가 활성화될 때 삭제된다.

'책 정리' 카테고리의 다른 글

[3장] 소용돌이탄 베리에이션  (0) 2025.05.23
[1장] 슈팅 게임의 구조  (0) 2025.05.16
'책 정리' 카테고리의 다른 글
  • [3장] 소용돌이탄 베리에이션
  • [1장] 슈팅 게임의 구조
DevJoo1120
DevJoo1120
  • DevJoo1120
    Jin's Programming
    DevJoo1120
  • 전체
    오늘
    어제
    • 분류 전체보기 (142)
      • 포트폴리오 (7)
        • Castlevania: Aria of Sorrow.. (7)
        • [UE5] KILL Everything (0)
      • C++ (0)
      • 라이브러리 (1)
      • 다이렉트X11 (0)
      • Unreal Engine (11)
        • Unreal Document (1)
        • 이것 저것 (8)
        • UI (1)
      • 자료구조 및 알고리즘 (0)
      • 책 정리 (3)
        • 코딩 테스트 합격자 되기 C++ 편 (10)
      • 코딩 테스트 (32)
        • 프로그래머스 (32)
      • 스파르타 코딩 언리얼 1기 (9)
        • 특강 (0)
        • C++와 Unreal Engine으로 3D .. (2)
      • TIL(Today I Learned) (63)
      • 영어 공부 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Study
    map
    코딩 테스트 합격자 되기 c++ 편
    코딩 테스트
    C++
    과제
    정리
    스파르타 코딩 클럽
    Unreal Engine 5
    프로그래머스
    코딩테스트
    팀 프로젝트
    WINAPI
    정렬
    책 정리
    반복문
    문자열
    이중 반복문
    Til
    배열
  • hELLO· Designed By정상우.v4.10.5
DevJoo1120
[4장] 첫 번째 멀티플레이어 환경 설정
상단으로

티스토리툴바