UE4 C++:Actor与Component的创建、销毁

这篇具有很好参考价值的文章主要介绍了UE4 C++:Actor与Component的创建、销毁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Actor的创建与销毁

创建

UClass*

TSubclassOf

SpawnActor()

销毁

直接销毁:Destroy()

设置生命周期

Component 的创建与销毁

创建

构造函数创建:CreateDefaultSubobject

Runtime创建:NewObject、RegisterComponent()

加载资源

FObjectFinder构造函数加载资源

LoadObject加载资源

设置组件层级关系

销毁组件

各类组件创建与初始化

UStaticMenshComponent

UBoxComponent

USphereComponent

USkeletalMeshComponent

USpringArmComponent和UCameraComponent

UPhysicsThrusterComponent

UTexRenderComponent

UProjectileMovementComponent


Actor的创建与销毁

创建

UClass*

TSubclassOf<T>

SpawnActor()

UPROPERTY(EditAnywhere, Category = "init")
	UClass* bullet0; // 取类

UPROPERTY(EditAnywhere, Category = "init")
	TSubclassOf<Amissile> bullet; //取Amissile类及其派生类

UPROPERTY(EditAnywhere, Category = "init")
	Amissile* bullet2; // 取类的实例

销毁

直接销毁:Destroy()

MissileIns->Destroy();

设置生命周期

构造函数设置InitialLifeSpan

InitialLifeSpan = 8.0f;

BeginPlay里使用SetLifeSpan()设置声明周期

Component 的创建与销毁

创建

构造函数创建:CreateDefaultSubobject<T>

UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* paddle1;

paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("paddle1"));

Runtime创建:NewObject<T>、RegisterComponent()

Mesh = NewObject<UStaticMeshComponent>(this,TEXT("MyMesh"));
Mesh->SetupAttachment(root);
Mesh->RegisterComponent(); // 注册渲染/物理状态
// 可配合 LoadObject() 

 

加载资源

FObjectFinder构造函数加载资源

  • ConstructorHelpers::FObjectFinder<T>
static ConstructorHelpers::FObjectFinder<UStaticMesh> paddleMesh(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
if (paddleMesh.Succeeded())
{
	paddle1->SetStaticMesh(paddleMesh.Object);
}

LoadObject加载资源

UStaticMesh* bodyMesh = LoadObject<UStaticMesh>(this,TEXT("StaticMesh'/Game/Demo_Drone/SM/drone.drone'"));
if (bodyMesh)
{
	body->SetStaticMesh(bodyMesh);
}

设置组件层级关系

  • 设置根组件RootComponent或者SetRootComponent()
  • SetupAttachment
  • AttachToComponent
RootComponent = outCollison;
SetRootComponent(outCollison);

paddle1->SetupAttachment(body, TEXT("paddle1"));
paddle2->SetupAttachment(body, TEXT("paddle2"));
paddle3->AttachToComponent(body, FAttachmentTransformRules::KeepRelativeTransform, TEXT("paddle3"));
paddle4->AttachToComponent(body, FAttachmentTransformRules::KeepRelativeTransform, TEXT("paddle4"));

childSceneComponent->AttachToComponent(root, FAttachmentTransformRules::SnapToTargetIncludingScale);

销毁组件

  • DestoryComponent()
  • UnregisterComponent()使用RegisterComponent创建,需要先注销再销毁
Mesh->UnregisterComponent();
Mesh->DestroyComponent();

各类组件创建与初始化

UStaticMenshComponent

paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("paddle1"));
auto paddleMesh = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
if (paddleMesh.Object != nullptr)
{
	paddle1->SetStaticMesh(paddleMesh.Object);
}

UBoxComponent

outCollison = CreateDefaultSubobject<UBoxComponent>(TEXT("outCollison"));
outCollison->SetBoxExtent(FVector(60, 60, 15));
outCollison->SetSimulatePhysics(true);
outCollison->SetCollisionProfileName(TEXT("WorldDynamic"));
outCollison->SetCollisionEnabled(ECollisionEnabled::NoCollision);

USphereComponent

sphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));
sphereComp->InitSphereRadius(5.0f);
sphereComp->SetCollisionProfileName(TEXT("WorldDynamic"));
sphereComp->SetGenerateOverlapEvents(true);
sphereComp->OnComponentBeginOverlap.AddDynamic(this, &Amissile::Overlaphandler);
// overlap 函数绑定
void Amissile::Overlaphandler(UPrimitiveComponent* OverlappedComponent,
				AActor* OtherActor, 
				UPrimitiveComponent* OtherComp,
				int32 OtherBodyIndex,
				bool bFromSweep,
				const FHitResult& SweepResult){}

USkeletalMeshComponent

SkeletalMeshComp = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMeshComp"));
SkeletalMeshComp->SetGenerateOverlapEvents(true);
SkeletalMeshComp->SetSimulatePhysics(true);

USpringArmComponent和UCameraComponent

springArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
springArmComp->SetupAttachment(RootComponent);
cameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
cameraComp->SetupAttachment(springArmComp);

UPhysicsThrusterComponent

upThrusterComp = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("upThrusterComp"));
upThrusterComp->SetupAttachment(RootComponent);
upThrusterComp->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(FVector(-this->GetActorUpVector())));
upThrusterComp->ThrustStrength = 980.0f;
upThrusterComp->SetAutoActivate(true);

UTexRenderComponent

CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
CountdownText->SetHorizontalAlignment(EHTA_Center);
CountdownText->SetWorldSize(150.0f);
CountdownText->AttachTo(RootComponent);
CountdownTime = 3;
CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));

UProjectileMovementComponent

 文章来源地址https://www.toymoban.com/news/detail-410272.html

projectileMovementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("projectileMovement"));
projectileMovementComp->InitialSpeed = 500.0f;

到了这里,关于UE4 C++:Actor与Component的创建、销毁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【UE4】查找Actor的方法(蓝图)

    Get All Actors Of Class :通过给定的对象模板将场景中与之匹配的对象进行查找,并返回查找到的所有对象。 Get All Actors with Interface :通过给定的接口将场景中与之匹配的对象进行查找,并返回查找到的所有对象。 Get All Actors with Tag :通过给定的标签将场景中与之匹配的对象进

    2024年02月12日
    浏览(46)
  • UE4获取Actor下面的组件

    在Actor中包含了很多的网格体或者粒子组件,如何获取它们?可以通过一下函数函数 aaa

    2024年02月14日
    浏览(60)
  • ue4 合并静态网格体(合并Actor)

    ue4 合并静态网格体(合并Actor)。 1.选择actor 2 合并

    2024年02月13日
    浏览(44)
  • UE4 Physics Constraint Actor 实现钟摆效果

    放入场景,然后将一个球体放入场景 选择小球 将小球改为Movable 选择模拟物理,并将小球移除平衡点 就实现了

    2024年02月09日
    浏览(49)
  • UE4点击UI在场景中生成actor

    1.创建一个spawnMesh(actor),添加一个static组件,写入一个设置staticMesh的函数,暴露出new mesh。 2.创建结构体Create2   3.创建wid1和wid2(widget)。 wid1:  写一个set style事件,用变量icon来设置image_icon,变量name设置text block。这两个变量需要暴露出去。  创建wid之前完成set style事件  写

    2024年02月11日
    浏览(40)
  • 观察UE4里“在外部存储Actor”功能的基础行为

    一般情况下,Actor保存于关卡文件中。 但是,如果将Actor的 packaging mode 设置为 External : 则此Actor就会存储在另一个文件而非关卡文件中。 本篇目标是: 观察此功能的基础行为 观察外部文件的路径名规则 对于一般的Actor(默认 packaging mode 为 Internal )。修改此Actor会标脏关卡

    2024年02月05日
    浏览(44)
  • UE4中C++动态创建材质的几种方法Material

    第一种方式:         1、首先加载材质,代码如下: UMaterialInterface* Material = LoadObjectUMaterialInterface(nullptr, TEXT(\\\"Material\\\'/Game/Materials/ColorMaterial.ColorMaterial\\\'\\\"));         2、然后调用CreateDynamicMaterialInstance创建静态材质实例,如下: UMaterialInstance * DynamicMaterial = UKismetMaterialLibr

    2024年02月08日
    浏览(46)
  • UE4 c++保存asset实例(含创建自定义Asset类)

    该文档的目标是创建一个uasset文件,用来保存类的实例,而不是蓝图类,类似存储在内容中的图片。 该文档是实践记录,具体理论查看参考。 如果要通过C++创建蓝图类,可以先新建C++类,然后在UE编辑器中有 C++ Classes 文件夹,进入后找到自己新建的C++类,右键创建蓝图类即

    2024年02月03日
    浏览(45)
  • ue4/5蓝图与c++混用基础入门的基础操作(适合有蓝图基础和c++基础的新手,创建自己的蓝图)

            首先是最开始的创建项目,用c++模式进行创建。         ue4:         ue5:  创建之后,两个都会自动为你打开vs,不过ue4.26要的是vs2019,ue5要的是vs2022,有时候打不开是缺少一些东西,这些东西在csdn里面可以查到,作者就不细讲了。 在ue5(4是一样的)中,我们可

    2023年04月12日
    浏览(52)
  • 【UE】从UI中拖拽生成物体_ue 从ui拖动创建actor

    打开“BP_UIHUD”,在事件图表中添加如下节点,使得控件蓝图“WBP_Main”能够被渲染到视口上 接下来制作拖拽部分的UI,新建两个控件蓝图,这里分别命名为“WBP_DragUI”和“WBP_DragActor”,一个表示通过拖拽出图片来生成模型,另一个表示直接拖出模型 先打开“WBP_DragUI”,设

    2024年04月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包