언리얼오브젝트 ( U 로시작 ~ ) 일반 C++ 오브젝트 ( F 로시작 ~ )
언리얼오브젝트선언 언리얼헤더툴 (UHT) 메타정보 (Intermediate 폴더 ) 원본소스 (Source 폴더 )
1. 언리얼오브젝트이름.generated.h 파일이보이지않더라도일단 include 시켜주자. 나중에생성된다. 2. UCLASS 매크로를사용해헤더툴에게이클래스가언리얼오브젝트임을알려주자. 3. 언리얼오브젝트는클래스이름에고유한접두사 (Prefix) 를가져야하는데, U 와 A 가있다. 액터기반이아니면모두 U 를써주면된다. 4. UObject 는언리얼오브젝트가계도의최상단에위치한기본클래스. 5. GENERATED_BODY() 매크로도마찬가지로그냥써주자. 최소한의규칙이다.
빌드명령시작 ~ 소스코드파싱후메타데이터생성 ~generated.h/cpp 이제부터진짜컴파일 하나의언리얼오브젝트마다 UClass 객체가생성됨
CDO
게임브리오언리얼 3 유니티언리얼 4
프로젝트 월드 레벨 게임모드 Actor NPC Join Join Player0 Player1
ue4application.exe UGameInstance 월드 1 월드 2 월드 3
월드 1 퍼시스턴트레벨 Actor NPC Join Join 게임모드 Player0 Player1 스트리밍레벨
Trigger / Block / Trace 를사용해충돌감지유니티의 Trigger / Collision / Raytrace 와동일 Static Mesh / Skeletal Mesh 컴포넌트를사용 Skeletal Mesh 는유니티의메카님에해당하는, AnimBlueprint 를사용해애니메이션을제어할수있다. 폰구성에필요한기본 3 요소 언리얼엔진은다양한 Movement 컴포넌트를제공한다. Movement 컴포넌트는 AddMovementInput 로입력을받아최상위컴포넌트를이동시키도록구성되어있다. 이동에대한결과는폰의 Velocity 로확인할수있다.
정찰중플레이어혹은다른폰을감지하기위해제공사운드까지감지가능하다. NPC 에게네브메시를사용해특정액터를따라가거나특정지점으로이동시키게명령을내릴수있다. 캐릭터인공지능로직을설계하는 UI 를제공한다. 블랙보드를사용해데이터를관리하고, 현재상황에서수행할태스크를제작해활용할수있다. NPC 의제어 무브먼트컴포넌트에서캐릭터회피시스템을제공한다. 심플하지만네비영역에서빠질수있는 RVO 와복잡하지만네비영역내움직임을보장하는 Detour Crowd 방식이있다.
서버와클라이언트코드가공존하는게임프로그램제작 클라이언트코드만들어있는게임프로그램제작 서버코드만들어있는게임프로그램제작 에디터용모듈 (dll) 제작 엔진에서연동해서쓰는콘솔응용프로그램의제작
언리얼엔진전체모듈 ( C++ )
Developer : 에디터와프로그램에사용하는공용모듈의모음. 게임에는사용되지않음. Editor : 에디터 UI 를구성하는모듈의모음. 게임에는사용되지않음. Runtime : 게임에사용하는모듈의모음. 모든곳에서사용가능 ThirdParty : 빌드시외부라이브러리참조를위한모듈의모음
1. 플러그인폴더 : 플러그인을관리하는최상위폴더. 2. 플러그인명세서 : 플러그인에대한각종명세. 3. 리소스폴더 : 에디터에서사용할플러그인리소스. 4. 소스폴더 : 플러그인에서사용하는모듈들의집합.
외부모듈에서언리얼오브젝트사용멤버함수접근가능 외부모듈에서언리얼오브젝트사용불가 외부에서언리얼오브젝트형만사용가능멤버함수접근불가능.
원본파일 임포트 (Import) 텍스쳐애셋 RGB24 데이터 쿠킹 (Cooking) 텍스쳐애셋 ETC1 데이터 원본애셋 플랫폼용애셋
RGB24 데이터 파생데이터캐시저장소 ETC1 데이터 RGB24 데이터 ETC1 데이터 RGB 데이터
[InstalledDerivedDataBackendGraph] Boot=(Type=Boot, Filename="D:/DerivedDataCache/DarkWarrior/Boot.ddc", MaxCacheSize=512) Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=34, FoldersToClean=-1, Path="D:/DerivedDataCache/DarkWarrior") Pak=(Type=ReadPak, Filename="%GAMEDIR%DerivedDataCache/DDC.ddp") CompressedPak=(Type=ReadPak, Filename="%GAMEDIR%DerivedDataCache/Compressed.ddp", Compressed=true) 설정예시
텍스쳐애셋 원본데이터 첫쿠킹시변환된데이터를중앙서버에저장 파생데이터캐시저장소 ETC1 데이터 중앙서버에서다른작업자가만든파생캐시데이터를가져와쿠킹을처리 텍스쳐애셋 ETC1 데이터 작업자 1 데이터파생캐시서버 작업자 2
서버만소유하는오브젝트그룹 서버와모든클라가공유하는오브젝트그룹 서버와소유클라만소유하는오브젝트그룹 서버에는없이소유클라에만사용하는오브젝트그룹
GameState GameMode PlayerState Player Controller UMG HUD Pawn
GameMode Player 1 PlayerController Player 2 PlayerController GameState Player 1 Pawn Player 2 Pawn Player 1 PlayerState Player 2 PlayerState Player 1 UMG GameState Player 2 UMG GameState Player 1 HUD Player 1 Pawn Player 2 Pawn Player 2 HUD Player 1 Pawn Player 2 Pawn Player 1 PlayerController Player 1 PlayerState Player 2 PlayerState Player 2 PlayerController Player 1 PlayerState Player 2 PlayerState
원본 Actor 복제된 Actor 복제된 Actor
원본 Actor 복제된 Actor 복제된 Actor
UFUNCTION(Server, Reliable, WithValidation) void AddMoney(int32 money); virtual void AddMoney_Implementation(int32 money); virtual bool AddMoney_Validate(int32 money); void 클래스 ::AddMoney_Implementation(int32 money) { CurrentMoney += money; } bool AddMoney_Validate(int32 money) { if(money > 10000) { } } return true;