修改父類組件創建類型或讓父類不創建組件:
通過AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)格式的構造函數,後面採用以下形式:
AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer) :Super(ObjectInitializer.DoNotCreateDefaultSubobject(ACharacter::CapsuleComponentName).SetDefaultSubobjectClass<UMocapSkeletalMeshComponent>(ACharacter::MeshComponentName)) { PrimaryActorTick.bCanEverTick = true; } |
其父類爲ACharacter:
ACharacter::ACharacter(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { ....... CharacterMovement = CreateDefaultSubobject<UCharacterMovementComponent>(ACharacter::CharacterMovementComponentName); if (CharacterMovement) { CharacterMovement->UpdatedComponent = CapsuleComponent; CrouchedEyeHeight = CharacterMovement->CrouchedHalfHeight * 0.80f; } Mesh = CreateOptionalDefaultSubobject<USkeletalMeshComponent>(ACharacter::MeshComponentName); if (Mesh) { Mesh->AlwaysLoadOnClient = true; Mesh->AlwaysLoadOnServer = true; Mesh->bOwnerNoSee = false; Mesh->VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::AlwaysTickPose; Mesh->bCastDynamicShadow = true; Mesh->bAffectDynamicIndirectLighting = true; Mesh->PrimaryComponentTick.TickGroup = TG_PrePhysics; Mesh->SetupAttachment(CapsuleComponent); static FName MeshCollisionProfileName(TEXT("CharacterMesh")); Mesh->SetCollisionProfileName(MeshCollisionProfileName); Mesh->SetGenerateOverlapEvents(false); Mesh->SetCanEverAffectNavigation(false); } } |
ObjectInitializer.DoNotCreateDefaultSubobject 對 父類構造函數中CreateOptionalDefaultSubobject起着作用, 這個函數會根據ObjectInitializer是否設置了DoNotCreateDefaultSubobject決定是否創建給定名稱的子對象,如果設置了,則CreateOptionalDefaultSubobject 返回null,ObjectInitializer.DoNotCreateDefaultSubobject 對CreateDefaultSubobject中不起作用
ObjectInitializer.SetDefaultSubobjectClass 決定了CreateDefaultSubobject和CreateOptionalDefaultSubobject創建指定子對象時,覆蓋其指定的子對象的創建類型,當然覆蓋的類型必須是指定的類型子類型。 如果父類的構造函數已經爲父類的父類設置過SetDefaultSubobjectClass, 則當前SetDefaultSubobjectClass設置的類必須是父類設置的SetDefaultSubobjectClass類的子類。