当前位置:   article > 正文

Unity2017中Timeline的简单使用方法_unity timeline音效

unity timeline音效

以下为旧版本TimeLine,新版本功能介绍可以看这里

Timeline是Unity2017版本中新加入的功能,可以非常方便的进行场景动画的创建和修改,包括物体、声音、粒子、动画、特效、自定义Playable以及子Timeline等多种资源进行整合,从而能够较方便的生成效果很棒的场景动画,同时可以通过Unity的Recorder资源包录制较为完整的视频并导出。
Unity官方提供的Recorder插件

1.Timeline界面简单介绍

Unity2017中,点击Window->Timeline即可调出Timeline面板。如下图所示:
Timeline功能面板
在该面板中,可以创建多种类型的片段,如果你导入AssetStore中的Default Playables资源包(其中预置了多个官方提供的简单Playable实例),其面板如下所示:
加入Default Playables资源包后可以创建的功能片段
其中常用的主要有

  • Activation Track(控制物体的显示和隐藏)
  • Animation Track(为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip)
  • Audio Track(为动画添加音效,并可对音效进行简单的裁剪和操作)
  • Control Track(在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套)
  • Playable Track(在该轨道中用户可以添加自定义的播放功能)
  • Track Group(将不同的轨道进行分类,相当于文件夹功能)

当我们创建了TimeLine后,会在指定位置生成TimeLine的文件*.playable,当选中该文件后,会在Inspector面板中看到其相应的属性,如下图所示:
Timeline文件属性设置
其中Frame Rate可以设置该Timeline每秒钟播放多少帧动画。Duration Mode分为Based On Clips和Fixed Length两种模式,Based On Clips模式为按照帧数来播放,当播放到最后一帧时结束播放,Fixed Length模式可以设置总共播放多长时间,当播放到指定时间是停止。Duration设置当前播放的秒数和帧数。

2.Timeline轨道简单介绍

2.1 Activation Track

Activation Track轨道
该轨道首先需要为其赋值一个GameObject,表示该轨道控制该物体的显示与隐藏,当在Timeline播放过程中,如果处于片段内部,则该物体显示,否则该物体隐藏。

当我们点击该轨道时,会在Inspector面板中看到可以设置的属性,如下所示:
Activation Track属性

  • Active(当Timeline播放结束时,将该物体激活,设置为显示状态)
  • Inactive(当Timeline播放结束时,该物体取消激活,设置为隐藏状态)
  • Revert(当Timeline播放结束时,该物体还原Timeline在第1帧时的激活状态)
  • Leave As Is(当Timeline播放结束时,该物体保持在Timeline最后一帧的激活状态)

2.2 Animation Track

Animation Track主要控制动画的播放,包括动画片段、帧动画等。当我们点击Animation Track时,可以设置其属性,如下图所示:
Animation Track属性面板

2.2.1 Animation Track 属性

  • Apply Avatar Mask(启用“阿凡达遮罩”,当启用后将根据选择的遮罩应用在整个轨道中)
    Avatar Mask面板
  • Avatar Mask(选择需要的遮罩,并将其应用在当前Animation轨道中)
    最终效果如下:
    加入Avatar Mask后
  • Apply Track Offsets(启用轨道偏移效果,将所有动画的起始位置都设置为指定的偏移角度和位置上,与动画片段中的Clip Root Motion Offsets功能类似)
    动画片段中的Clip Root Motion Offsets
  • Clip Offset Match Fields(该选项可以设置不同动画之间偏移可匹配的变换)

2.2.2 动画轨道使用简介

1.添加Animation Clip
右击Animation Clip的空白处,选择Add From Animation Clip即可从已有的动画片段中选择。
添加Animation Clip
可以拖拽动画片段调整播放的时间,同时也可以将多个动画片段进行叠加来完成动画过渡效果。
动画片段
2.录制动画
可以在Animation Clip中点击红色按钮进行录制,通过设置不同的属性来为物体设置关键帧,从而完成不同类型的动画制作。
录制动画
3.设置曲线
录制的动画可以在动画窗口中打开,在动画窗口中可以通过关键帧点的方式进行控制,也可以通过曲线的方式进行控制。
曲线控制动画

2.3 Audio Track

Audio Track主要控制动画中的音效,可以设置声音的起始时间、结束时间、淡入时间、淡出时间、播放速度、不同音效间的混合效果、是否循环播放等。其属性如下所示:
音乐效果
2.4 Control Track

Control Track主要控制与时间有关的元素,如粒子效果、Timeline等。
该轨道可以在指定的父物体下实例化一个Prefab,并对该Prefab中与时间有关的元素进行播放操作。
Control Track面板

2.5 Playable Track

Playable Track允许用户自定义相关动画效果,在Default Playables资源包中包含了一部分自定义的功能轨道,包括文字、时间、灯光、位置、寻路、淡入淡出等效果,用户也可以根据自己的需要进行定制化开发,以实现更加复杂的效果。
用户可以在代码中继承PlayableBehaviour和PlayableAsset两个类,在其中完成自定义的动画功能。

  1. /// <summary>
  2. ///该类主要实现在TimeLine的PlayableTrack中显示我们定义的功能,并完成赋值
  3. /// </summary>
  4. public class PlayableBehaviourSample : PlayableAsset
  5. {
  6. //使用ExposedReference进行赋值操作
  7. public ExposedReference<GameObject> ShowNumberText;
  8. private Text text;
  9. public int startNum;
  10. public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
  11. {
  12. var scriptPlayable = ScriptPlayable<PlayableTest>.Create(graph);
  13. //从ExposedReference中获取我们需要的控件
  14. text = ShowNumberText.Resolve(graph.GetResolver()).GetComponent<Text>();
  15. //对指定的PlayableBehaviour中的属性进行赋值
  16. scriptPlayable.GetBehaviour().ShowNumberText = text;
  17. scriptPlayable.GetBehaviour().StartNum = startNum;
  18. return scriptPlayable;
  19. }
  20. }
  21. /// <summary>
  22. /// 读秒功能
  23. /// </summary>
  24. public class PlayableTest : PlayableBehaviour
  25. {
  26. //显示文字的控件
  27. public Text ShowNumberText;
  28. public int StartNum;
  29. float time;
  30. int currentNum;
  31. /// <summary>
  32. /// 当该PlayableBehaviour的PlayableGraph启动时调用
  33. /// </summary>
  34. /// <param name="playable"></param>
  35. public override void OnGraphStart(Playable playable)
  36. {
  37. base.OnGraphStart(playable);
  38. Debug.Log("OnGraphStart Called");
  39. currentNum = StartNum;
  40. ShowNumberText.text = "Start Number Is " + StartNum;
  41. Debug.Log(ShowNumberText.text);
  42. }
  43. /// <summary>
  44. /// 当该PlayableBehaviour的PlayState转换为PlayState.Play时调用
  45. /// </summary>
  46. /// <param name="playable"></param>
  47. /// <param name="info"></param>
  48. public override void OnBehaviourPlay(Playable playable, FrameData info)
  49. {
  50. base.OnBehaviourPlay(playable, info);
  51. Debug.Log("OnBehaviourPlay Called");
  52. }
  53. /// <summary>
  54. /// 该函数与ProcessFrame函数功能相同,都是在该PlayableBehaviour播放的每一帧中调用,相当于Update函数的功能
  55. /// </summary>
  56. /// <param name="playable"></param>
  57. /// <param name="info"></param>
  58. public override void PrepareFrame(Playable playable, FrameData info)
  59. {
  60. base.PrepareFrame(playable, info);
  61. Debug.Log("PrepareFrame Called");
  62. time += Time.deltaTime;
  63. if (time > 1.0f)
  64. {
  65. currentNum++;
  66. ShowNumberText.text = "Current Number Is " + currentNum;
  67. Debug.Log(ShowNumberText.text);
  68. time -= 1.0f;
  69. }
  70. }
  71. /// <summary>
  72. /// 该函数与PrepareFrame函数功能相同,都是在该PlayableBehaviour播放的每一帧中调用,相当于Update函数的功能
  73. /// </summary>
  74. /// <param name="playable"></param>
  75. /// <param name="info"></param>
  76. /// <param name="playerData"></param>
  77. public override void ProcessFrame(Playable playable, FrameData info, object playerData)
  78. {
  79. base.ProcessFrame(playable, info, playerData);
  80. Debug.Log("ProcessFrame Called");
  81. }
  82. /// <summary>
  83. /// 该函数在PlayableBehaviour片段的PlayState转换为Delay时调用
  84. /// </summary>
  85. /// <param name="playable"></param>
  86. /// <param name="info"></param>
  87. public override void OnBehaviourDelay(Playable playable, FrameData info)
  88. {
  89. base.OnBehaviourDelay(playable, info);
  90. Debug.Log("OnBehaviourDelay Called");
  91. }
  92. /// <summary>
  93. /// 该函数在PlayableBehaviour片段的PlayState转换为Pause时调用
  94. /// </summary>
  95. /// <param name="playable"></param>
  96. /// <param name="info"></param>
  97. public override void OnBehaviourPause(Playable playable, FrameData info)
  98. {
  99. base.OnBehaviourPause(playable, info);
  100. Debug.Log("OnBehaviourPause Called");
  101. ShowNumberText.text = "End Number Is " + currentNum;
  102. Debug.Log(ShowNumberText.text);
  103. }
  104. /// <summary>
  105. /// 该函数在PlayableBehaviour片段停止播放时调用
  106. /// </summary>
  107. /// <param name="playable"></param>
  108. public override void OnGraphStop(Playable playable)
  109. {
  110. base.OnGraphStop(playable);
  111. Debug.Log("OnGraphStop Called");
  112. }
  113. /// <summary>
  114. /// 该函数在PlayableBehaviour片段创建时调用
  115. /// </summary>
  116. /// <param name="playable"></param>
  117. public override void OnPlayableCreate(Playable playable)
  118. {
  119. base.OnPlayableCreate(playable);
  120. Debug.Log("OnPlayableCreate Called");
  121. }
  122. /// <summary>
  123. /// 该函数在PlayableBehaviour片段销毁时调用
  124. /// </summary>
  125. /// <param name="playable"></param>
  126. public override void OnPlayableDestroy(Playable playable)
  127. {
  128. base.OnPlayableDestroy(playable);
  129. Debug.Log("OnPlayableDestroy Called");
  130. }
  131. /// <summary>
  132. /// 该函数在PlayableGraph的PrepareData阶段被调用
  133. /// </summary>
  134. /// <param name="playable"></param>
  135. /// <param name="info"></param>
  136. public override void PrepareData(Playable playable, FrameData info)
  137. {
  138. base.PrepareData(playable, info);
  139. Debug.Log("PrepareData Called");
  140. }
  141. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159

以下为运行后的调用顺序
调用顺序
以下为该Timeline设置的状态,主要部分为PlayableTrack。
Timeline状态
最终运行效果如下:
运行效果

该方法也可通过继承BasicPlayableBehaviour类完成,但是在未来的版本中该类可能会被PlayableBehaviour和PlayableAsset类取代。

遇到的问题

在使用TimeLine功能的过程中,如果对物体使用了录制功能进行位置的调整,很多情况下物体的默认位置会发生偏移,最好在使用TimeLine的Animation Track录制功能前先备份场景,以免在设置动画过程中对场景造成破坏。

本人对TimeLine很多功能还不够熟悉,这些只是在使用过程中用到的功能,将Timeline和CineMachine以及Post Processing等功能进行结合可以做出相当炫酷的效果,可参考Unity官方的Adam&Neon动画短片

如有问题欢迎大家提出,今后有时间会再简单介绍CineMachine和Post Processing相关内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/213793
推荐阅读
相关标签
  

闽ICP备14008679号