TimeLine 的使用说明

一、关于 TimeLine

Timeline是一套基于时间轴的多轨道动画系统,它支持可视化编辑,实时预览。

这一个技术相对于其他动画系统,最大的区别就是,

Timeline可以针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现电影级的那种分镜效果。

二、安装Timeline

打开 Package Manager,安装 TimeLine ,可以通过 Package Manager 进行更新。

三、创建一个 Timeline

点击顶部的导航栏:window - Sequencing - TimeLine , 此时会打开 Timeline 窗口 ,它提示你需要选中一个 GameObject

 在 Hierarchy 视图面板中,选中一个节点, Timeline窗口中会出现一个 Create 按钮

点击 Create 按钮即可创建 Timeline 资源(格式为 .playable ),我将他命名为 :BeforeBattleTimeline.playable
 

我们还会发现,我们选中的物体,自动挂了 Playable Director 和 Animator 组件, 并自动引用了 Timeline 资源
 

四:TimeLine 上的按钮说明
 

1.移动到起始位置按钮,点击这个按钮可以将时间轴移动到最开始的位置

2. 移动到前一帧按钮,将时间轴移动到前一帧

3.播放按钮,点击播放按钮后,会播放Timeline,可以在场景中预览动画效果。快捷键是空格。进入播放模式后:

从当前时间轴所在的位置开始播放,直到最后。如果范围播放按钮启用的话,播放会限定在指定的时间区域内。

时间轴播放时会跟随移动,时间轴的区域会显示当前的时间或者帧数,取决于Timeline 的设置。

4. 点击后移动到下一帧

5. 点击后移到Timeline的最后一帧

6.范围播放按钮 , 启用范围播放按钮后,可以在指定范围内预览播放。注意只能在Timeline窗口中预览时生效,在运行模式下会忽略范围设置。

时间轴上会显示开始和结束的位置,可以拖动开始或结束的小图标来修改范围。

五:时间轴

Timeline窗口中的时间轴显示了当前预览的位置。时间轴上显示了当前的帧数或者时间。此外,滚动条上也有一个小的白竖线,代表了时间轴的位置。如下图所示:

六、各种 Track 介绍,以及使用说明

在 Timeline 窗口左侧栏右键菜单,可以创建多种轨道

轨道 描述

Track Group 将不同的轨道进行分类,相当于文件夹功能

Activation Track 控制物体的显示和隐藏

Animation Track 为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip

Audio Track 为动画添加音效,并可对音效进行简单的裁剪和操作

Control Track 在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套

Signal Track 信号轨道,可以发送信号,触发响应信号的函数调用

Playable Track 在该轨道中用户可以添加自定义的播放功能

添加 track 之前,先选中 BeforeBattle 节点,TimeLine 面板右侧的小锁,点击它 ,锁上它。

Activation Track

这个轨道是控制物体的显示和隐藏, Character_Heavy_Male_Axe 这个节点,在 Active 时间轴内,可见。

Animation Track

在 timeLine 面板上创建 Animation Track 

将物体拖动到 Animation Track 的物体槽中时,如果物体没 有 Animator 组件,会提示为物体挂一个 Animator 组件


然后点击 TimeLine 左边面板的红色按钮,开始录制,记录初始位置坐标信息,我们还可以在轨道上 右键菜单 - Edit in Animation Window,打开 Animation 窗口来编辑动画

 

直接添加动画方式。在 track 上 右键菜单 - Add From Animation Clip,选择美术同事已经制作好的 Animation 动画直接拖入 track 中。 Audio Track

为动画添加音效,并可对音效进行简单的裁剪和操作,选中音效资源,直接拖入

 Control Track

可以用来控制粒子效果,事先制作好的 prefab Rain ,它的 Inspector 面板上,添加了 Particle System 组件,将 Rain Prefab 拖到 Hierarchy 中.

TimeLine 中添加 Control Track ,可以实现控制 Particle 。

 Control Track 

还可以嵌套 TimeLine , 先用 GO 节点创一个 subTimeLine ,后在 BeforeBattleTYimeline 中创建一个 Control Track ,直接将 GO 拖动下来,从而实现 TimeLine 嵌套

Signal Track

可以发送信号,触发响应信号的函数调用

在 Hierachy 中创建一个空物体,命名为 SignalReceiver , 另外在创建一个脚本命名为 SignalTest.cs, 挂到 SignalReceiver 上(会自动绑定挂上 SignalReceiver 组件),用于响应信号

代码如下:

using UnityEngine;
using UnityEngine.Timeline;
[RequireComponent(typeof(SignalReceiver))]
public class SignalTest : MonoBehaviour 
{
    // 信号的响应函数
    public void OnReceiveSignal()
    {
        Debug.Log("OnReceiveSignal: Hello Signal");
    }
}

 SignalReceiver 节点 Inspector 面板上添加 SignalTest.cs 组件,它会自动添加 Signal Receive 组件,

创建 Signal Track 轨道,设置响应物体 在 Timeline 中创建 Signal Track 信号轨道 

 创建信号发射器Signal Emitter

在Project 视图右键菜单选择 - Create - Signal, 创建一个信号发射器资源(Signal Emitter) 命名为:TestSignalEmiter.signal

将信号发射器拖到 track 上, 如图:白色箭头样式
 给信号发射器设置响应函数:点击轨道上的信号发射器,在 Inspector 视图中会显示信号信息,Add Reaction 按钮,添加信号的响应函数

默认信号监听对象就是 SignalReceiver 组件所在的物体
 点击 No Function 可以列出物体上的组件和组件中的所有 public 属性和方法,这里我们设置响应函数为 SignalTest 脚本的 OnReceiverSignal 函数

启动运行工程,时间轴走到 箭头处,发射事件,监听到输出,正常输出。
 

Playable Track

可以添加自定义的播放功能 ,PlayableAsset 和 PlayableBehaviour 脚本 需要写两个类,一个继承 PlayableAsset ,一个继承 PlayableBehaviour

MoveObjPlayableAsset.cs 文件:
 

using UnityEngine;
using UnityEngine.Playables;
public class MoveObjPlayableAsset : PlayableAsset
{
    public GameObject go;
    public Vector3 pos;
    
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var bhv = new MoveObjPlayableBehaviour();
        bhv.go = go;
        bhv.pos = pos;
        return ScriptPlayable<MoveObjPlayableBehaviour>.Create(graph, bhv);    
    }
    
}

 MoveObjPlayableBehaviour.cs 代码如下:
 

using UnityEngine;
using UnityEngine.Playables;

public class MoveObjPlayableBehaviour : PlayableBehaviour
{
    public GameObject go;
    public Vector3 pos;

    public override void OnGraphStart(Playable playable)
    {
        base.OnGraphStart(playable);

        Debug.Log("OnGraphStart=======================");
    }

    public override void OnGraphStop(Playable playable)
    {
        base.OnGraphStop(playable);
        Debug.Log("OnGraphStop=======================");
    }

    public override void OnBehaviourPlay(Playable playable, FrameData info)
    {
        // 这里的逻辑是改变物体的坐标,具体逻辑就看具体需求
        base.OnBehaviourPlay(playable, info);
        Debug.Log("OnBehaviourPlay=======================");
        if (null != go)
        {
            go.transform.position = pos;
        }
    }

    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
        base.OnBehaviourPause(playable, info);
        Debug.Log("OnBehaviourPause=======================");
        if (null != go)
        {
            go.transform.position = Vector3.zero;
        }
    }

    public override void OnBehaviourDelay(Playable playable, FrameData info)
    {
        base.OnBehaviourDelay(playable, info);
        Debug.Log("OnBehaviourDelay=======================");
    }
}

 将 PlayableAsset 拖到轨道上

将 MoveObjPlayableAsset 脚本直接拖动到 PlayableTrack 轨道上,具体的脚本逻辑在 MoveObjPlayableBehaviour 中实现,本例是设置物体的坐标

动态设置 PlayableAsset 参数

现在,我们另外写一个脚本( Runner.cs ),运行的时候动态地给 MoveObjPlayableAsset 设置 GO 对象。

首先我们将轨道名字改成 PlayableTrackTest1 ,因为下面的代码需要通过名字来获取改轨道对象。

把 Runner.cs 脚本挂到 Timeline 物体上,并赋值 Timeline 变量 和 Cube 变量 ,如下

 Runner.cs 代码如下:
 

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class Runner : MonoBehaviour
{
    public PlayableDirector timelinePlayer;
    public GameObject cube;

    void Start()
    {
        var timeline = timelinePlayer.playableAsset;
        foreach (var binding in timeline.outputs)
        {
            // 轨道名
            var trackName = binding.streamName;
            if ("PlayableTrackTest1" == trackName)
            {
                // 轨道
                var track = binding.sourceObject as TrackAsset;
                // 轨道上的片段,每个片段都是PlayableAsset的子类
                var clipList = track.GetClips();
                foreach (var clip in clipList)
                {
                    if (clip.asset is MoveObjPlayableAsset)
                    {
                        var moveObjPlableAsset = clip.asset as MoveObjPlayableAsset;
                        // 动态设置go对象的坐标
                        moveObjPlableAsset.go = cube;
                        moveObjPlableAsset.pos = new Vector3(-4.91f, 0, 0);
                        break;
                    }
                }
            }
        }
    }
}

 Recorder Track

 直接启动项目就可以录制,Inspector 面板上会显示录制的路径

输出如下
 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值