분류 전체보기 121

[언리얼 C++] UFunction 선언

1. UFunction 선언 언리얼 엔진에서 함수는 두가지 기본 형태가 존재합니다. 바로 일반 C++ 함수 또는 UFunction입니다. 일반 C++ 함수 및 UFunction 둘다 클래스 헤더 파일에 선언됩니다. 일반 C++ 함수를 선언할때는 표준 C++ 문법을 사용합니다. 그에 반해, UFunction은 특수 문법을 사용하여 선언하며, 함수 지정자를 통해 선언에 함수 관련 추가 정보를 설정할 수 있습니다. UFUNCTION([specifier, specifier, ...], [meta(key=value, key=value, ...)]) ReturnType FunctionName([Parameter, Parameter, ...]) UFunction은 C++ 구현이 있고, C++ 코드 안에서 호출할 수 ..

[언리얼 C++] 게임플레이 클래스 구현

모든 게임플레이 클래스는 클래스 헤더(.h) 파일에 GENERATED_BODY() 매크로를 작성해줘야 제대로 구현됩니다. 헤더 파일은 클래스와 클래스에 속한 모든 변수와 함수를 정의하며, 파일명은 구현중인 클래스 이름에서 A 또는 U 접두사를 빼는 것입니다. 즉, AActor 클래스에 대한 헤더 파일은 Actor.h입니다. 이와 같이 클래스 소스(.cpp) 파일명도 동일하게 작성하는 것이 좋습니다. Actor.h에 대한 구현부 소스 파일은 Actor.cpp가 될 것입니다. 에디터 내 "C++ 클래스 추가" 메뉴 옵션으로 생성된 클래스에 대해서는 자동으로 처리됩니다. 소스(.cpp) 파일은 C++ 클래스 선언을 포함하는 헤더(.h) 파일을 포함해야 하는데, 이 파일은 보통 자동 생성되지만 수동 생성할 수도..

[언리얼 C++] 게임플레이 클래스 생성

언리얼 엔진의 모든 게임플레이 클래스는 클래스 헤더(.h) 파일과 클래스 소스(.cpp) 파일로 이루어져 있습니다. 클래스 헤더에는 클래스와 그 멤버, 즉 변수와 함수에 대한 선언이 들어 있으며, 클래스 소스에는 함수의 구현을 통한 정의가 들어있습니다. 언리얼 엔진의 클래스에는 표준화된 작명 규칙이 있어서 클래스 이름의 첫글자, 다른 말로 접두사만 봐도 클래스의 종류를 바로 알 수 있습니다. 접두사 의미 A 스폰 가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 이들은 Actor로 월드에 바로 스폰 가능합니다. U 모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 월드에는 바로 인스턴싱할 수 없으며, Actor에 속해야 합니다. 보통 Components와 같은 오브젝트입니다. 위 표는 게..

[언리얼 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으로 채워집니다. 클래..