Timeline编辑器绘制流程

2024-03-10 05:58

本文主要是介绍Timeline编辑器绘制流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

代码结构

整个Timeline主要有如下几个重要的类来组织管理timeline窗口的绘制,数据的创建和保存工作

TimelineWindow

TimelineWindow是Timeline整个编辑器的入口类

负责创建TimelineTreeViewGUI,TimelineTimeArea,SequencePath等必须的组件。

treeView = new TimelineTreeViewGUI(this, state.editSequence.asset, this.get_position());

OnGUI函数是绘制的入口函数

包含初始化,绘制,undo等操作的函数入口,有如下重要的一个调用流程,触发TimelineTreeViewGUI的OnGUI函数

OnGUI()->DoLayout()->SequencerGUI()->TrackViewsGUI()->TracksGUI()->DrawTracksGUI()->treeView.OnGUI()

TimelineTreeViewGUI

管理,绘制Timeline数据

构造函数中会创建TimelineTreeView,TreeViewController,TimelineDataSource等

m_TreeView = new TreeViewController(sequencerWindow, val);m_TimelineTreeView = new TimelineTreeView(sequencerWindow, m_TreeView);m_DataSource = new TimelineDataSource(this, m_TreeView, sequencerWindow);

TimelineTreeView

负责每条Track数据的绘制工作

继承自ITreeViewGUI,实现了BeginRowGUI(),EndRowGUI(),OnRowGUI()等接口

OnRowGUI为每个Track轨道数据的绘制入口

public virtual void OnRowGUI(Rect rowRect, TreeViewItem item, int row, bool selected, bool focused)

函数中传入Rect和TreeViewItem等数据

触发TreeViewItem的Draw函数

timelineTrackBaseGUI.Draw(headerRect, contentRect, m_State, foldoutIndent);

TimelineTrackBaseGUI

本类是个基类,具体的实现在子类TimelineGroupGUI和TimelineTrackGUI中

包含TrackDrawer类型的成员drawer

继承逻辑关系如下

TimelineTrackGUI->TimelineGroupGUI->TimelineTrackBaseGUI->TreeViewItem

TimelineTrackGUI类会在Draw函数中调用drawer来绘制Track轨的数据

此函数中既包括DrawTrackHeader,DrawTrackColorKind,DrawLockState等通用的渲染函数

也包括针对每个Track轨的渲染函数调用

base.drawer.DrawTrack(rect, base.track, timeAreaShownRange, state);

继承TrackDrawer即可针对特定的Track轨进行渲染处理

TrackDrawer

Track的定制绘制基类,可以继承后自定义自己类型的Track绘制

官方实现了如下几个子类

ActivationTrackDrawer

AnimationTrackDrawer

InfiniteTrackDrawer

AudioTrackDrawer

Timeline组织结构图

在这里插入图片描述

Track组成

每个Tack轨可由三部分组成,其中*TrackDrawer是可选项,没有的话,会以默认的方式在Timeline窗口渲染

以Animation Track举例

有如下三个脚本

AnimationTrack.cs 此文件在 UnityEngine.Timeline.dll 文件中

继承路径:AnimationTrack->TrackAsset->PlayableAsset->ScriptableObject->Object

负责数据相关的处理。

AnimationTrackInspector.cs 此文件在 UnityEditor.Timeline.dll 文件中

继承路径:AnimationTrackInspector->TrackAssetInspector->Editor->ScriptableObject->Object

看名字就和Inspector的展示有关,本类就不展开讲了

AnimationTrackDrawer.cs 此文件在UnityEditor.Timeline.dll 文件中

继承路径:AnimationTrackDrawer->TrackDrawer->GUIDrawer

实现DrawTrack()函数,可以定制每个Track类型在Timeline绘制

自定义TrackAsset如何修改Timeline上的clip绘制样式

TrackDrawer是一个内部类,无法直接继承

可以使用ILSpy+Reflexil的方式将其暴漏出来,写个子类,即可随意修改了。

下面的代码会覆盖AnimationTrack的默认绘制样式,修改Track轨的高度

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.Timeline;[CustomTrackDrawer(typeof(UnityEngine.Timeline.AnimationTrack))]
public class TestTrackDrawer : TrackDrawer {public override float GetHeight(UnityEngine.Timeline.TrackAsset t){return 50;}
}

截图

在这里插入图片描述

Timeline相关功能速查入口

TimelineWindow.cs Timeline编辑器

TimelineTrackGUI.cs Track轨

—DrawTrackHeader()Track轨头

在这里插入图片描述

—m_ItemsDrawer.Draw(trackContentRect, state); clips

在这里插入图片描述

------TimelineClipsCUI DrawClip渲染clip

这篇关于Timeline编辑器绘制流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793265

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica