오브젝트 기본 게임 플레이 요소인 Actor와 Object 언리얼에는 게임 오브젝트 처리용 시스템이 있다. 오브젝트의 베이스 클래스는 UObject이다. UObject에서 파생되는 클래스에 UCLASS 매크로를 사용하여 태그하면 UObject 처리 시스템에서 인식 하게 된다. UCLASS 매크로 UClass 매크로는 UObject에게 언리얼 기반 정보를 UClass 로의 레퍼런스를 넘겨준다. 각 UClass는 Class Default Object(CDO) 오브젝트를 하나 유지한다. CDO는 기본 템플릿 오브젝트로 클래스 생성자에 의해 생성된 이후 변경되지 않는다. UCLASS와 CDO는 지정된 오브젝트 인스턴스에 대해 검색할 수 있지만 일반적으로 읽기전용이여야 한다. 오브젝트 인스턴스의 UCLASS는 G..
다이내믹 델리게이트 Serialize 가능하면서 리플렉션도 지원하는 델리게이트 다이내믹 델리게이트 선언하기 선언은, 전용 매크로를 사용한다. DECLARE_DYNAMIC_DELEGATE_RetVal, etc. - 다이내믹 델리게이트 생성 DECLARE_DYNAMIC_MULTICAST_DELEGATE_RetVal, etc. - 멀티-캐스트 델리게이트 생성 다이내믹 델리게이트 바인딩 BindDynamic(UserObject, FuncName) - 다이내믹 델리게이트에서 BindDynamic() 호출을 위한 헬퍼 매크로 AddDynamic(UserObject, FuncName) - 다이내믹 멀티캐스트 델리게이트에서 AddDynamic() 호출을 위한 헬퍼 매크로 RemoveDynamic(UserObject, ..
C++ 가상함수 virtual Fuction 가상함수는 파생 클래스에서 재정의 할 것으로 기대하는 멤버 함수를 뜻한다. 파생클래스에서 virtual 키워드를 사용하지 않아도 자동으로 가상함수가 된다. 가상 소멸자 소멸자는 가상함수로 선언 하여 기본 클래스와 파생 클래스 모든 소멸자가 호출되도록 한다. 생성자와 소멸자 호출 순서 부모 클래스가 있는 자식 클래스는 부모생성자 - 자식생성자 - 자식소멸자 - 부모소멸자 순으로 호출된다. new, delete 연산자 오버로딩 new 연산자는 메모리 할당, 생성자 호출, 주소 값의 형변환 작업을 진행한다. 연산자 함수가 먼저 호출되고 해당 타입의 생성자가 호출된다. void * operator new (size_t size) { void * adr = new ch..
운영체제 (Operating System) 메모리 구조 (Memory Structure) 운영체제의 메모리 구조는 유저 영역 과 커널 영역 두가지 영역으로 나뉜다. 사용자가 함부로 커널 영역에 접근할 수 없도록 영역을 나누어 놓았다. 유저 영역에는 4가지로 나뉘는데 코드, 데이터, 스택, 힙 으로 구분된다. 코드 영역 (Code) 실행할 프로그램의 코드가 저장되는 영역이다. 텍스트 영역이라고도 불린다. 여기서 코드는 컴파일된 기계어 코드를 뜻한다. 데이터 영역 (Data) 전역변수와 정적(static) 변수가 저장되는 영역이다. 프로그램이 시작되고 종료될 때까지 메모리에 계속 남아있다. 스택 영역 (Stack) 프로그램에서 호출되는 함수의 지역변수와, 매개변수가 저장되는 영역이다. 스택은 함수가 시작, ..
델리게이트 C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형 Delegate로 C++ 오브젝트 상의 멤버 함수 호출을 안전한 방식으로 한다. 델리게이트를 사용하여 임의 오브젝트 멤버 함수에 동적으로 바인딩 시킬 수 있고, 그 다음 오브젝트에서 함수를 호출할 수 있다. 델리게이트는 항상 참조 전달해야 한다. heap에 메모리를 할당 해야 하기 때문이다. 싱글 캐스트와 멀티 캐스트 모두 지원되며, 다이나믹 델리게이트도 가능하다. 델리게이트 선언 델리게이트의 선언은 매크로를 사용하여 선언할 수 있다. 값을 반환하는 함수 페이로드(Payload, 유상) 변수 4개 까지 함수 파라미터 8개 까지 const 로 선언된 함수 DECLARE_DELEGATE( DelegateName ) - void Fu..
언리얼 서밋 2021년 10월 13일 오늘 시청했던 세션 중 언리얼 엔진 최적화 관련된 내용이 있어 기록해 두고자 한다. 나중에 최적화 이슈가 있을때 참고해 보면 좋을 듯 하다 권장 최적화 기법 공식문서 > 퍼포먼스와 프로파일링 언리얼 서밋 다시보기 (최적화로 검색하여 관련 세션 시청) 언리얼 엔진 유튜브 채널 최적화 관련 영상들 Unreal Engine 4 Optimization Tutorial 참조 (화면 보여짐 여부로 최적화) Actor & Component Tick dumpticks로 시작 최대한 필요 없을 때는 Tick을 돌지 않도록 하자 Significance Manager Significance Value에 기반하여 뷰 프러스트럼에 들어오는지 확인하고 차등 표현 URO 화면에 보이는 메시들의..
액터 스폰 게임플레이 코드에서 Actor의 새 인스턴스를 생성하는 함수에 대한 설명 SpawnActor 함수 스폰(Spawn)은 Actor의 새 인스턴스를 생성하는 과정이다. Actor의 스폰은 UWorld::SpawnActor()함수를 사용한다. 이 함수는 새로 생성된 Actor 포인터를 반환한다. AActor* UWorld::SpawnActor ( UClass* Class, FName InName, FVector const* Location, FRotator const* Rotation, AActor* Template, bool bNoCollisionFail, bool bRemoteOwned, AActor* Owner, APawn* Instigator, bool bNoFail, ULevel* Over..
액터의 수명 주기 액터의 생성과 소멸에 대해 알아보자 수명 주기 분해도 디스크에서 로드 레벨에 배치되어있는 액터에 대해서, LoadMap이 발생하였을 때나 AddToWorld가 호출되었을때 발생한다. 패키지/레벨에 있는 액터가 디스크레엇 로드된다. PostLoad 이후 - 디스크에서의 로드 완료후 serialize된 액터에 의해 호출된다. PostLoad와 PostActorCreated는 상호 배제 된다. InitializeActorsForPlay 플레이용 액터 초기화 RouteActorInitialize 액터 초기화 경로 변경 - 초기화 되지 않은 액터에 대해 호출 PreInitializeComponents 컴포넌트 초기화 이전 InitializeComponent 컴포넌트 초기화 PostInitiali..
액터 (Actor) Actor는 레벨에 배치할 수 있는 오브젝트이다. 액터는 이동, 회전, 스케일과 같은 3D 트랜스폼을 지원하는 범용 클래스다. 액터는 게임플레이 코드를 통해 스폰 및 소멸 가능하다. 액터 생성 AActor 클래스 인스턴스를 생성하는 것을 Spawn이라 한다. SpawnActor() 함수나 템플릿으로 생성한다. 액터 스폰 챕터에서 자세히 확인 컴포넌트 액터는 Component라 불리는 특수유형 Object를 담는 그릇으로 볼 수 있다. 여러 컴포넌트를 사용하여 액터의 이동 및 렌더링 방식 등을 제어할 수 있다. 액터는 플레이 도중 네트워크를 통한 프로퍼티 및 함수 호출의 리플리케이션 기능이 있다. UActorComponent 액터 컴포넌트 베이스 컴포넌트, 액터의 일부로 포함, tick..
언리얼 C++ 언리얼 엔진의 C++ 코드에 대한 안내서 C++ 및 블루프린트 언리얼 엔진에서 새로운 게임플레이 요소를 만들기 위해서는 C++나 블루프린트 스크립트, 두 방법중 하나로 선택하여 만들 수 있다. 클래스 마법사 언리얼 에디터안의 클래스 마법사를 사용하여 C++클래스를 만든다. 부모클래스를 설정하고, 이름을 설정하면 마법사가 파일을 자동으로 생성해줘 편집을 시작할 수 있다. #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS() class AMyActor : public AActor { GENERATED_BODY() public: // 이 액터의 프로퍼티에 기본값을 설정합니다. AMyActor(); // 매 프레임 호출됩..
언리얼 엔진 프로그래밍 기본 하나의 게임은 코드, 콘텐츠, 세팅이 전부 들어있는 게임 프로젝트로 정의 된다. 코드는 하나 이상의 게임플레이 모듈에 있고, 각 게임 프로젝트는 하나 이상의 모듈이 들어있다. 아트, 사운드 등의 콘텐츠는 에디터에 임포트되어 패키지와 맵으로 저장된다. 세팅은 시작시 로드되는 환경설정(ini) 파일에 정의된다. 모듈 각 게임은 하나 이상의 게임플레이 모듈로 이루어져 있다. 모듈은 별도의 패키지 파일이라기 보단 사실상 DLL에 가깝다. 모듈 API 모듈 밖에서 접근할 필요가 있는 함수와 클래스는 API 매크로를 통해 노출해야한다. 컴파일 시간 비용이 들기에 필요한 것만 노출해야한다. 클래스 게임플레이 클래스는 표준 C++ 헤더 파일과 엔진에 정의된 특수 매크로를 함께 사용한다. 클..
애셋 레지스트리 애셋 레지스트리(Asset Registry)는 에디터가 로드되면서 로드되지 않은 애셋 정보를 비동기적으로 모으는 에디터 기능이다. 콘텐츠 브라우저에서 사용하지만 에디터 코드의 어디에서나 사용 가능하다. 애셋 목록 구하기 애셋 레지스트리 모듈을 로드한다음 Module.Get().GetAssetsByClass()를 부르면 된다. FAssetData 의 목록을 반환 한다. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); TArray AssetData; const UClass* Class = UStaticMesh::StaticClass(); AssetRegistryModul..