如何获取Unity场景中所有Timeline并添加至自定义列表?
获取场景中所有Timeline并添加到列表的方法
在Unity中,Timeline的播放由PlayableDirector组件控制,所以要获取场景内所有Timeline,本质就是查找所有PlayableDirector实例,再添加到你的列表中。
基础实现(单个场景)
直接使用FindObjectsOfType方法快速获取场景内的PlayableDirector,示例代码如下:
using UnityEngine; using UnityEngine.Playables; using System.Collections.Generic; public class TimelineHandler : MonoBehaviour { private List<PlayableDirector> timelines = new List<PlayableDirector>(); void Start() { // 获取场景中所有激活状态的PlayableDirector PlayableDirector[] foundTimelines = FindObjectsOfType<PlayableDirector>(); // 若需要包含未激活的对象,替换为下面这行 // PlayableDirector[] foundTimelines = FindObjectsOfType<PlayableDirector>(includeInactive: true); // 将找到的控制器批量添加到列表 timelines.AddRange(foundTimelines); // 可选:验证结果 Debug.Log($"共找到 {timelines.Count} 个Timeline控制器"); } }
多场景加载时的处理
如果项目同时加载了多个场景,上面的方法只会获取当前活跃场景的对象,这时需要遍历所有已加载场景来查找:
using UnityEngine; using UnityEngine.Playables; using UnityEngine.SceneManagement; using System.Collections.Generic; using System.Linq; public class TimelineHandler : MonoBehaviour { private List<PlayableDirector> timelines = new List<PlayableDirector>(); void Start() { timelines.Clear(); // 遍历所有已加载的场景 for (int i = 0; i < SceneManager.sceneCount; i++) { Scene targetScene = SceneManager.GetSceneAt(i); if (!targetScene.isLoaded) continue; // 获取当前场景根对象下所有(含子对象)的PlayableDirector PlayableDirector[] sceneTimelines = targetScene.GetRootGameObjects() .SelectMany(rootGo => rootGo.GetComponentsInChildren<PlayableDirector>(includeInactive: true)) .ToArray(); timelines.AddRange(sceneTimelines); } Debug.Log($"多场景下共找到 {timelines.Count} 个Timeline控制器"); } }
内容的提问来源于stack exchange,提问作者Vacabi
相关产品推荐
相关产品推荐

