• Unity中的Timeline


    一:前言

    Timeline与动画系统类似,但是它可以针对多个物体做出一系列多个动画,它可以创建多个轨道,对象激活与隐藏轨道,动画轨道,声音轨道等。每个轨道都可以单独编辑,轨道内的不同资源可以排列并且融合


    二:基础操作

    可以单独Lock某一条轨道或Mute(禁用)某一条轨道


    三:Activation Track(对象激活与隐藏轨道)


    控制物体的显隐,在时间区域内是显示


    四:Animation Track(动画轨道)


    控制游戏物体的动画,与Animator一样,可以点击红点进行录制,可以控制身上任一组件的参数。在此轨道上右键可以选择Convert To Clip Track转换成动画片段,进而可以对动画进行更多的设置


    ——Start/End:开始和结束的秒数和帧数
    ——Duration:总持续时间的秒数和帧数
    ——Ease In/Out Duration:动画融合的时间
    ——Speed Multiplier:速度
    ——Pre/Post Extrapolate:开始和结束的游戏物体状态
    None:动画开始前/结束后保持物体原位置不变
    Hold:动画开始前/结束后保持动画开始和结束位置
    Loop:动画开始前/结束后动画循环播放
    PingPong:动画开始前/结束后动画来回播放
    Continue:动画开始前动画播放一遍,结束后动画没变化


    五:Audio Track(声音轨道)


     控制声音的播放


    六:Signal Track(信号轨道)


    Signal包含三部分:Signal Asset(信号资源),Signal Emitter(信号发射器)和SignalReceiver(信号接收器),它其实就是一个Event,作用就是在单独轨道上面添加事件点,在某一帧执行某个方法
    ——创建信号发射器和信号资源
    在轨道上右键选择Add Signal Emitter,Inspector面板选择从Project面板创建的Signal Asset或Create一个新的Signal Asset
    ——创建信号接收器

    添加Signal Receiver,对应的游戏物体身上会自动添加Signal Receiver组件,与UGUI绑定按钮事件相似(将物体拖拽到Timeline窗口中可以选择Add Signal Track将会自动给物体添加Signal Receiver组件) 

    1. using UnityEngine;
    2. public class Cube : MonoBehaviour
    3. {
    4. public void OnTimelineSignal()
    5. {
    6. Debug.Log("OnTimelineSignal");
    7. }
    8. }

    自定义Signal

    1. using UnityEngine;
    2. using UnityEngine.Playables;
    3. using UnityEngine.Timeline;
    4. public class CustomSignalReceiver : MonoBehaviour, INotificationReceiver
    5. {
    6. public void OnNotify(Playable origin, INotification notification, object context)
    7. {
    8. var signal = notification as CustomSignal;
    9. if (signal != null
    10. && signal.asset != null)
    11. {
    12. Debug.Log(signal.param);
    13. }
    14. }
    15. }
    16. public class CustomSignal : SignalEmitter
    17. {
    18. public int param;
    19. }

    七: 自定义Timeline

    Timeline分为以下四部分
    ——Track:轨道,继承自TrackAsset
    ——Clip:片段,一段Clip代表一个Playable,继承自PlayableAsset
    ——Behavior、MixerBehavior:属于行为逻辑模板,继承自PlayableBehaviour

    ——创建Behaviour/MixerBehavior

    自定义行为逻辑,基类有一套自己的生命周期
    OnPlayableCreate:每个Clip创建时( Playable播放状态为playing时),相当于Awake
    OnGraphStart:每个Clip创建时( Playable播放状态为playing时),在OnPlayableCreate后执行,相当于Start
    OnBehaviourPlay:Clip执行时
    OnBehaviourPause:Clip暂停时
    PrepareFrame:每帧执行,相当于Update,playerData就是轨道绑定的物体,默认是PlayableDirector组件挂载的物体
    OnGraphStop:Playable停止时
    OnPlayableDestroy:Playable销毁时


    ————创建Clip

    通过GetBehaviour获取到Behaviour,将逻辑和数据联系起来
    可以继承ITimelineClipAsset接口去定义ClipCaps类型

    ——创建Track

    ——TrackColor特性:控制轨道颜色
    ——TrackClipType特性:可以添加的Clip类型
    ——TrackBindingType特性:绑定的数据对象,在ProcessFrame函数中会以playerData的形式传递进去
    ——OnCreateClip:面板上创建Clip时
    ——CreateTrackMixer:创建自定义混合轨道
    ——GetClips:获取轨道内的所有ClipAsset


    八:自定义TImeline案例——全屏遮罩

    1. using UnityEngine;
    2. using UnityEngine.Timeline;
    3. using UnityEngine.Playables;
    4. using UnityEngine.UI;
    5. [TrackColor(1, 0, 0)]
    6. [TrackBindingType(typeof(Image))]
    7. [TrackClipType(typeof(ScreenFadeClip))]
    8. public class ScreenFadeTrack : TrackAsset
    9. {
    10. public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
    11. {
    12. return ScriptPlayable.Create(graph, inputCount);
    13. }
    14. }
    1. using UnityEngine;
    2. using UnityEngine.Playables;
    3. public class ScreenFadeClip : PlayableAsset
    4. {
    5. public Color maskColor;
    6. public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    7. {
    8. var playable = ScriptPlayable.Create(graph);
    9. var behaviour = playable.GetBehaviour();
    10. behaviour.maskColor = maskColor;
    11. return playable;
    12. }
    13. }
    1. using System.Collections;
    2. using UnityEngine;
    3. using UnityEngine.Playables;
    4. using UnityEngine.UI;
    5. public class ScreenFadeMixBehavioour : PlayableBehaviour
    6. {
    7. Image img;
    8. public Color maskColor;
    9. public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    10. {
    11. Color blendColor = Color.clear;
    12. img = playerData as Image;
    13. if (img != null)
    14. {
    15. int inputCount = playable.GetInputCount();
    16. for (int i = 0; i < inputCount; i++)
    17. {
    18. float tempWeight = playable.GetInputWeight(i);
    19. ScreenFadeMixBehavioour tempBehaviour = ((ScriptPlayable)playable.GetInput(i)).GetBehaviour();
    20. blendColor += tempBehaviour.maskColor * tempWeight;
    21. }
    22. img.color = blendColor;
    23. }
    24. }
    25. public override void OnBehaviourPause(Playable playable, FrameData info)
    26. {
    27. if (img != null)
    28. {
    29. img.color = Color.clear;
    30. }
    31. }
    32. }

  • 相关阅读:
    用于三维点云语义分割的标注工具和城市数据集
    Java SE 9 模块化示例
    计算点云每个点与Z轴的垂直度(附open3d python代码)
    【面经】讲一下spring aop
    计算机网络——数据链路层介质访问控制
    154_一键批量建立时间智能度量值
    KF、EKF、IEKF、UKF卡尔曼滤波器
    JavaScript高级 笔记
    SQL之窗口函数
    一文搞懂并查集
  • 原文地址:https://blog.csdn.net/LLLLL__/article/details/127253872