[언리얼] 언리얼 프로그래밍 기초

늦잠·2024년 4월 8일
1

언리얼 엔진 튜토리얼 정리.
링크 - https://dev.epicgames.com/community/learning/tutorials/lMr9/unreal-engine-begin-play-programming




빌드 과정

모듈 : 여러 클래스의 집합. C# 빌드 파일 하나가 클래스의 빌드 방식 설명.
플러그인 : 모듈과 에셋의 집합.
게임 피처 플러그인(Game Features Plugin) : 런타임에 기능을 활성화할 수 있는 특별한 플러그인.

  • Unreal Build Tool : C#으로 짜여진 툴. 언리얼 프로젝트 파일 생성. SDK의 플랫폼 별 의존도 체크.

  • 프로젝트 파일 생성

  • 소스 코드 : 모듈과 플러그인으로 이루어져 있음. c++ 코드.

  • 컴파일 : IDE나 에디터로 진행됨.

  • Unreal Automation Tool : C#으로 짜여진 툴. 빌딩, 쿠킹, 패키징을 진행.

  • 빌드 : 소스코드를 컴파일하고, 바이나리 파일 생성.

  • 쿠킹 : 에셋들을 언리얼 내부 포맷에서 플랫폼 특화 포맷으로 변환.

  • 패키징 : 컴파일된 코드와 쿠킹된 에셋들을 묶어 pak 파일로 만듬.

  • 이후 배포 및 출시를 위한 최적화나 환경설정 등을 진행.




매크로

C++ 코드의 요소를 블루프린트와 필요한 언리얼 시스템에 노출시킴.

  • UCLASS - 클래스.
  • USTRUCT - 구조체.
  • UENUM - enum 타입.
  • UFUNCTION - 멤버 함수. 델리게이트나 리플리케이션을 위해서도 필요.
  • UPROPERY - 멤버 변수. 리플리케이션이나 직렬화serialization를 위해서도 필요.


Core Features

기본 데이터 타입

  • 숫자
    • float, double
    • (U)Int8/16/32/64 -> 일반적인 int 타입도 쓸 수는 있지만 int는 환경에 따라 길이가 달라질 수 있기 때문에 비추.
  • Enum
  • 구조체(Structs)
  • 문자열(Strings)
    • FString : 표준 일반 문자열.
    • FName : 캐싱된 문자열. 문자열 인덱스를 저장하기 때문에 비교가 매우 빠름. 대소문자 구분 X. 이름이나 경로 저장 등에 쓰임.
    • FText : 현지화된 문자열. 게임 내에서 표현되는 문자열은 아마 이 종류.
  • Collections
    • TArray - 배열.
    • TMap - 맵.
    • TSet - Set.
  • Transform 타입
    월드 트랜스폼 표현을 위한 타입. 위치와 회전 포함.
    • FRotator
    • FQuat - 쿼터니언. 회전을 나타내는 개념이라는데 따로 찾아봐야 될듯.
    • FTransform

객체

  • UObject : 모든 엔진 클래스의 베이스 클래스. 자바로 따지면 Object 클래스인듯. 엔진에 노출되어 자동 메모리 관리나 리플렉션 등등 가능해짐. 파생 클래스들은 앞글자가 U.

  • Actor : 레벨에 배치될 수 있는 모든 것의 베이스 클래스. 세션이나 커넥션?도 처리? Tick() 내재. components를 보관하는 용기. 파생 클래스는 앞글자가 A.

  • Components : Actor에 붙어서 게임을 실제로 표현하는 것들.

  • Life Cycle

    • Asset Loaded

    • PostLoad/PostActorCreated

    • initialize Components

    • OnActorSpawned

    • BeginPlay

    • 생성 :
      UObject는 NewObject로 동적 생성.
      AActor는 SpawnActor로 동적 생성.

    • 파괴 :
      AActor는 Destroy() 호출 가능.
      UObject는(Actor도 UObject) 레퍼런싱 하고 있는게 아무것도 없을 때 가바지 컬렉터가 알아서 메모리 해제.

new나 delete, 스마트 포인터 등으로 직접 메모리 관리를 하려고 하지 말것. 가비지 컬렉터에 맡겨라.
※ UPropery 매크로 없이 UObject에 포인터를 사용하지 마라.

  • Smart Pointers

    • UObject 파생 클래스에 사용하는 포인터 :

      • TObjectPtr
      • TWeakObjectPtr
      • TSubclassOf
      • TSoftPtr
      • TSoftClassPtr
    • UObject 아닌 것에 사용하는 포인터 :

      • TUniquePtr
      • TSharedPtr
      • TSharedRef
      • TWeakPtr

각자가 무슨 역할인진 나중에 더.

이외

  • Interface :
    우리가 아는 그 인터페이스. 다른 언어와 다르게 인터페이스의 모든 함수를 구현할 필요는 없다고 함. blueprint에 노출됨. c++에서 인터페이스를 다뤄본 기억이 없는데 java 인터페이스랑 비슷하려나?

  • 정적 함수 라이브러리 Static Fuction Library :
    어디서든 호출 가능한 정적 함수 만드는 라이브러리. 구조체에 함수 기능 추가할 때 유용.

  • Data Object
    데이터 보관용 오프젝트.

    • DataAsset :
      데이터 단순 보관용. 몇가지 설정을 할 수있는 큰 구조체. 데이터 전용 블루프린트.
    • DataTable:
      import, export가 쉬운 키 테이블. import, export가 쉽다는 게 어떤 느낌이지?
    • Curve
  • Delegate, Event :
    listener를 Bind했다가 event를 broadcast.

  • SubSystem :
    추가하면 원래 있는 클래스들을 건드릴 필요 없이 모듈적으로 기능 확장 가능. Engine, Editor, GameInstance, LocalPlyaer 스코프 서브시스템으로 나뉨. 자세한 건 언리얼 사이트의 프로그래밍 서브클래스 참조.

  • Async Task Graph :
    여러 CPU에서 사용되거나 비동기 스레드 작업에 사용될 수 있는 task graph. task graph가 뭐지..?




메모리

  • 에셋 로딩 :
    자동적으로 로드 할 수도 있고 소프트 레퍼런스에서 로드하도록 요청도 가능.

  • Garbage Collector :
    UPROPERTY 멤버를 자동으로 메모리 관리. 아무도 레퍼런싱 하지 않는 객체는 메모리 해제 대상이 됨.

하드 vs 소프트 레퍼런스 차이 :

A가 B를 하드 레퍼런싱 하면 A 에셋이 로드 될 때 B 에셋도 같이 로딩됨. 반면 소프트 레퍼런싱을 할 경우엔 에셋을 로드하지 않고 그냥 주소만 갖고 있음. 소프트 레퍼런스와 인터페이스를 통해 하드 레퍼런스의 의존도를 줄일 것.




Gameplay Framework

  • GameInstance :
    게임 프로그램이 실행 될 때 부터 꺼질 때까지 살아있는 오브젝트.

  • GameMode :
    실행 흐름을 정의하는 클래스. 서버에만 존재. 레벨 별 오브젝트. 하드 레벨 전환시 소멸.(하드 vs 소프트 레벨 전환은 나중에 더 공부.)

  • GameState :
    게임 모드의 보조 클래스. 서버와 클라이언트, 양 쪽에 존재하고 서버 -> 클라이언트로 리플리케이트 됨. 팀 대전 게임에서 점수 상황이라던가 플레이어 목록 같은거 저장해 놓는 용도.

  • Player / AI Controller :
    폰(Pawn)의 두뇌 역할. 플레이어를 상징하는 클래스 같은 느낌. 서버와 소유하고 있는 클라이언트에 존재. 서버와 클라이언트는 이 컨트롤러를 통해 소통. 조종하는 폰을 쉽게 바꿀 수 있기 때문에 입력 같은 건 폰 말고 컨트롤러 클래스에서 정의하는 걸 권장.

  • Pawn / Character :
    폰은 컨트롤러가 조종하여 행동을 수행하는 물리적인 몸 actor. 캐릭터는 걷고 뛸 수 있는 폰의 한 종류.

  • Movement Component :
    폰에 부착되어 여러 움직임을 구사할 수 있는 컴포넌트. Online-ready movement framework -> 온라인에서도 자연스럽게 보일 수 있게 여러 기능을 보조하는 듯..? 더 공부해 볼 것.

  • Input Component :
    플레이어 입력을 지정된 곳으로 전달. 언리얼 5에서는 Enhanced Input으로 대체되어 가는 듯.

  • Cheat Manager :
    배포 버전에 실수로 포함시킬 걱정 없이 개발에 필요한 치트 구현하는 곳.

기타

  • Ticking :
    틱. 한 틱에 실행될 코드를 Tick()에 넣어둠. 간격 설정 가능. 틱은 단일 스레드로 처리됨. 무거우니 최대한 적게.

  • Gameplay Ability System :
    RPG나 MOBA 타이틀에서 볼 수 있는 어빌리티 및 어트리뷰트 유형을 구축하기 위한 고도로 유연한 프레임워크. 게임플레이 어빌리티 시스템과 상호작용하는 액터에는 어빌리티 시스템 컴포넌트(Ability System Component) 가 있어야 함.

  • Mass :
    매스 엔티티(MassEntity) 는 언리얼 엔진 5에서 사용 가능한 데이터 지향 계산을 위한 프레임워크.. 라는데 잘 와닿지 않음. 대규모 데이터 계산이 필요할 때 사용하는 프레임워크인듯.

  • Game Features :
    런타임에 안전하게 활성/비활성화 가능.




Replication

  • Replication :
    클라이언트/서버 중심. 세션과 연결, 각 플랫폼에서 클라이언트-서버 간 통신 등을 처리.
    라고 써져있긴한데 이렇게 쓰니까 뭔가 와닿진 않네..

  • Actor Replication :
    property와 모든 컴포넌트를 리플리케이트 가능.

  • 관련성(Relevance) :
    플레이어와 관련성 있는 액터만 클라이언트에게 리플리케이트 됨.

  • Replication Graph :
    이 플러그인을 통해 액터가 다른 클라이언트에 어떻게 리플리케이션 되는지 정할 수 있음. 가시성이나 거리같은거.

  • 소유권(Ownership) :
    플레이어가 소유한 액터만이 서버에 데이터 전송 가능. 서버는 다 가능.

  • RepNotify :
    리플리케이티드 변수가 바뀔 때마다 실행될 로직을 여기에 설정 가능.

  • Property Replication :
    UProperty가 replicated로 설정되었다면 그 값이 바뀔때마다 서버가 클라이언트에게 알려줌.

  • RPCs :
    원결 프로시저 호출(Remote Procedure Calls). 다른 클라이언트에 함수를 호출하는 기능.

  • 안정성(Reliability) :
    Reliable calls는 호출이 발생할 것을 보장함. unreliable은 트래픽 문제 등으로 안될 수도 있음.
    리플리케이션 설정 보면 Reliable 체크하는 게 있던데 중요한 것들은 이걸 체크하면 좀 더 리소스를 써서 호출을 보장하고, 별로 안 중요한 것들은 해제해 놓는 그런 거 말하는듯.




Profiling and Debugging

  • Logging :
    UE_LOG 매크로로 로그 사용. 여러 카테고리 있음.

  • Visual logger :
    타임라인 기반으로 작동하는 로깅 툴. 여러 시각적인 표현 생성 가능.

  • Console :
    에디터에 있는 콘솔창으로 여러 명령 실행 가능.

  • Unreal Insights :
    메모리라던가 분석에 특화된 툴인듯. 개발자가 병목 현상을 식별하여 애플리케이션 최적화를 통해 퍼포먼스를 개선할 수 있도록 지원..한다고 함.

  • CSV Profiler :
    프레임 별 렌더랑 게임 스레드 분석용. 언리얼 인사이트 쓰는 게 낫다함.

  • LLM :
    태그 기반 저수준 메모리 추적기. Low Level Memory tracker. 언리얼 인사이트 쓰는 게 낫다함222

  • ProfileGPU :
    gpu 분석기인가부지.

  • DumpGPU :
    한 프레임의 내부 리소스를 모두 덤핑한 후, 이걸 인터렉티브 html을 만들어서 보여줌.

  • Gauntlet :
    빌드 실행하고 유효성 검사하는 프레임워크.
    여러 플랫폼에서 세션 실행 자동화하는 것이 목적. 자동화 테스트에 적합.

profile
피카

0개의 댓글