언리얼 C++ 프로그래밍 75

[언리얼 C++] 위크 포인터 사용법

위크 포인터는 개체에 대한 약한 참조를 저장합니다. 쉐어드 포인터 또는 쉐어드 레퍼런스와 달리 위크 포인터는 참조하는 개체의 소멸을 방지하지 않습니다. 그렇기 때문에 위크 포인터가 참조하는 개체에 액세스하기 전에 쉐어드 포인터로 만들어야 합니다. 이렇게 하면 개체를 사용하는 동안 개체가 계속 존재할 수 있습니다. 1. 선언, 초기화 및 할당 // Allocate a new data object and create a strong reference to it. TSharedRef ObjectOwner = MakeShared(); // Create a weak pointer to the new data object. TWeakPtr ObjectObserver(ObjectOwner); 빈 위크 포인터를 만들거..

[언리얼 C++] 쉐어드 레퍼런스 사용법

쉐어드 레퍼런스는 엔진 시스템 외부의 데이터 개체에 대해 null이 불가능한 스마트 포인터입니다. 즉, 쉐어드 레퍼런스를 재설정하거나 null 개체를 할당하거나 빈 참조를 만들 수 없다는 뜻입니다. 따라서 쉐어드 레퍼런스에는 항상 유효한 개체가 포함되어 있습니다. 쉐어드 레퍼런스와 쉐어드 포인터 중 하나를 선택할때 빈 개체나 null이 가능한 개체가 필요하지 않는 한 쉐어드 레퍼런스가 기본 옵션입니다. 비어 있거나 null이 가능한 참조가 필요한 경우 쉐어드 포인터를 사용해야 합니다. 1. 선언 및 초기화 // Create a shared reference to a new node TSharedRef NewReference = MakeShared(); 쉐어드 레퍼런스를 선언할때는 항상 유효한 데이터 개체..

[언리얼 C++] 쉐어드 포인터 사용법

쉐어드 포인터는 기본적으로 메모리 누수를 방지하고 초기화되지 않은 메모리에 대한 포인터를 방지한다는 점에서 기본 스마트 포인터의 모든 이점을 포함하고 있으며 다음과 같은 추가 기능들도 제공합니다. 공유 소유권 : 여러 쉐어드 포인터가 참조하는 데이터 개체는 참조 카운트가 0이 되지 않는 한 소멸되지 않습니다. 자동 무효화 : 댕글링 포인터에 대한 걱정없이 안전하게 참조할 수 있습니다. 약한 참조 : 위크 포인터는 참조 주기를 깰 수 있습니다. 의도의 표시 : 소유자를 관찰자와 구별하고 무효화할 수 없는 참조를 제공합니다. 쉐어드 포인터에는 주목할 만한 몇가지 기본 특성이 존재합니다. 매우 견고한 신택스 비간섭 스레드 안전 좋은 성능, 메모리 관리 쉐어드 포인터에는 위와 같은 기능들과 특징이 존재하기 때문..

[언리얼 C++] 스마트 포인터 라이브러리 (2)

언리얼 스마트 포인터 라이브러리에 대한 기본 설명은 [언리얼 C++] 스마트 포인터 라이브러리 (1) (tistory.com) 글을 참고하시기 바랍니다. 이 글에서는 스마트 포인터 라이브러리의 부가적인 기능들에 대해 알아보겠습니다. 1. 헬퍼 클래스와 함수 언리얼 스마트 포인터 라이브러리는 스마트 포인터를 보다 쉽고 직관적으로 사용할 수 있도록 다양한 헬퍼 클래스와 함수를 제공합니다. 헬퍼 클래스 설명 TSharedFromThis TSharedFromThis에서 클래스를 파생시키면 AsShared 혹은 SharedThis 함수가 추가됩니다. 이러한 함수들을 통해 오브젝트에 대한 TSharedRef를 구할 수 있습니다. 헬퍼 함수 설명 MakeShared 및 MakeShareable 일반 C++포인터로 쉐..

[언리얼 C++] 스마트 포인터 라이브러리 (1)

언리얼 스마트 포인터 라이브러리는 메모리 할당과 추적의 부담을 해소해주도록 설계된 C++11 스마트 포인터들의 커스텀 구현입니다. 이 구현에는 업계 표준인 쉐어드 포인터, 위크 포인터 그리고 유니크 포인터가 포함되어 있습니다. 또한 null이 불가능한 쉐어드 포인터와 같은 역할을 하는 쉐어드 레퍼런스도 추가되었습니다. 단, 언리얼 오브젝트는 게임 코드에 더 최적화된 별도의 메모리 추적 시스템을 사용하기 때문에 이러한 클래스들은 UObject 시스템과 사용할 수 없습니다. 1. 스마트 포인터 타입 스마트 포인터 타입 설명 Shared Pointers(TSharedPtr) 쉐어드 포인터는 참조하는 오브젝트를 소유하며, 무기한으로 오브젝트의 소멸을 방지하고, 참조하는 쉐어드 포인터 또는 쉐어드 레퍼런스가 없을..

[언리얼 C++] 언리얼 오브젝트 처리 (2)

언리얼 엔진의 오브젝트 처리 시스템에 대한 설명은 [언리얼 C++] 언리얼 오브젝트 처리 (1) (tistory.com) 글을 참고하시기 바랍니다. 이 글에서는 오브젝트 처리 시스템이 제공해주는 기능들에 대해 설명하도록 하겠습니다. 1. 에디터 통합 UObject와 UProperty는 에디터에 인식되며, 에디터는 별도의 코드를 작성할 필요 없이 해당 값들을 자동으로 노출시킬 수 있습니다. 이는 선택적으로 블루프린트 비주얼 스크립팅 시스템으로의 통합이 가능합니다. 그리고 변수와 함수의 노출 및 접근 여부를 제어할 수 있는 여러가지 옵션이 존재합니다. 프로퍼티 지정자 효과 BlueprintCallable 멀티캐스트 델리게이트 전용입니다. 프로퍼티를 노출시켜야 블루프린트 코드에서 호출할 수 있습니다. Blue..

[언리얼 C++] 언리얼 오브젝트 처리 (1)

언리얼 엔진에는 내부적으로 게임 오브젝트를 처리하는 견고한 시스템이 존재합니다. 이러한 오브젝트 처리 시스템의 도움을 받아 더욱 쉽고 간편하게 오브젝트를 관리할 수 있습니다. 제작한 클래스에서 오브젝트 처리 시스템의 기능들을 사용할려면, 시스템이 해당 클래스를 인식하게 해서 접근할 수 있도록 만들어줘야 합니다. 클래스는 UCLASS() 매크로, 프로퍼티는 UPROPERTY() 매크로, 함수는 UFUNCTION() 매크로를 사용하여 선언을 해주면 오브젝트 처리 시스템에서 인식하여 접근할 수 있게 됩니다. 이제 오브젝트 처리 시스템이 오브젝트에 접근하여 수행하는 여러가지 기능들에 대해 설명하도록 하겠습니다. 1. 자동 프로퍼티 초기화 UObject는 생성자 호출 전 초기화시 자동으로 0으로 채워집니다. 클래..

[언리얼 C++] TSubclassOf 템플릿 클래스

TSubclassOf는 UClass 타입의 안전성을 보장해주는 템플릿 클래스입니다. 예를 들어 디자이너가 파티클 타입을 지정하도록 해주는 클래스를 제작 중이라 가정합시다. UPROPERTY(EditDefaultsOnly, Category=Particle) UClass* ParticleType; 위 예제 코드처럼 그냥 UPROPERTY 타입의 UClass를 만든 다음 디자이너에게 UParticleSystemComponent의 파생 클래스만 할당하라고 가이드할 수 있습니다. 하지만 이렇게 하면 실수로 다른 클래스를 할당하는 것을 막을 수 없습니다. 이러한 상황에서, TSubclassOf 템플릿을 사용하여 클래스 할당의 선택지를 제한시킬 수 있습니다. UPROPERTY(EditDefaultsOnly, Cate..

[언리얼 C++] 컨테이너 클래스 TSet 사용법(연산자, 슬랙, DefaultKeyFuncs 지정)

TSet 컨테이너 클래스의 기본적인 설명과 간단한 사용법은 [언리얼 C++] 컨테이너 클래스 TSet 사용법(생성 및 삽입, 반복처리) (tistory.com) 글을 참고하시기 바랍니다. 이 글에서는 TSet 컨테이너 클래스의 연산자, 슬랙, DefaultKeyFuncs에 대해 알아보겠습니다. 1. TSet 컨테이너 연산자 TSet NewSet = FruitSet; NewSet.Add(TEXT("Apple")); NewSet.Remove(TEXT("Pear")); // FruitSet = { "Pear", "Kiwi", "Melon", "Mango", "Orange", "Grapefruit" } // NewSet = { "Kiwi", "Melon", "Mango", "Orange", "Grapefruit..

[언리얼 C++] 컨테이너 클래스 TSet 사용법(쿼리, 엘리먼트 제거, 소팅)

TSet 컨테이너 클래스의 기본적인 설명과 간단한 사용법은 [언리얼 C++] 컨테이너 클래스 TSet 사용법(생성 및 삽입, 반복처리) (tistory.com) 글을 참고하시기 바랍니다. 이 글에서는 TSet 컨테이너 클래스의 쿼리, 엘리먼트 제거, 소팅 기능에 대해 알아보겠습니다. 1. TSet 컨테이너 쿼리 기능 int32 Count = FruitSet.Num(); // Count = 8 현재 TSet 컨테이너에 있는 엘리먼트 개수를 알아내려면 Num() 함수를 호출하면 됩니다. bool bHasBanana = FruitSet.Contains(TEXT("Banana")); // bHasBanana = true bool bHasLemon = FruitSet.Contains(TEXT("Lemon")); ..