언리얼 오브젝트 "패키지" = 다양한 오브젝트를 감싼 오브젝트 언리얼 오브젝트 패키지 저번 직렬화 를 통해서 '단일'언리얼 데이터를 저장했었다. 다양한 오브젝트를 저장하기 위해서, 그리고 다양한 데이터(복잡한 계층 구조)를 효과적으로 찾고 관리하기 위해 언리얼 오브젝트 패키지(UPackage)단위로 언리얼 오브젝트를 관리한다. (패키지는 이 외에도 최종 콘텐츠 프로그램, DLC와 같이 확장 콘텐츠에 사용되는 pkg파일등 다양하게 사용되는 단어이다.) 언리얼 오브젝트 패키지 & 애셋 언리얼오브젝트 패키지는 다수의 언리얼 오브젝트를 포함한다. = 모든 언리얼 오브젝트는 패키지에 소속되어 있다. 패키지 바로 하단에 위치한게 Asset 애셋 일반적으로 하나의 패키지에는 하나의 애셋만 저장하는 것을 원칙으로 한다..
직렬화 Serialization 오브젝트나 연결된 오브젝트의 묶음을 바이트 스트림으로 변경하는 과정. 복잡한 데이터를 일렬로 세워버린다.(복잡 → 간단) Object → Byte Stream : 직렬화 (Serialization), Byte Stream → Object : 역직렬화 (Deserialization) 즉, 직렬화로 복잡한 데이터를 간단하게 만들면, 데이터를 전송하거나 맞바꿀 때 1줄로 되어있는 간단한 바이트 스트림으로 변환하고 복구할 수 있다. 직렬화 장점 프로그램의 상태 저장, 복원 가능 (게임 세이브) 객체 정보를 클립보드에 복사해서 다른 프로그램으로 전송가능 네트워크를 통해 프로그램의 상태를 복원할 수 있음 (멀티게임에서 자주 사용) 직렬화된 데이터는 압축과 암호화를 통해서 데이터를 안..
UObject 선언 기본 원칙 언리얼 오브젝트 포인터 : UPROPERTY 선언 메모리 : 가지비컬렉터가 자동으로 관리하도록 위임 언리얼 엔진 자동 메모리 관리 C++ 메모리 관리 문제점 : 저수준으로 메모리 주소에 직접 접근하는 포인터 사용 포인터에 대한 new(할당), delete(해지)를 직접 해줘야함(안하면 이제..오류 투성이 됨) 근데 문제는 이걸 잘 못하면? 상당한 문제가 발생(프로그램 자체를 종료) 메모리 누수 : new하고 delete를 안해서 heap에 그대로 남아있음, 메모리 낭비 (도서관에 책빌리고 반납안함) 댕글링 포인터 (허상포인터) : 이미 delete된 주소를 가리키는 경우 (책반납했는데 책 찾고 있음) 와일드 포인터 : 포인터를 초기화되지 않아서 이상한 주소를 가리킴 C++에..
언리얼 구조체 UStruct : 관련 프로퍼티(변수)를 체계화, 조작할 수 있는 데이터 구조체 https://docs.unrealengine.com/5.3/ko/structs-in-unreal-engine/ 구조체 게임플레이 클래스용 구조체 생성 및 구현에 대한 레퍼런스입니다. docs.unrealengine.com 데이터 저장, 전송에 특화된 가벼운! 객체 하지만 UObject와는 전혀 다르다. 따라서, 프로젝트에서 복잡한 기능은 UObject로 만드는게 맞다. 대부분 GENERATED_BODY 매크로를 선언하게 되는데, 리플렉션, 직렬화 같은 유용 기능을 지원 GENERATED_BODY를 선언한 구조체는 UScriptStruct 클래스로 구현 (UStruct라고 안부르고, UScriptStruct) ..
언리얼 컨테이너 라이브러리 UCL 언리얼 엔진이 제공하는 자료구조 라이브러리(언리얼C++이니까~) 다양한 라이브러리가 있는데, 그중 TArray, TSet, TMap을 가장 유용하게 사용한다. (접두사 T는 Template의 T) C++ STL 언리얼 C++ UCL 1. 범용적 2. 호환성 3. 많은 기능이 있으서 컴파일이 오래 걸림 1. 언리얼 엔진에 특화 2. UObject를 안정적으로 지원 3. 가볍과 게임 제작에 최적화 TArray STL의 vector 처럼 가변 배열(동적배열) 자료구조 장점 데이터가 순차적으로 모여있어 메모리 효과적, 캐시 효율↑ (특히 컴퓨터 사양이 좋아져서 캐시 지역성으로 인한 성능 향상이 중요해졌다.) 임의 데이터 접근빠름(인덱스를 통해서, O(1)), 데이터 순회 가능 ..
약한 결합 방식 : 델리게이트 결합은 종류가 2가지 있다. 강한 결합 클래스들이 서로 의존성을 가짐 = SOLID중 DIP 원칙에서 벗어남 약한 결합 실존 클래스끼리가 아닌 추상적 설계에 의존 = DIP원칙 Person → [출입] ← 카드로 엮인다고 생각 (여기서 출입이 추상적 설계에 해당) 우린 여기서 출입을 인터페이스로 구현할 수도 있다. 다만, 카드의 쓰임이 출입 말고도 인증, 결제등등 더 많은 기능이 추가될때마다 인퍼페이스를 만들기엔 귀찮다.(클래스 선언을 죄다 해줘야하니까) 그래서 등장한게 델리게이트 : 함수형 객체 (기능을 변수로 지정하고, 변수가 함수처럼 실행되는 구조) 언리얼 델리게이트 Delegate (델리게이트)로 C++ 오브젝트 상의 멤버 함수 호출을 일반적이고 유형적으로 안전한 방..
컴포지션 Composition 객체 지향(OOP) 설계는 상속과 컴포지션이 있다. 상속 : 부모-자식 관계, 종속의 개념, Is-A관계 컴포지션 : 어느 객체가 다른 객체를 소유, Has-A관계 컴포지션은 복합적인 기능을 가진 클래스를 효과적으로 설계하는데 유용하다. OOP 4가지 특징 추상화 : 어떤 객체의 공통적, 본질적 특징을 추출하여 정의 abstract class, interface 상속 : 기존에 구현한 클래스를 재활용해서 구현하는 것. (코드의 재사용) 다형성 : 어떤 객체의 속성, 기능이 변화가능 메서드 override, overload 캡슐화 : 클래스 내의 property, method를 하나의 캡슐로 묶어서 외부 접근을 최소화하는 것 public, static, private, pro..
언리얼 C++ 인터페이스 인터페이스 interface 특정 기능, 행동을 구현하는 추상적인 형식. 다형성(같은 이름의 메서드가 다른 동작가능, 오버라이딩), 의존성 분리(약한 결속) 언리얼 엔진에서 인터페이스 예시 : 월드에 배치되는 Actor 오브젝트가 있다. 그리고 Actor중에는 움직이는 오브젝트 Pawn이 있다. Pawn은 길찾기 시스템을 포함해야할 때, 길찾기 시스템은 INavAgentInterface에 구현해서 Pawn이 사용한다. 언리얼 인터페이스 특징 인터페이스 생성시 UInterface : 클래스 타입정보 제공, 런타임에서 인터페이스 구현 여부를 파악하는데 사용 IInterface : 실질적인 설계 및 구현 기존 C++ 인터페이스는 순수가상함수로만 정의하지만, 언리얼은 구현이 가능하다. ..
언리얼 엔진의 근간 : 리플렉션 시스템 언리얼 오브젝트 특징 : 리플렉션 언리얼은 크게 2가지 오브젝트로 나뉜다고 했다. C++ 오브젝트, 언리얼 오브젝트 그 중, 언리얼 오브젝트는 기존 C++에는 없는 모던 객체 지향 시스템의 특징인 생산성을 추가한 기능이다. 그게 바로 리플렉션 (Reflection) 리플렉션 (Reflection) 리플렉션은 프로퍼티 시스템 이라고도 불리며, 프로그램이 실행시간에 자기 자신을 조사하는 기능. ('자기자신' = 에디터, 가비지 콜렉션, 클래스, 구조체, 함수, 멤버 변수, 열거형 등) 리플렉션 설정 방법 (설정방법 이라기 보단 리플렉션 기능을 수행, 리플렉션을 보장한다고 알려준다는게 더 이해하기 쉬울 것 같다.) 리플렉션은 Unreal Header Tool (UDT) ..