ue4 修改父類組件創建類型或讓父類不創建組件

修改父類組件創建類型或讓父類不創建組件

 

通過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 返回nullObjectInitializer.DoNotCreateDefaultSubobject 對CreateDefaultSubobject中不起作用

ObjectInitializer.SetDefaultSubobjectClass 決定了CreateDefaultSubobjectCreateOptionalDefaultSubobject創建指定子對象時,覆蓋其指定的子對象的創建類型,當然覆蓋的類型必須是指定的類型子類型。 如果父類的構造函數已經爲父類的父類設置過SetDefaultSubobjectClass, 則當前SetDefaultSubobjectClass設置的類必須是父類設置的SetDefaultSubobjectClass類的子類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章