Timeline基本操作的代码实现

本文地址:https://blog.csdn.net/t163361/article/details/114371386
最近准备申请新星创作者,需要2000个粉丝关注,觉得文章有用的,请点一下左侧边栏的关注,谢谢。

19年左右调研Timeline的相关文档

PlayDirector

通过TimelineEditor可以获取当前主运行Timeline的PlayDirector的句柄。

可以实现运行时针对此Timeline的播放,结束,暂停,恢复,前后帧移动,刷新等功能

RefreshGUI刷新Timeline的编辑器窗口

代码如下

using System.Reflection;
using UnityEditor;
using UnityEditor.Timeline;
using UnityEngine;

public class TimelineControl : EditorWindow
{
    [MenuItem("Tools/TimelineControl")]
    private static void ShowWindow()
    {
        var self = GetWindow(typeof(TimelineControl)) as TimelineControl;
    }

    private void OnGUI()
    {
        GUILayout.Space(7f);
        var dir = TimelineEditor.masterDirector;
        if (dir == null)
            return;
        if (GUILayout.Button("播放", GUILayout.Width(60f)))
        {
            dir.Play();
        }
        if (GUILayout.Button("结束", GUILayout.Width(60f)))
        {
            dir.Stop();
        }
        if (GUILayout.Button("暂停", GUILayout.Width(60f)))
        {
            dir.Pause();
        }
        if (GUILayout.Button("恢复", GUILayout.Width(60f)))
        {
            dir.Resume();
        }
        if (GUILayout.Button("前跳", GUILayout.Width(60f)))//根据播放模式不同,增加对应的帧或秒
        {
            dir.time += 1;
            RefreshData();
        }
        if (GUILayout.Button("后退", GUILayout.Width(60f)))//根据播放模式不同,减少对应的帧或秒
        {
            dir.time -= 1;
            RefreshData();
        }
        if (GUILayout.Button("重载刷新", GUILayout.Width(60f)))
        {
            ReloadRefreshData();
        }
        if (GUILayout.Button("刷新界面", GUILayout.Width(60f)))
        {
            RefreshGUI();
        }
    }
    /// <summary>
    /// 只刷新数据
    /// </summary>
    public void RefreshData()
    {
        var dir = TimelineEditor.masterDirector;
        if (dir == null)
            return;

        dir.Evaluate();
    }

    /// <summary>
    /// 重新加载Timeline数据,并恢复到当前帧
    /// </summary>
    public static void ReloadRefreshData()
    {
        var dir = TimelineEditor.masterDirector;
        if (dir == null)
            return;

        double oldT = dir.time;
        dir.Stop();
        dir.time = oldT;
        dir.Evaluate();
    }

    /// <summary>
    /// 通过反射刷新Timeline编辑窗口
    /// </summary>
    public static void RefreshGUI()
    {
        Assembly asmTE = Assembly.GetAssembly(typeof(TimelineEditor));
        var tw = asmTE.GetType("UnityEditor.Timeline.TimelineWindow");
        var gui = EditorWindow.GetWindow(tw, false);

        var twState = tw.GetProperty("state", BindingFlags.Instance | BindingFlags.Public);
        var stateValue = twState.GetValue(gui, null);

        var ws = asmTE.GetType("UnityEditor.Timeline.WindowState");
        var refreshMethod = ws.GetMethod("Refresh", BindingFlags.Instance | BindingFlags.Public);

        refreshMethod.Invoke(stateValue, new Object[] { });
    }
}

Track操作

实现动态添加一个ActivationTrack以及ActivationClip的功能

调用TimelineControl中的刷新函数,可以实现实时更新的效果

using UnityEditor;
using UnityEditor.Timeline;
using UnityEngine;
using UnityEngine.Timeline;

public class TrackControl : EditorWindow
{
    [MenuItem("Tools/TrackControl")]
    private static void ShowWindow()
    {
        var self = GetWindow(typeof(TrackControl)) as TrackControl;
    }

    private void OnGUI()
    {
        if (GUILayout.Button("添加Track", GUILayout.Width(70f)))
        {
            AddTrack();
        }
        if (GUILayout.Button("添加Clicp", GUILayout.Width(60f)))
        {
            AddClip();
        }        
    }
    /// <summary>
    /// 添加时间轨
    /// </summary>
    private void AddTrack()
    {
        var t = TimelineEditor.masterAsset;

        var x = t.CreateTrack<ActivationTrack>(null, "Track") as ActivationTrack;
        
        TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved);
    }
    /// <summary>
    /// 添加剪辑
    /// </summary>
    private void AddClip()
    {
        var t = TimelineEditor.masterAsset;
       
        foreach(var tttt in t.GetRootTracks())
        {
            if (tttt is ActivationTrack)//获得第一个ActivationTrack轨道
            {
                var clip = tttt.CreateDefaultClip();
                clip.start = 6;
                clip.duration = 1;
                TimelineControl.ReloadRefreshData();
                break;
            }
        }        
    }      
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值