如何在Unity脚本中获取VFX的生命周期?
获取Unity VFX生命周期的实现方法
要在脚本中控制或获取Unity VFX的生命周期,核心依赖VisualEffect类(位于UnityEngine.VFX命名空间),以下是具体的实现方式:
一、获取基础生命周期参数
- 获取VFX主序列总时长:使用
mainDuration属性,返回主序列的单次播放时长(单位:秒):float totalDuration = vfx.mainDuration; - 判断VFX是否正在播放:通过
isPlaying属性直接获取状态:bool isVFXPlaying = vfx.isPlaying; - 获取当前已播放时长:使用
time属性获取当前播放进度对应的时间:float playedTime = vfx.time; - 获取特定子序列时长:如果VFX包含多个子序列,可通过序列名获取对应时长:
float subSequenceDuration = vfx.GetSequenceDuration("SubSequenceName");
二、监听VFX生命周期结束事件(最可靠方式)
通过VFX Graph的Send Event节点配合脚本回调,能精准监听VFX的结束时机(包括循环结束、分支结束等自定义节点):
- 在VFX Graph中配置事件:在VFX的结束节点(如
Block End)后添加Send Event节点,设置事件名称(例如OnVFXFinished)。 - 在脚本中注册回调:
using UnityEngine; using UnityEngine.VFX; public class VFXLifecycleController : MonoBehaviour { [SerializeField] private VisualEffect targetVFX; private void Start() { if (targetVFX != null) { // 注册事件回调 targetVFX.RegisterEventCallback<VFXEventAttribute>("OnVFXFinished", HandleVFXFinish); } } private void HandleVFXFinish(VFXEventAttribute attribute) { // 这里编写VFX结束后的逻辑 Debug.Log("VFX已完成播放"); } private void OnDestroy() { if (targetVFX != null) { // 注销回调,避免内存泄漏 targetVFX.UnregisterEventCallback<VFXEventAttribute>("OnVFXFinished", HandleVFXFinish); } } }
三、协程等待VFX完成(适用于非循环VFX)
如果VFX没有循环且时长固定,可通过协程等待时长来判断结束:
private IEnumerator WaitForVFXCompletion() { if (targetVFX == null || !targetVFX.isPlaying) yield break; yield return new WaitForSeconds(targetVFX.mainDuration); Debug.Log("VFX播放完成(协程方式)"); }
注意:这种方式不适用于循环VFX、动态时长VFX,或中途被手动停止的情况,可靠性不如事件回调。
四、手动控制生命周期
- 启动VFX:
targetVFX.Play(); - 停止VFX:
targetVFX.Stop();(可传入参数控制是否立即终止或完成当前循环) - 重置VFX:
targetVFX.Reinit();将VFX重置到初始状态
内容的提问来源于stack exchange,提问作者moonkanghyuck
相关产品推荐
相关产品推荐

