【博客节选】自定义 timeline track 与 PlayableBehaviour数据交互

article/2025/8/17 2:42:17

注:软件版本Unity 6.0 + Timeline 1.8.7

作者:CSDN @ RingleaderWang
原文:《Unity第25期——Timeline结构及其源码浅析》
文章首发Github👍:《Timeline结构及其源码浅析》

Bilibili 视频版👍👍:《Timeline结构及其源码解析》https://www.bilibili.com/video/BV1bHjYzNE35

Behaviour 与 PlayableAsset的数据交互

我们在自定义Track 自定义PlayableAsset时,可能有这么个需求,Track或PlayableAsset自身需要拥有特殊属性,而且能在后面的生命周期中获取这个特殊属性。

比如我的技能系统用的SkillPlayableAsset,有个参数标注这个clip用于技能的哪个阶段,就需要SkiIlPhase这么一个参数,后面behaviour回调触发时就能根据这个参数针对性做处理。

Track或PlayableAsset自身需要拥有特殊属性的场景

这就是behaviour 与 playableAsset的数据交互问题。

如果你是官方设定的基础Playable,你可以在Playable上设置这么个特殊属性,create的时候都塞进去,生命周期回调时也能正常获取。但你自定义track,用的都是ScriptPlayable,没有额外参数,怎么办?那就是用PlayableBehaviour传参!

传参有两种方式,这同时也涉及到ScriptPlayable createPlayable的两种方式。

// T : class, IPlayableBehaviour, new()
public static ScriptPlayable<T> Create(PlayableGraph graph, int inputCount = 0)  
{  return new ScriptPlayable<T>(ScriptPlayable<T>.CreateHandle(graph, default (T), inputCount));  
}  public static ScriptPlayable<T> Create(PlayableGraph graph, T template, int inputCount = 0)  
{  return new ScriptPlayable<T>(ScriptPlayable<T>.CreateHandle(graph, template, inputCount));  
}
带 new T() 的 ScriptPlayable 创建

如上ScriptPlayable 创建Playable时,可以带T template 参数,T就是实现了IPlayableBehaviour且有无参构造函数的类。

这样自定track或playableAsset在创建playable时就可以将含有特殊属性的T传进来,behaviour回调时就能获取到你设的特殊属性。

// 存在 XXPlayableBehaviour,内含param1、param2两个参数public class XXPlayableAsset : PlayableAsset
{public XXPlayableBehaviour template = new XXPlayableBehaviour();public override Playable CreatePlayable (PlayableGraph graph, GameObject owner){var playable = ScriptPlayable<XXPlayableBehaviour>.Create(graph,template);return playable;}
}
XXPlayableAsset Inspector面板展示:
template
- param1
- param2

这样你在XXPlayableAsset Inspector就能展示XXPlayableBehaviour的两个参数,param1和param2,但不够好看,外面会套一层参数名,像下面这样:

解决方法有两个,一种是类似AudioTrack的处理方法,写个AudioTrackInspector手动提取出各个参数。另一个参考官方案例的自定义Attribute:NoFoldOut。

// Custom property drawer that draws all child properties inline
[CustomPropertyDrawer(typeof(NoFoldOutAttribute))]
public class NoFoldOutPropertyDrawer : PropertyDrawer
{public override float GetPropertyHeight(SerializedProperty property, GUIContent label){if (!property.hasChildren)return base.GetPropertyHeight(property, label);property.isExpanded = true;return EditorGUI.GetPropertyHeight(property, label, true) -EditorGUI.GetPropertyHeight(property, label, false);}public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){if (!property.hasChildren)EditorGUI.PropertyField(position, property, label);else{SerializedProperty iter = property.Copy();var nextSibling = property.Copy();nextSibling.Next(false);property.Next(true);do{// We need to check against nextSibling to properly stop// otherwise we will draw properties that are not child of this// foldout.if (SerializedProperty.EqualContents(property, nextSibling))break;float height = EditorGUI.GetPropertyHeight(property, property.hasVisibleChildren);position.height = height;EditorGUI.PropertyField(position, property, property.hasVisibleChildren);position.y = position.y + height;}while (property.NextVisible(false));}}
}

这样使用时给参数加[NoFoldOut]特性就能直接展示子属性了。

// 存在 XXPlayableBehaviour,内含param1、param2两个参数
public class XXPlayableAsset : PlayableAsset
{[NoFoldOut]public XXPlayableBehaviour template = new XXPlayableBehaviour();public override Playable CreatePlayable (PlayableGraph graph, GameObject owner){var playable = ScriptPlayable<XXPlayableBehaviour>.Create(graph,template);return playable;}
}

使用 default (T) 的 ScriptPlayable 创建

如果你使用 default (T) 创建,意味着你的这些特殊属性都变成默认值。

不过你也可以手动操作改变,如下代码所示,create完ScriptPlayable后,再手动赋值。

// 存在 XXPlayableBehaviour,内含param1、param2两个参数public class XXPlayableAsset : PlayableAsset
{public override Playable CreatePlayable (PlayableGraph graph, GameObject owner){var playable = ScriptPlayable<XXPlayableBehaviour>.Create(graph);var xxPlayableBehaviour = playable.GetBehaviour();xxPlayableBehaviour.param1 = value1;xxPlayableBehaviour.param2 = value2;return playable;}
}

不过这种在Asset还要再申明一遍param,冗杂,所以推荐用第一种。

ExposedReference用法

因为Asset不能引用scene场景中的对象,但如果你非要引用也不是不可以,Timeline提供了ExposedReference方法让你能在Behaviour回调中获取场景中的对象。

public class XXPlayableBehaviour : PlayableBehaviour
{public ExposedReference<Transform> exposedTransform;public override void OnGraphStart(Playable playable){Transform transform = exposedTransform.Resolve(playable.GetGraph().GetResolver());  Debug.Log("exposedTransform.Resolve(playable.GetGraph().GetResolver()):"+transform.position);Debug.Log("gameobject name:" + transform.gameObject.name);}
}public class XXPlayableAsset : PlayableAsset
{public XXPlayableBehaviour template = new XXPlayableBehaviour();public override Playable CreatePlayable (PlayableGraph graph, GameObject owner){var playable = ScriptPlayable<XXPlayableBehaviour>.Create(graph,template);return playable;}
}

注意使用时,一定要从点击挂载PlayableDirector的对象对应的timeline窗口操作。

ExposedReference用法

运行时可以正常打印,但发现打印的对象position数据有问题,似乎有(0.22, 1.28, -1.66)的偏差,不清楚原因,暂时还是不要用ExposedReference

ExposedReference用法有待进一步验证

http://www.hkcw.cn/article/uEedcxkgxN.shtml

相关文章

陈雨菲夺新加坡公开赛冠军 完胜队友登顶

在2025年新加坡羽毛球公开赛女单决赛中,中国选手陈雨菲以2比0战胜队友王祉怡,夺得冠军。比赛结束后,陈雨菲庆祝胜利并在颁奖仪式上领取了奖杯。比赛中,两位选手都展现了出色的技术和拼搏精神,为观众带来了一场精彩的对决。责任编辑:zhangxiaohua

俄两座桥梁遭爆炸袭击被定性为恐袭 普京连夜接收报告

当地时间6月1日,俄罗斯侦查委员会将布良斯克州和库尔斯克州的桥梁遭破坏事件定性为恐怖袭击。俄罗斯总统新闻秘书佩斯科夫表示,普京整夜都在通过联邦安全局和紧急情况部渠道接收关于这两起事件的报告。在24小时内,两座桥梁因爆炸遭到破坏。5月31日22时50分,布良斯克州维戈尼…

明后天强降雨区域南压至华南等地 端午出行需警惕

端午假期第二天,中东部地区持续出现较大范围的降雨,长江中下游仍是主要降雨区域。安徽南部、浙江西北部、湖南西南部、贵州东南部、广西北部、云南西北部和西藏东南部等地部分地区遭遇大暴雨。预计明天降雨区域将向南移动,华南地区的雨势会增强,福建东北部、广东中部、云南…

俄方将桥梁坍塌事件定性为恐怖袭击 普京连夜关注进展

当地时间6月1日,俄罗斯侦查委员会将布良斯克州和库尔斯克州的桥梁遭破坏事件定性为恐怖袭击。俄罗斯总统新闻秘书佩斯科夫表示,普京整夜都在通过联邦安全局和紧急情况部渠道接收有关这两起事件的报告。在24小时内,两座桥梁因爆炸遭到破坏。据俄罗斯联邦侦查委员会消息,5月3…

YOLOv10速度提升与参数缩减解析2025.5.31

YOLOv10作为YOLO系列的最新版本&#xff0c;在模型参数压缩和效率优化方面做出了显著改进&#xff0c;但其速度提升与参数缩减之间看似不成比例的现象&#xff0c;主要源于其设计策略和硬件适配的综合影响。以下从多个角度分析这一问题的技术背景和原因&#xff1a; 1. 参数缩减…

LangGraph 快速入门

目录 LangGraph简介LangGraph&LangChain 快速开始LangGraph基础知识Build a basic chatbot第1步&#xff1a;创建 StateGraphAnnotated&reducer 第2步&#xff1a;添加一个节点&#xff08;Node&#xff09;第3步&#xff1a;添加入口节点&#xff08;Entry Point&…

小米高管疑似再回应余承东 诋毁即仰望

6月1日,“雷军疑似回应余承东”的词条冲上微博热搜榜首位。同一天,小米创办人、董事长兼CEO雷军发布微博称,刚学会了作家莫言的一句名言:“诋毁,本身就是一种仰望。”小米汽车还披露了5月的交付量超过2.8万辆,并表示正在全力为小米YU7的大规模量产做准备,预计7月份量产。…

宝武钢铁集团迎来新任总会计师 李丽娜履新

中国宝武钢铁集团有限公司官网近日更新信息显示,李丽娜自2025年5月起担任集团总会计师、党委常委。公开资料显示,李丽娜1970年8月出生于黑龙江,汉族,1993年7月参加工作,同年3月加入中国共产党。她毕业于东北林业大学经济管理学院财务会计专业,并在中央财经大学获得管理学…

“苏超”为何火了 真比拼真热情点燃城市

谁曾想到,一个省级“草根”联赛能让十三座城市如火如荼地斗嘴,万人空巷般地看球?2025年,江苏城市足球联赛“苏超”火了,不靠营销,不靠资本,靠的是一个“真”字:真比拼、真热情、真守护。这份“真”不仅体现在球场上球员们的拼抢和赛后的礼貌致意,还体现在看台上邻里间…

盛李豪跳霹雳舞 射击冠军的舞蹈梦

6月1日,奥林匹克运动会发布了盛李豪跳霹雳舞的视频。视频中,他表示希望能与巴黎奥运会霹雳舞B-Girls铜牌得主刘清漪一起跳舞。盛李豪2004年出生于江苏苏州张家港市,13岁开始接触射击。2018年他入选江苏省射击队,次年进入国家队。2020年东京奥运会上,盛李豪首次参赛便在男子…

小米王化疑似回应余承东 强调小米汽车交付量目标

6月1日,小米的王化发文称,2025年5月,小米汽车的交付量将超过28000台。他还提到,公司正在为小米YU7的大规模量产做准备,并感谢了大家的支持与青睐。此前,在2025未来汽车先行者大会上,华为常务董事、终端BG董事长余承东表示,从其他行业来的公司只做一款车就能卖得很火,尽…

林志玲回应缩脖子 自信包上身抬头挺胸

近日,林志玲在北京电影节红毯上因缩脖子、小碎步等动作引发仪态争议。6月1日,她在社交平台发布视频回应此事。视频中,她因天冷缩脖子,在经提醒后背上“自信”帆布包,抬头挺胸,并配上了《姐就是女王》的背景音乐。她在视频下写道:“谢谢大家的提醒,妈妈真的太久没当明星…

也门战火线上独腿男孩的童年 战火中的无辜受害者

6月1日,对全世界的小朋友来说本应是充满欢声笑语的日子。然而,也门的战乱已经持续了超过十年,造成大量人员伤亡和流离失所,儿童成为最令人痛心的受害者。他们从未是战争的起因,却成了最无辜的牺牲品。今天,让我们走近也门男孩哈米德的人生路。他是一个在战争中侥幸逃生但…

在哈佛演讲中国女生陷入两难 签证政策影响未来规划

25岁的中国女生蒋雨融在哈佛大学第374届毕业典礼上发表演讲,成为该校近400年历史上首位站在毕业典礼讲台上发言的中国女性。她身着中国传统服饰,呼吁大家保持多元化和国际化,并以同理心和善意去守护人性,赢得了全场热烈掌声。演讲结束后,蒋雨融在接受媒体采访时表示,特朗…

一颗1985年升空的苏联卫星,那一夜以流星的方式落幕中国上空 多地目击不明飞行物

5月30日晚,山东潍坊、日照等地的许多网友在社交媒体发布视频,称夜空中有不明飞行物飞过。江苏、安徽等地的网友也发布了类似视频,有人猜测是火流星。天体物理学博主解释说,这实际上是一颗国外发射的侦查卫星。5月31日早上,一位王女士表示,她在潍坊市昌邑县看到了不明飞行…

广东为什么这么热爱赛龙舟 千年传承的文化图腾

五月初五,珠江水面数百条龙舟如离弦之箭劈波斩浪。鼓声震天,浪花飞溅,十万观众沿岸呐喊——这是广东龙舟竞渡的寻常景象。在这个被现代摩天大楼环绕的岭南水乡,一场延续两千年的水上史诗正以最炽热的方式年复一年上演。广东龙舟早已超越简单的体育竞技,成为融血脉信仰、地…

如何看待樊振东加盟德甲联赛 淬炼后更出色

樊振东加盟德甲萨尔布吕肯俱乐部,将参加2025-2026赛季德国乒乓球甲级联赛和欧洲冠军联赛。他表示对新挑战充满期待,并渴望与团队共同赢得更多胜利。目前樊振东仍处在奥运后的调整期,计划通过全国比赛以及国内外俱乐部比赛逐步恢复状态。中国乒协表示理解和尊重他的意愿,并全…

微信被猜测推出“朋友圈访客”和“已读”功能,高管回应:怀疑有人特意反复翻炒流量 辟谣再登热搜

5月30日,腾讯公关总监张军针对“微信如果推出朋友圈访客功能”和“如果微信推出已读功能”两个热门话题进行了辟谣。他表示,不明白为何总有人反复创造这些假设性的话题,甚至怀疑有人故意翻炒流量。此前,有网友在平台上讨论微信是否会推出“已读”功能。张军曾公开回应称,“…

赵丽颖眼光果然毒辣 新剧《在人间》挑战观众智商

《在人间》是一部让艺绽君觉得难以评价的剧集,短短8集不到一周就要播完。这个“难评”并非褒贬,而是因为在观剧过程中感受到了大脑爆炸、脑细胞大量死亡,最终只能用一个相对中立的词汇来形容这部“神剧”。《在人间》共8集,隶属于爱奇艺的微尘剧场,这一剧场的特点是短小精…

大V解读美防长涉台言论 中方坚决反对美方挑衅

6月1日,外交部发言人就美国防长赫格塞思在香格里拉对话会上的涉华消极言论答记者问。有记者提问,5月31日,美国防长赫格塞思在香格里拉对话会上发表演讲,大肆渲染中国威胁,并就涉台、南海等问题发表消极言论。中方对此有何评论?发言人表示,赫格塞思无视地区国家求和平谋发…