当前位置: 首页 > news >正文

UE5销毁Actor,移动Actor,简单的空气墙的制作

1.销毁Actor

        1.Actor中存在Destory()函数和Destoryed()函数

        Destory()函数是成员函数,它会立即标记 Actor 为销毁状态,并且会从场景中移除该 Actor。它会触发生命周期中的销毁过程,调用 Destroy() 后,Actor 立即进入销毁过程。具体来说,它会开始执行 BeginDestroy()EndDestroy(),并且会销毁 Actor 本身及其所有组件

        Destroyed()函数是虚函数(或者是事件函数),它在 Actor 被销毁后被自动调用。你可以在 Destroyed() 中执行一些销毁后的清理工作,Destroyed() 是一个回调函数,当 Actor 销毁过程完成时(通常是调用 Destroy() 后)会被自动调用。可以重写Destoryed()函数完成Actor销毁后的一些操作

        2.Actor在什么时候会被完全销毁

        1.调用 Destroy() 时,Unreal Engine 不会立即释放 Actor 的内存,而是:

  • 标记 Actor 为待销毁状态 (bPendingKill = true)。
  • 移除 Actor 及其组件,停止它的 Tick 和物理模拟。
  • 触发 EndPlay() 事件(如果 Actor 还在 BeginPlay() 之后)。
  • 触发 Destroyed() 事件,让子类可以在销毁前执行额外逻辑。
  • Actor 从世界中移除,停止 Tick 和物理模拟

         2.调用Destroyed()

  • 允许 Actor 在销毁前执行自定义逻辑

        3.UE中的GC机制

        当前阶段会释放掉Actor的内存。

2.移动Actor

        1.使用MoveComponent()函数,

void ASpawnActor::SetActorLocation()
{UStaticMeshComponent* RootComp = Cast<UStaticMeshComponent>(GetRootComponent());if (RootComp){// 定义你想要移动的偏移量FVector Offset(0.f, 0.f, -10.f);  // 向Z轴移动10单位// 使用MoveComponent来平滑移动组件RootComp->MoveComponent(Offset, FRotator::ZeroRotator, true);//UE_LOG(LogTemp, Warning, TEXT("move ment component"));}
}

        我当前的RootComponent是UStaticMeshComponent类型的,如果使用SetupAttachment附加到原本的RootComponent也可以实现,MoveCompoennt是USceneComponent类中的成员函数,只要继承自这个类都可以调用MoveCompoennt函数

        2.创建一个UMoveMentComponent的组件

        创建C++类ActorMovementComponent继承自MoveMentComponent,在,Actor中定义指针,在Actor的构造中初始化这个指针

UPROPERTY(VisibleAnywhere, Category = "Move");
UActorMovementComponent* ActorMovementComponent;ActorMovementComponent = CreateDefaultSubobject<UActorMovementComponent>(TEXT("Move"));

ActorMovementComponent类中实现(TickComponent是虚函数,重写一份,记得)

void UActorMovementComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{//一定记得要写这行Super::TickComponent(DeltaTime, TickType, ThisTickFunction);// 速度和加速度可以从Actor 中设置,也可以默认// 更新速度,应用加速度FVelocity += Acceleration * DeltaTime;// 限制最大速度if (FVelocity.Size() > MaxSpeed){FVelocity = FVelocity.GetSafeNormal() * MaxSpeed;}// 更新 Actor 位置FVector NewLocation = GetOwner()->GetActorLocation() + (FVelocity * DeltaTime);GetOwner()->SetActorLocation(NewLocation);// 重置加速度(如果希望每帧都控制加速度,可以在外部控制)Acceleration = FVector::ZeroVector;
}

3.制作一个简单的空气墙

        1.创建一个UBoxComponent设置SetVisibility(false)将可视性为变成false,设置碰撞类型

SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
SetCollisionResponseToAllChannels(ECR_Block);  // 使得所有物体都会被阻挡
SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera,ECollisionResponse::ECR_Ignore);

        2.创建对应蓝图,拖拽到场景中,调整大小。

http://www.lryc.cn/news/542695.html

相关文章:

  • 【python】提取word\pdf格式内容到txt文件
  • 002简单MaterialApp主题和Scaffold脚手架
  • jdk21下载、安装(Windows、Linux、macOS)
  • Baklib知识中台引领服务智能化
  • Spring源码分析の循环依赖
  • 检查SSH安全配置-关于“MaxStartups参数”
  • 某查”平台请求头反爬技术解析与应对
  • MOE结构解读和deepseek的MoE结构
  • LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践
  • 基于C++“简单且有效”的“数据库连接池”
  • 为什么要将PDF转换为CSV?CSV是Excel吗?
  • Redis 集群的三种模式:一主一从、一主多从和多主多从
  • 面试题——简述Vue 3的服务器端渲染(SSR)是如何工作的?
  • 2.25DFS和BFS刷题
  • C语言基本知识------指针(4)
  • 【OMCI实践】ONT上线过程的omci消息(六)
  • C语言(13)------------>do-while循环
  • 腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票
  • HybridCLR+Adressable+Springboot热更
  • 电脑连接示波器显示波形
  • 监听其他音频播放时暂停正在播放的音频
  • 小熊猫C++安装EasyX最新教程
  • 安装VM和Centos
  • git 命令 设置别名
  • React + TypeScript 全栈开发最佳实践
  • springboot志同道合交友网站设计与实现(代码+数据库+LW)
  • 防火墙双机热备---VRRP,VGMP,HRP(超详细)
  • MQTT实现智能家居------4、在Linux上运行MQTT
  • VMware建立linux虚拟机
  • 大模型文集开篇稿