Unity Timeline 获取ControlTrack的GameObject实例

本文详细介绍了如何使用UnityTimeline的ControlTrack控制Prefab,通过SourceGameObject和Prefab实例获取GameObjectInstance,包括源对象解析和Playables Graph遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

Unity Timeline 的 ControlTrack 控制的 Prefab 有两种方法

  1. Source Game Object
    在这里插入图片描述

  2. Prefab
    在这里插入图片描述

代码

以下函数可以获取 Source Game Ojbect 和 Prefab实例后的 GameObject Instance


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public static class TimelineUtil
{
    public static List<GameObject> getControlTrackGameObjectInstanceList(PlayableDirector playableDirector)
    {
        List<GameObject> rs = new List<GameObject>();
        //--- 用 sourceGameObject 的
        var timeline = playableDirector != null ? (playableDirector.playableAsset as TimelineAsset) : null;
        if (timeline != null)
        {
            foreach (var t in timeline.GetOutputTracks())
            {
                var controlTrack = t as ControlTrack;
                if (controlTrack != null)
                {
                    foreach (var c in t.GetClips())
                    {
                        var controlPlayableAsset = c.asset as ControlPlayableAsset;
                        if (controlPlayableAsset != null)
                        {
                            if (controlPlayableAsset.prefabGameObject == null)
                            {
                                GameObject sourceObject = controlPlayableAsset.sourceGameObject.Resolve(playableDirector);
                                if (sourceObject != null)
                                {
                                    rs.Add(sourceObject);
                                }
                            }
                        }
                    }
                }
            }
        }
        //--- 用 Prefab 的
        PlayableGraph playableGraph = playableDirector.playableGraph;
        if (playableGraph.Equals(default(PlayableGraph)) == false && playableGraph.IsValid() == true)
        {
            //PlayableGraph 已经初始化
            int rootPlayableCount = playableGraph.GetRootPlayableCount();
            for (int _rootPlayableIdx = 0; _rootPlayableIdx < rootPlayableCount; _rootPlayableIdx++)
            {
                Playable playable = playableGraph.GetRootPlayable(_rootPlayableIdx);
                getPrefabControlPlayableGameObjectInstanceList(playable, rs);
            }
        }
        //---
        return rs;
    }
    public static void getPrefabControlPlayableGameObjectInstanceList(Playable playable, List<GameObject> rs)
    {
        int inputCount = playable.GetInputCount();
        if (playable.GetPlayableType() == typeof(PrefabControlPlayable))
        {
            ScriptPlayable<PrefabControlPlayable> sp = (ScriptPlayable<PrefabControlPlayable>)playable;
            GameObject _instance = sp.GetBehaviour().prefabInstance;
            if (_instance)
            {
                rs.Add(_instance);
            }
        }
        //--childrend
        for (int i = 0; i < inputCount; i++)
        {
            Playable _childPlayable = playable.GetInput(i);
            getPrefabControlPlayableGameObjectInstanceList(_childPlayable, rs);
        }
    }
}

用法

        PlayableDirector playableDirector = this.GetComponent<PlayableDirector>();
        List<GameObject> rs = TimelineUtil.getControlTrackGameObjectInstanceList(playableDirector);
        for (int i = 0; i < rs.Count; i++)
        {
            Debug.Log($"(i):{i}," + $"(rs[i]):{rs[i]},");
        }

Console输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值