虚幻引擎 Event Destroyed 节点

一、Event Destroyed 基础核心说明

1. 定义与触发规则

  • Event Destroyed:Actor主动调用 Destroy Actor 销毁时,引擎最后一步自动执行的事件回调

图片[1]_虚幻引擎 Event Destroyed 节点_虚幻引擎

  • 触发条件:仅执行Destroy Actor(Self / 其他 Actor)才会触发;关卡切换、游戏结束、自动生命周期到期、组件销毁均不触发
  • 执行顺序:Event EndPlayEvent Destroyed(EndPlay 会带销毁原因枚举,Destroyed 无参数)
  • 官方提示:该节点未来版本会逐步废弃,优先推荐Event EndPlay做资源清理;但销毁专属收尾(加分、爆特效)仍可用 Event Destroyed
  • 禁止操作:在 Event Destroyed 内部再次调用 Destroy Actor,会无限递归导致引擎崩溃

2. Event Destroyed VS Event EndPlay 对比

表格
节点 触发时机 携带参数 适用场景
Event Destroyed 仅手动 Destroy Actor 时触发 无输出参数 怪物死亡加分、销毁爆粒子、销毁通知其他蓝图
Event EndPlay Actor 离开世界(销毁 / 切关卡 / 退出游戏)全场景触发 EndPlayReason 枚举(区分销毁 / 切图) 统一资源清理、关闭音效、移除 UI 绑定

二、案例 1:基础案例 —— 怪物销毁时加分 + 播放爆炸特效(完整操作步骤)

前置准备

  1. 打开 UE5,新建第三人称蓝图项目,启用初学者内容包
  2. 内容浏览器右键 → 蓝图类 → 父类选Actor,命名BP_Enemy(怪物蓝图)

步骤 1:创建怪物基础组件

    1. 双击打开BP_Enemy蓝图编辑器
    2. 左侧「组件」面板:
      • 默认DefaultSceneRoot保留
      • 点「添加组件」→ 静态网格体,命名Mesh_Enemy
      • 选中Mesh_Enemy,右侧细节面板:静态网格体选立方体 / 怪物模型
      • 添加盒体碰撞组件,命名Collision_Hit,缩放包裹模型;碰撞预设设Pawn,勾选「模拟生成命中事件」
碰撞命中设置
  1. 添加变量(左上角「我的蓝图」→ 变量 +):
    • 变量 1:KillScore,整数,默认值 10(击杀得分)
    • 变量 2:ExplosionVFX,粒子系统引用,拖入爆炸粒子资源
    • 变量 3:GameScore,整数,可编辑实例,公开(全局分数)

步骤 2:添加 Event Destroyed 节点并编写销毁逻辑

    1. 切换到「事件图表 Event Graph」空白处右键搜索 Event Destroyed,拖入画布
  1. 依次添加以下节点并连线:
    1. Print String:字符串填怪物已销毁,触发Event Destroyed,用于调试
    2. Spawn Emitter at Location(生成粒子)
      • 发射器引脚连接ExplosionVFX变量
      • 位置引脚:拖 Self → Get Actor Location
      • 旋转:Get Actor Rotation
    3. Add Integer(加分):A=GameScore,B=KillScore
    4. Set GameScore:输入值连接 Add Integer 输出
  2. 完整连线逻辑:

    Event Destroyed → Print String → Spawn Emitter at Location → Set GameScore

步骤 3:添加销毁触发逻辑(玩家碰撞销毁怪物)

  1. 右键搜索On Component Hit(选中盒体碰撞组件后生成)
  2. 添加Branch分支节点:
    • 条件:Other ActorCast To ThirdPersonCharacter(判断碰撞物体是玩家)
  3. Branch-True输出连接Destroy Actor(目标 = Self)
逻辑:玩家撞到怪物 → 销毁自身 → 自动执行 Event Destroyed 加分 + 爆特效
碰撞销毁连线示意

步骤 4:编译保存 + 关卡测试

  1. 蓝图顶部点「编译」→「保存」
  2. 内容浏览器把BP_Enemy拖入关卡地面
  3. 点击顶部「运行」进入游戏,操控玩家撞击怪物
  4. 效果验证:
    • 怪物消失、原地播放爆炸粒子
    • 屏幕打印调试文字
    • GameScore 分数自动 + 10

三、案例 2:跨蓝图监听 —— 外部 Actor 检测目标销毁(高级用法)

需求:生成怪物的生成器蓝图,当怪物被销毁时,生成器自动刷新计数

操作步骤

  1. 新建蓝图 Actor BP_Spawner(怪物生成器)
  2. BP_Spawner 事件图表添加Event BeginPlay
  3. 添加变量:TargetEnemy(Actor 引用,公开,关卡中指定怪物)
  4. 绑定 Destroyed 委托监听:
    • TargetEnemy引脚 → 搜索Bind Event to Destroyed
    • 新建自定义事件OnEnemyDestroy作为回调
  5. OnEnemyDestroy内添加逻辑:打印「怪物已被销毁,剩余怪物 – 1」,修改计数变量
  6. 关键规则:绑定必须写在 BeginPlay 里,不能写在销毁事件内部,否则绑定失效

完整监听逻辑

  1. Event BeginPlay → Bind Event to Destroyed(目标 = TargetEnemy,事件 = OnEnemyDestroy)
  2. OnEnemyDestroy → Print String + 修改怪物计数变量

四、Event Destroyed 常见坑与解决方案

坑 1:Event Destroyed 完全不触发

  1. 原因 1:销毁不是Destroy Actor触发(生命周期 SetLifeSpan 到期、切关卡、组件删除)解决:改用Event EndPlay,通过EndPlayReason == Actor Destroyed判断
  2. 原因 2:网络多玩家未做权限校验解决:销毁前加Switch Has Authority,仅服务器执行 Destroy Actor
  3. 原因 3:Actor 被分离、父组件销毁,自身未调用 Destroy解决:分离后手动调用 Destroy Actor (Self)

坑 2:Event Destroyed 内生成粒子 / 音效不显示

原因:Actor 销毁后自身资源失效,生成特效需要世界坐标、不依附 Self

解决:Spawn Emitter at Location,不要用Spawn Emitter Attached(依附自身会随销毁同步删除)

坑 3:引擎崩溃

原因:在 Event Destroyed 内部再次调用 Destroy Actor (Self),无限递归

解决:Destroy 逻辑全部移到销毁前(碰撞 / 伤害事件),Destroyed 只做收尾显示逻辑

坑 4:销毁后分数不保存、变量不更新

原因:Event Destroyed 执行时 Actor 即将被回收,尽量在 Destroy 前执行数值修改,Destroyed 仅做表现

五、Event Destroyed 与 Event EndPlay 通用替代方案(官方推荐)

如果需要兼容所有销毁场景,优先使用 Event EndPlay 替代 Event Destroyed,判断逻辑:
  1. 拖入Event EndPlay(自带 EndPlay Reason 输出枚举)
  2. 添加Switch Enum节点,枚举类型EEndPlayReason
  3. 分支Actor Destroyed内写原 Event Destroyed 的加分、粒子逻辑
优势:同时覆盖手动 Destroy、生命周期自动销毁,兼容性更强,无废弃风险

六、控制台调试指令(测试销毁事件)

运行游戏时按~打开控制台:
  1. obj garbage:强制垃圾回收,加速 Actor 销毁验证
  2. destroyall BP_Enemy:一键销毁所有怪物,批量触发 Event Destroyed
  3. list actors:查看当前世界所有 Actor,验证是否成功销毁

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容