본문 바로가기
Unreal 메모리 관리 (GC) GC( GarbageCollection)를 위한 객체 저장소 관리되는 모든 Unreal Object의 정보를 저장하는 전역 변수: GUObjectArray GUObjectArray의 각 요소는 Flag가 설정되어 있다. GC가 참고하는 Flag (물론 다른 Flag도 있다.) Garbage Flag: 다른 Unreal Object로부터 참조가 없어서 회수 예정인 Object RootSet Flag: 다른 Unreal Object로부터 참조가 없어도 회수하지 않는 Object GC는 GUObjectArray에 있는 Flag를 확인해 회수할 Object를 파악 후 메모리에서 제거함. GC의 메모리 회수 방식 GC는 지정된 시간에 따라(설정에서 변경 가능) 주기적으로 메모리 회수( Default = 60s) .. 2024. 1. 3.
Unreal Struct & Map Unreal Struct 관련 프로퍼티를 체계화 및 조작할 수 있는 데이터 구조체이다. 구조체를 통해 커스텀 변수 타입을 생성해서 프로젝트를 체계화할 수 있다. 데이터 저장/전송에 특화된 가벼운 객체이다. Struct는 단순한 데이터 타입에 적합하므로 보다 복잡한 인터렉션을 위혀서는 UObject or AActor 서브클래스가 낫다. 구조체 작성 예시 //UStruct라는 Unreal 특유의 메크로를 선언 BlueprintType이라는 키워드 추가로 해당 구조체를 BP와 호환도는 데이터 성격을 가진다. USTRUCT(BlueprintType) //F로 시작하기에 일반 객체로 취급한다. -> Reflection System에 의해서 관리받지 못한다. //활용이 보통 스택 내 데이터로 사용되기 때문에 관리받.. 2024. 1. 3.
Unreal Delegate 객체지향 결합 강한 결합 (Tight Coupling) 클래스들이 서로 의존성을 가지는 경우를 의미한다. 느슨한 결합 실물에 의존하지 않고 추상적 설계에 의존 (DIP 원칙) 강한 결합은 바로 전 글에서 나왔던 CreateDefaultSubobject()로 오브젝트를 추가하는 것과 비슷하다. 결국 생성자에서 오브젝트를 추가하면 해당 오브젝트는 반드시 그 오브젝트를 갖기 때문이다. 느슨한 결합에서는 Interface를 활용해서 설계가 가능하다. 이건 예시가 필요할거 같은데 강한 결합은 다음과 같다. class Card { public: Card(int InId) : Id(InId) int Id = 0; }; class Person { public: Person(Card InCard) : IdCard(InC.. 2023. 12. 29.
Unreal Composition & Enum UMETA 출력 Composition (컴포지션) 객체지향 설계에서 상속이 가진 Is-A 관계만 의존해서는 설계와 유지보수가 힘들다. Composition은 객체지향 설계에서 Has-A 관계를 구현하는 설계 방법이다. Composition을 통해 거대한 클래스를 효과적으로 설계하는데 유용하게 사용할 수 있다. Composition의 필요성 이전 글인 Interface의 Person과 Student, Teacher, Staff의 예제를 그대로 사용해서 설명한다. 현재 Person의 구성원을 보았을 때 모두 School Card가 필요해보여 Person내에 Card를 구현했다. 하지만 이후 Person에서 Card가 필요하지 않은 객체도 Person을 상속받게 되면 Card 또한 받는다. 이렇게 Is-A관계에서 Has-A .. 2023. 12. 28.
Unreal Interface Interface 객체가 반드시 구현해야할 행동을 지정하는데 활용되는 타입 다형성의 구현과 의존성 분리 설계에 유용하게 활용된다. Unreal에서 Interface 예시 World에 배치되는 모든 오브젝트 -> Actor 움직이는 오브젝트 -> Pawn - 즉, Pawn은 Actor 중에 Pawn으로서 움직임을 구현해야한다. Pawn은 INavAgnentInterface를 통해 길찾기 시스템이 구현되어야 한다. 구현될 때 예시 Person 안에 Student, Staff, Teacher가 있다. Student와 Teacher는 수업에 반드시 참여해야하며, Staff는 참여가 불가하다. 그렇다면 Student와 Teacher는 Lesson Inteface를 통해 수업과 관련된 내용을 작성해주면 된다. 수업.. 2023. 12. 27.
Unreal 기본타입 및 문자열 Unreal 기본 타입을 따로 지정하는 이유 게임 제작 시 데이터 정보가 명확해야한다. 단일 컴퓨터에서 최대 퍼포먼스를 뽑아내야한다. 네트워크상에서 데이터 통신이 효율적이고 안정적이어야한다. PC, PS, XBox등 다양한 기기에서 C++함수에 대해 다르게 해석하는 경우가 있었다. 이를 '플랫폼 파편화'라고 한다. 이러한 문제를 해결하기 위해서 기본 타입을 지정한다. 간단한 예시로 C++의 경우 최소 32비트를 보장하도록 규정되어 있지만 특정 플랫폼에서는 64비트로 해석될 수 있다. 그렇기에 데이터를 지정할 때 int의 크기를 확신할 수 없는 문제가 있었지만 Unreal은 int32, int64처럼 명확하게 지정한다. C#의 경우 int는 항상 32비트로 해석하도록 되어있다. 이렇게 명확하게 함으로써 단.. 2023. 12. 26.
Unreal Object Reflection System & UClass Unreal Object Reflection SystemUnreal Object Reflection System은 Unreal 테크놀로지의 근간이며 에디터의 디테일 패널, Serialization, CG, 네트워크 리플리케이션, BP/C++ 등 다수의 시스템에 탑재 되어있다. Unreal에서 자체적으로 시스템을 구축한 것이다.헤더에 이 Reflection System을 고려해야한다는 것 UHT(Unreal Header Tool)에 알려주는 방법이 우리가 자주 봐왔던 “~~~.generated.h”이다.이 Reflection System은 필수가 아니며 Reflection System에 보이도록 하는 유형이나 프로퍼티를 주석에 달아주면 UHT가 컴파일할 때 정보를 수집한다.주석을 다는 방법은 UENUM().. 2023. 12. 18.
Unreal Fracture Unreal으로 게임을 개발하던 중 부술 수 있는 Object와 관련해서 공부를 하게 되었다. MegaScan에서 간단한 나무통을 다운 받아서 사용을 했다. Fracture 모드를 들어가는 방법은 왼쪽 상단에 보통은 Selection Mode라고 되어있는 드롭다운을 클릭하면 Fracture 모드로 들어갈 수 있다. 자신이 부술 수 있는 오브젝트로 만들기 위해서는 원하는 오브젝트를 선택하고 New를 클릭하면 된다. 그러면 어느 폴더에 저장할 것인지 나타나고 자신이 원하는 폴더를 선택해서 해당 오브젝트를 넣으면 된다. 이제 실질적으로 사용하는 Fracture에 관련해서 설명을 해보자면 간단하게 Fracture 밑에 있는 모양은 내가 해당 오브젝트를 어떤 알고리즘으로 어떠한 모양으로 부수겠다를 선택하는 것이다.. 2023. 5. 28.
Unreal Socket Unreal을 통해서 게임을 만들 때 캐릭터에게 무기를 주어지게 할 때가 있다. 이때 Socket을 활용하면 편하다. 캐릭터의 Skeleton에 들어가서 Skeleton Tree에서 hand를 검색했을 때의 결과이다. 이때 hand_r을 선택했고 Rotate를 돌려보면 오른쪽 손이 돌아가는 것을 확인할 수 있다. hand_r에서 우클릭 후 Add Socket을 선택하면 Socket이 추가가 된다. 추가된 Socket은 hand_r 하위에 존재하기 때문에 hand_r이 움직이거나 회전하게되면 함께 움직이고 회전한다. 위 사진처럼 오른쪽 손에 넣어줄 장비를 미리 선택해서 확인해볼 수 있다. 위에서는 sword를 선택해서 Socket에 넣어보면 이상하게 나타난다. 우리가 생각한것은 무기를 잡고있는 캐릭터인데 .. 2023. 3. 8.