Timeline功能强大,但可控的参数还是较少,官方提供了自定义编写Playable的方法,用于扩展Timeline,使其更加强大。

上一篇我们介绍了一些官方发布到Asset Store上的免费Playable,我们以其为模板,创建自己的Playable。

官方的例子提供了控制Text,Light,等。我们来尝试控制下Particle,粒子系统。

根据这个模板,我们可以进行扩展,进而可以使用Timeline控制粒子系统的任意参数

本篇目标:

通过Timeline控制粒子系统的StartColor,即

我们需要创建如下五个脚本

Drawer用来绘制,ParticleClip在Inspector中的颜色块,粒子将会根据这个颜色块更改颜色

在ParticleBehaivour中,定义要更改的变量

几个脚本的代码内容如下:

ParticleBehaivour:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;[Serializable]
public class ParticleBehaviour : PlayableBehaviour
{public Color p_startColor = Color.white;
}

ParticleClip.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
using System;[Serializable]
public class ParticleClip : PlayableAsset , ITimelineClipAsset
{public ParticleBehaviour templete = new ParticleBehaviour();public ClipCaps clipCaps {get { return ClipCaps.Blending; }}public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) {var playable = ScriptPlayable<ParticleBehaviour>.Create(graph, templete);return playable;}
}

ParticleMixerBehviour.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;public class ParticleMixerBehviour : PlayableBehaviour
{Color m_DefaultColor;ParticleSystem m_TrackBinding;bool m_firstFrameHappened;public override void ProcessFrame(Playable playable, FrameData info, object playerData) {m_TrackBinding = playerData as ParticleSystem;if (m_TrackBinding == null)return;if (!m_firstFrameHappened) {//var p_main = m_TrackBinding.main;m_DefaultColor = p_main.startColor.color;m_firstFrameHappened = true;}int inputCount = playable.GetInputCount();Color blendedColor = Color.clear;float totalWeight = 0f;float greatestWeight = 0f;int currentInputs = 0;for(int i = 0; i < inputCount; i++) {float inputWeight = playable.GetInputWeight(i);ScriptPlayable<ParticleBehaviour> inputPlayable = (ScriptPlayable<ParticleBehaviour>)playable.GetInput(i);ParticleBehaviour input = inputPlayable.GetBehaviour();blendedColor += input.p_startColor * inputWeight;totalWeight += inputWeight;if (inputWeight > greatestWeight) {greatestWeight = inputWeight;}if (!Mathf.Approximately(inputWeight, 0))currentInputs++;}var main = m_TrackBinding.main;main.startColor = blendedColor + m_DefaultColor * (1f - totalWeight);}public override void OnPlayableDestroy(Playable playable) {m_firstFrameHappened = false;if (m_TrackBinding == null)return;var main = m_TrackBinding.main;main.startColor = m_DefaultColor;}}

ParticleTrack.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;[TrackColor(0.35f,0.97f,0.64f)]
[TrackClipType(typeof(ParticleClip))]
[TrackBindingType(typeof(ParticleSystem))]
public class ParticleTrack : TrackAsset
{public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) {return ScriptPlayable<ParticleMixerBehviour>.Create(graph, inputCount);}public override void GatherProperties(PlayableDirector director, IPropertyCollector driver) {
#if UNITY_EDITORParticleSystem trackBinding = director.GetGenericBinding(this) as ParticleSystem;if (trackBinding == null)return;var serializedObject = new UnityEditor.SerializedObject(trackBinding);var iterator = serializedObject.GetIterator();while (iterator.NextVisible(true)) {if (iterator.hasVisibleChildren)continue;//driver.AddFromName<ParticleSystem>(trackBinding.gameObject, iterator.propertyPath);}
#endifbase.GatherProperties(director, driver);}
}

ParticleDrawer.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;[CustomPropertyDrawer(typeof(ParticleBehaviour))]
public class ParticleDrawer : PropertyDrawer
{public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {int fieldCount = 1;return fieldCount * EditorGUIUtility.singleLineHeight;}public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {SerializedProperty colorProp = property.FindPropertyRelative("p_startColor");Rect singleFieldRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight);EditorGUI.PropertyField(singleFieldRect, colorProp);}
}

创建如上脚本,粘贴以上代码,即可在Timeline中创建相应轨道。拖拽任意物体到Timeline中,也可创建Particle轨道

源码在这:

https://download.csdn.net/download/u011643463/11268727

同篇笔记(这里也能下到源码,万恶资本主义,我没法在本站上传0积分资源)

http://note.youdao.com/noteshare?id=28beb40d88f30e41af212c72e8de1d8f&sub=432815D8787545BB9FE0B1E57067AB99

【Unity】创建自定义Playable,使用Timeline控制Particle System的参数相关推荐

  1. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  2. unity 自定义时间轴_如何创建自定义时间轴标记

    unity 自定义时间轴 Starting with Unity 2019.1, Timeline supports markers! In this blog post, I will show y ...

  3. unity Timeline控制动画的播放

    unity Timeline控制动画的播放 创建一个空物体GameObject,添加Playable Director组件,添加脚本组件: 新建一个长方体: 创建timeline并将其拖到空物体的Pl ...

  4. 详解Unity中的粒子系统Particle System (二)

    前言 上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解.从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状 ...

  5. 详解Unity中的粒子系统Particle System (十)

    前言 第十篇,我们讲Light模块和Trails模块,这两个模块不像前几篇所讲的模块一样基本都是对粒子的运行逻辑变化产生影响的,而是对粒子的呈现效果产生影响.比如爆炸粒子不能只有爆炸,还要有光亮,被炸 ...

  6. Unity SRP自定义渲染管线 -- 2.Custom Shaders

    本章将接着上一篇文章,在初步实现一个渲染管线后来创建自定义的shader.上一篇文章的链接 https://blog.csdn.net/yinfourever/article/details/9051 ...

  7. Unity SRP自定义渲染管线 -- 1.Custom Pipeline

    该篇是对Catlike Coding这篇文章的概要总结,本人能力有限,如果有不正确的地方欢迎指正  https://catlikecoding.com/unity/tutorials/scriptab ...

  8. 使用 .NET Core模板引擎创建自定义的模板和项目

    本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...

  9. Unity 特效:Particle System(粒子系统)

    创建粒子: 方法一:为空物体添加Particle System组件. 方法二:在Hierarchy视图右击 ---> Effects ---> Particle System      I ...

最新文章

  1. iOS-生成国际化包-配置App多语言支持
  2. (二) shiro入门 :输出 hello world
  3. [转]《编程之道》(很老的一篇文章)
  4. ElasticSearch5.0——IK词库加载
  5. 使用DALSA采集卡进行采图(C#版)
  6. 数字版权管理 (DRM) 续
  7. Java PdfBox 提取指定PDF页面图片
  8. 深度学习笔记----拓扑结构动态变化网络(Dropout,Drop Connect, Stochastic Depth, BranchyNet,Blockdrop,SkipNet)
  9. 猜数游戏是一个益智类小游戏,游戏运行产生一个1-100之间的随机数,让玩家重复猜测,直到猜对为止。(扩展条件:如果猜测超出三次提示“游戏失败”)
  10. 三分钟学会数据库, INSERT INTO 插入
  11. python数字加密资产_GitHub - ezpod/crypto-exchange-engine: 数字加密资产交易引擎的原理性实现代码,汇智网提供...
  12. HTML5-俄罗斯方块
  13. 【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
  14. Java 本地内存 直接内存 元空间
  15. 【RK3399 GMAC】Linux Debian9 gmac 主控输出clk ,即output模式
  16. Editplus下载安装
  17. 人才吸引力评价模型研究
  18. 中国椭圆形板簧行业市场供需与战略研究报告
  19. 你现在无法访问 blog.csdn.net,因为网站使用的是 hsts。网络错误和攻击通常是暂时
  20. soj 9161. VOYAGER

热门文章

  1. nbiot电信云北向开发---基于LiteNAdemo_https例程
  2. SQL语句中生成UUID方法
  3. 《武志红·自我的诞生》学习笔记
  4. Oracle小数点保留问题
  5. 变分自编码器的推导,VAE的推导,ELBO|证据下界|训练方法
  6. MT6755原理图,MT6755数据表分析下载
  7. 解决稻香老农无组件上传类在文件上传时当文件名中含中文单双引号取不到正确的文件名的方案
  8. 苹果推出iOS15.2正式版,“数字遗产”计划正式上线,你的“继承人”是谁?
  9. Java方法在art虚拟机中的执行
  10. 如何用人机料法环来分析产品质量?