Actor的生成与销毁

创建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; // 取类的实例
    GetWorld()->SpawnActor<Amissile>(bullet0, GetActorTransform());
    
    GetWorld()->SpawnActor<Amissile>(bullet, body->GetSocketTransform("FirePos"));
    
    Amissile* MissileIns = GetWorld()->SpawnActor<Amissile>(bullet2->StaticClass(), GetActorTransform());

销毁

直接销毁

  • 使用Destroy()

    MissileIns->Destroy();

设置生命周期

  • 构造函数设置 InitialLifeSpan

    InitialLifeSpan = 8.0f;
  • BeginPlay 里使用 SetLifeSpan() 设置生命周期

    InitialLifeSpan = 8.0f;

Component 的创建与销毁

创建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 加载资源

  • LoadObject<T>

    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);

销毁组件

  • DestroyComponent()

  • UnregisterComponent() 使用 RegisterComponent 创建,需要先注销再销毁

    Mesh->UnregisterComponent();
    Mesh->DestroyComponent();

各类组件创建与初始化

UStaticMeshComponent

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);

UTextRenderComponent

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)));
projectileMovementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("projectileMovement"));
projectileMovementComp->InitialSpeed = 500.0f;

【UE4 C++】Actor 与 Component —— 创建、销毁的更多相关文章

  1. 《Inside UE4》-2-GamePlay架构(一)Actor和Component

    <Inside UE4>-2-GamePlay架构(一)Actor和Component     <Inside UE4>-2-GamePlay架构(一)Actor和Compon ...

  2. UE4 Tutorial - Custom Mesh Component 用于绘制自定义网格的插件CustomMeshComponent

    UE4 中用于绘制自定义网格的插件CustomMeshComponent. 转载: UE4 Tutorial - Custom Mesh Component   Over the last few w ...

  3. Object-C 对象 (创建/销毁 对象)-- 笔记

    创建/销毁 对象: Dog *dog = [Dog alloc]; //  通过alloc创建dog一个这样的对象, alloc相对于C语言中的new // *号既表示指针,也表示引用 初始化构造函数 ...

  4. 类定义,创建/销毁OC对象

    类定义 1 OC类分为2个文件,一个是.h文件,一个是.m文件: 2 .h文件存放类.函数声明: 3 .m文件类的具体实现: 4 类声明使用关键字@interface.@end来声明: 5 类实现使用 ...

  5. java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56)

    在JavaWeb中的监听器分类 在Javaweb中存在三个被监听对象: HttpServletRequest HttpSessoin ServletContext 监听者 被监听者 监听到事件对象 H ...

  6. <转载> UE4的Actor类C++简单尝试

    原文链接:   简书小小酥XX https://www.jianshu.com/p/2bcc80f0e789 一开始我用了一段时间UE4,发现如果用蓝图系统真的不太适合我的风格.因为之前一直都是用Un ...

  7. unity3d通过代码动态创建销毁游戏对象

    只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...

  8. Vue组件component创建及使用

    组件化与模块化的区别 什么是组件:组件的出现,就是为了拆分Vue实例的代码量,能够让我们以不同的组件,来划分不同的功能模块 ,将来我们需要什么功能,就可以去调用对应的组件即可 组件化与模块化的不同: ...

  9. [Java] 一、对象的创建 & 销毁

    *1.考虑静态工厂方法(static factory method)代替构造器?!优势?不足? 服务提供者架构: 1.服务接口(Service Interface) -- 提供者实现的: 2.提供者注 ...

随机推荐

  1. Python - repr()、str() 的区别

    总的来说 str():将传入的值转换为适合人阅读的字符串形式 repr():将传入的值转换为 Python 解释器可读取的字符串形式 传入整型 # number resp = str(1) print ...

  2. openswan中DH算法说明

    Author       : Email         : vip_13031075266@163.com Date          : 2021.01.11 Copyright : 未经同意不得 ...

  3. 整合ehcache缓存

    一.分布式集群,多态服务器相同的代码,均衡压力: 二. 1.导包,ehcache适用mybatis的jar包: 2.映射配置文件中配置: 3.ehcache配置文件 4.使用代码和mybatis自带的 ...

  4. 【第五篇】-Maven 构建配置文件之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 构建配置文件 构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值. 使用构建配置文件,你可以为不同的环境,比如说生产环境(Production)和开发(Deve ...

  5. 导出excel、word、csv文件方法汇总

    http://www.woaic.com/2012/06/64 excel文件主要是输出html代码.以xls的文本格式保存文件. 生成excel格式的代码: /// <summary> ...

  6. C++ 飞行游戏

    源代码: #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace ...

  7. PHP中的数据库连接持久化

    数据库的优化是我们做web开发的重中之重,甚至很多情况下其实我们是在面向数据库编程.当然,用户的一切操作.行为都是以数据的形式保存下来的.在这其中,数据库的连接创建过程有没有什么可以优化的内容呢?答案 ...

  8. C# lambda 实现 Ascii 排序

    var dir = new Dictionary<string, string>();            dir.Add("channelId", "1& ...

  9. 深入剖析RocketMQ源码-NameServer

    一.RocketMQ架构简介 1.1 逻辑部署图 (图片来自网络) 1.2 核心组件说明 通过上图可以看到,RocketMQ的核心组件主要包括4个,分别是NameServer.Broker.Produ ...

  10. Jmeter系列(10)- Linux环境安装之Jmeter下载配置

    step-1下载 我是之前windows有,就直接copy到Linux系统了 step-2Jmter放到local目录 mv apache-jmeter-5.2.1 /usr/local/ step- ...