c++ - Unreal Engine 4. Different ways to instantiate the object - Stack Overflow
객체를 인스턴스화하는 방법을 네 가지 정도 찾았는데, 제가 이해한 것이 명확한지 모르겠습니다.
NewObject<T>()
함수. 예를 들어 모든 액터 컴포넌트가 될 수 있습니다.
USomeComponent sc = NewObject<USomeComponent>(class);
ConstructObject<T>()
한 가지 더 UObject를 초기화하는 방법...CreateDefaultSubobject<T>()
이 함수를 사용하면 UObject에서 상속된 모든 클래스의 인스턴스를 생성할 수도 있습니다.SpawnActor<T>()
.첫 번째 질문입니다: 이 함수를 한 가지 용도로 사용할 수 있다면 어떤 차이가 있을까요? 언제, 어떻게, 왜 이 함수들을 사용해야 할까요?
이 함수의 차이점을 이해하려면 언리얼 엔진의 오브젝트 모델은 자바스크립트에서와 마찬가지로 오브젝트 프로토타입을 기반으로 한다는 점을 기억해야 합니다. 각 UClass 는 연관된 UObject 클래스의 기본 인스턴스, 즉 Class Default Object(CDO)에 연결되며, 엔진이 초기화될 때 클래스 생성자를 통해 한 번만 먼저 할당된 다음 생성됩니다. CDO는 클래스의 다른 모든 인스턴스가 복사되는 템플릿 역할을 하며, 생성자는 다시 호출되지 않습니다.
즉, 클래스 생성자는 런타임 로직을 포함할 수 없으며, CDO와 해당 프로퍼티를 초기화할 때만 사용해야 합니다. 클래스에 액터 컴포넌트와 같은 서브오브젝트가 포함된 경우, 이 서브오브젝트도 동일한 작업을 수행해야 하므로 자체 기본 오브젝트를 먼저 생성해야 합니다. 그런 다음 오브젝트의 실제 인스턴스화는 엔진이 초기화된 후에 지연되어야 하므로 일반 게임플레이 코드에서 클래스의 새 인스턴스 생성을 요청할 때마다 부모 오브젝트와 모든 서브오브젝트가 각각의 디폴트에서 인스턴스화됩니다.
따라서 오브젝트가 생성될 수 있는 모든 다양한 시나리오를 처리하기 위해서는 오브젝트를 생성하는 여러 가지 방법이 필요합니다.
UObject::CreateDefaultSubobject
는 클래스 생성자에서만 호출할 수 있으며, 서브오브젝트 클래스의 CDO 인스턴스를 생성하고, 외부 클래스를 호출자 오브젝트로 설정하는 등의 작업을 처리합니다. 그런 다음 생성된 객체는 해당 객체 클래스가 인스턴스화될 때 프로퍼티의 기본 객체가 됩니다.NewObject<T>
는 보통 엔진 초기화 후 정상적인 게임플레이 중에 오브젝트를 인스턴스화하는 데 사용되는 함수입니다. 이 함수는 대부분의 시나리오를 처리하기 위한 몇 가지 편의 오버로드를 제공합니다.UWorld::SpawnActor<T>
는 레벨에 지정된 위치와 회전으로 액터를 스폰하고, 콜리전 세팅을 스폰하며, 스폰 가능한 액터 클래스인지 확인하는 편의 메서드이며, NewObject<AActor>
의 래퍼에 불과합니다.ConstructObject
는 NewObject
를 위해 제거되었습니다.자세한 내용은 엔진 소스 코드, 특히 CoreUObject 엔진 모듈의 UObject/UObjectGlobal.cpp 및 UObject/UObjectGlobal.h를 확인하는 것이 좋습니다. 내부적으로 이러한 모든 함수는 궁극적으로 (4.24 기준) 실제 오브젝트 생성을 처리하는 StaticConstructObject_Internal
을 호출합니다.