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类的子类。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值