创建TimeLine
第一种方法:在Assets目录下,右键Create—>TimeLine, 双击创建的TimeLine文件,就可以打开TimeLine窗口 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3ddae0b1f6c944f998322ca3d9e081e5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16)
第二种方法: 找到右上角的菜单Window ![在这里插入图片描述](https://img-blog.csdnimg.cn/543fe6e759a84eaebe4df3fb33b41b36.png) 找到Sequencing—>TimeLine 打开TimeLine窗口 由于TimeLine必须依附于一个游戏对象上的Playable Director组件,所以创建一个空物体,并选中它,点击TimeLine窗口中的Create ![在这里插入图片描述](https://img-blog.csdnimg.cn/6dee644b495548239b1bdf5962876306.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 系统会自动为这个空物体挂载Animator和Playable Director组件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5046b6f49ad842439792d22c80f87a86.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 将TimeLine窗口中的TimeLine_Obj(Animator)删掉,我们不需要它(后面其实也可以自己创建)
ActivationTrack
用来设置物体的激活状态
只要动画播放到ActivationTrack的轨道上,物体就会被激活,在这之外全部为失活状态 如图,用Cube做例子 ![在这里插入图片描述](https://img-blog.csdnimg.cn/92cb2ac4ab9b4f498327b86154b7ef8a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/15849b3e62a943eeb4441858bd998d89.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 点击选中ActivationTrack的这条轨道,Inspector面板上其实是可以对动画播放之后的处理进行设置的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f4f247de8225448994654a998ad6807e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_19,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/b9bfef5b17364bfeab62ac9a17b2f110.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_14,color_FFFFFF,t_70,g_se,x_16) Active:设置为激活的(active=true),当Timeline资源播放完后,物体始终会保持激活状态(运行之后才能看到效果)。
Inactive :播放Timeline完后,设置为非激活(active=false)。
Revert :在Timeline播放完后,GameObject.active=播放前的GameObject.active的去反值。 也就是说,播放TimeLine之前是激活的,播放完后就是失活的(active=false)
Leave As Is: 设置active的状态是依赖Timeline资源播放完后active的值是什么就保持为什么。 例如,Timeline播放完后物体是失活的(active=false),那么物体就就保持为失活状态了(active=false)。
Animation Track
动画轨道,必须依附于Animator才能使用 创建一个Sphere球体,并给它挂载Animator 通过Animation录一段简单的位移动画 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ed0c1edae23492699fbfe73ff09a151.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 我录了一段上下位移的动画,命名为Sphere_Jump ![在这里插入图片描述](https://img-blog.csdnimg.cn/3dbd124d71c842718334860459fabea0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 在TimeLine中创建一个AnimationTrack,将刚刚的Sphere拖进去,因为Sphere上带有Animator,可以直接赋值,然后将刚刚录制的动画片段拖到轨道上 ![在这里插入图片描述](https://img-blog.csdnimg.cn/830f44e812864510920f8d0e6cd0f315.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e21119e05c9e44a28fdd97fbb500d6d8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 播放后,在Sphere跳起的过程中,Cube会被激活
Playable Track
可播放轨道,可以用来执行C#脚本中的方法 但是不同于Animtion中的事件,写法不同
我们需要两个成对的脚本,缺一不可,一个是 PlayableAsset PlayableBehaviour 我们要用来执行的脚本,必须要继承这两个类 我们可以直接在Asset文件夹下右键 Create—>Playables分别创建这两个脚本 我这里命名为: TimeLineEvent_Asset.cs TimeLineEvent_Behaviour.cs
代码内容分别为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class TimeLineEvent_Asset : PlayableAsset
{
public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
{
return Playable.Create(graph);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class TimeLineEvent_Behaviour : PlayableBehaviour
{
public override void OnGraphStart(Playable playable)
{
}
public override void OnGraphStop(Playable playable)
{
}
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
}
public override void PrepareFrame(Playable playable, FrameData info)
{
}
}
这里来写一个简单的功能
创建一个Capsule胶囊体,通过TimeLine来改变它的颜色
将TimeLineEvent_Behaviour .cs中的代码进行精简后,编写如下,在播放的时候将胶囊体的材质设置为红色,暂停为白色
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class TimeLineEvent_Behaviour : PlayableBehaviour
{
public GameObject target;
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
target.GetComponent<MeshRenderer>().material.color = Color.red;
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
target.GetComponent<MeshRenderer>().material.color = Color.white;
}
}
在TimeLineEvent_Asset.cs中编写代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class TimeLineEvent_Asset : PlayableAsset
{
public ExposedReference<GameObject> target;
public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
{
var p = ScriptPlayable<TimeLineEvent_Behaviour>.Create(graph);
p.GetBehaviour().target = target.Resolve(graph.GetResolver());
return p;
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/bbf6c6b0590e44b19d8f14fff5a08d11.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 在TimeLine窗口上右键创建Playable Track,再点击旁边的三个点,选择TimeLine_Event_Asset,其他的是我之前写的,不用在意 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0c9df8da0e014a37869213ee3826a054.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 创建之后,选择轨道上的片段 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3dd3f57fd88049b6ad8b444fb313177a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 右侧会出现我们刚刚写的暴露出来的Target,这个其实就是 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d1fffd06902f49eda90e47f6c8616074.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 将创建的胶囊体拖拽过去 ![在这里插入图片描述](https://img-blog.csdnimg.cn/043c752f86574b81bcdbdedf48c6ef74.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 播放TimeLine ![在这里插入图片描述](https://img-blog.csdnimg.cn/9e0ec6776f764bf1b41b25d7034fa1e9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 当播放到Playable Track上的片段时,胶囊体就变成了红色 ![在这里插入图片描述](https://img-blog.csdnimg.cn/847b1a11b71d4f46827e83b483ee01ae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 但是,这样并不方便我们对动画进行调试,有时候我们想要在物体身上挂载脚本然后进行调试,这时候,需要加入第三个脚本 TrackAsset
创建一个继承MonoBehaviour的脚本,实现一个功能,将一个列表中的所有物体全部变成红色
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TimeLineEvent_Mono : MonoBehaviour
{
public List<GameObject> objs = new List<GameObject>();
public void SetObjColor(bool isRed)
{
for (int i = 0; i < objs.Count; i++)
{
if(isRed)
{
objs[i].GetComponent<MeshRenderer>().material.color = Color.red;
}
else
{
objs[i].GetComponent<MeshRenderer>().material.color = Color.white;
}
}
}
}
创建一个类继承TrackAsset
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[TrackClipType(typeof(TimeLineEvent_Asset))]
[TrackBindingType(typeof(TimeLineEvent_Mono))]
public class TimeLineEvent_Track : TrackAsset
{
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
{
return ScriptPlayable<TimeLineEvent_Behaviour>.Create(graph, inputCount);
}
}
将TimeLineEvent_Asset脚本进行修改
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class TimeLineEvent_Asset : PlayableAsset
{
public ExposedReference<TimeLineEvent_Mono> target;
public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
{
var p = ScriptPlayable<TimeLineEvent_Behaviour>.Create(graph);
p.GetBehaviour().target = target.Resolve(graph.GetResolver());
return p;
}
}
对TimeLineEvent_Behaviour进行修改
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class TimeLineEvent_Behaviour : PlayableBehaviour
{
public TimeLineEvent_Mono target;
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
target.SetObjColor(false);
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
target.SetObjColor(true);
}
}
保存后,回到TimeLine窗口(最好关闭TimeLine窗口再打开,有时候不会刷新),右键会多了一个TimeLineEvent_Track的选项,选中它 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b29fdf4367874cf5bf9565f61c9c28d9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/67733b5c42254106af3b6bf170a08d3c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 这个时候就可以将挂载TimeLineEvent_Mono 的物体拖入进去了 在场景中创建一个空物体,和4个胶囊体,在空物体上挂载TimeLineEvent_Mono 脚本,将四个胶囊体拖入列表中, ![在这里插入图片描述](https://img-blog.csdnimg.cn/8607acdf6e53472cac3e6e86263ce1b4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 将Test物体拖入到TimeLine中 再将Test拖入到轨道上 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b9eb73e107944d96bc1ab25b4182bbe3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) 播放后,播放到相应片段上胶囊体变白,其他时候是红色的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/805619b644ce452cbd847254a95696f8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/c3c5bfad533e4bbebcf3bea63aa9a52c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDIzOTMxMzk=,size_20,color_FFFFFF,t_70,g_se,x_16)
|