Unity3D使用Timeline实现过场动画

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为2477,预计阅读6分钟

前言

在《Unity3D使用Cinemachine配合Timeline实现运镜效果》一篇中我们已经实现了简单的运镜效果,这一篇还是利用TimeLine做动画,然后通过事件触发,实现一个过场动画的效果。

format,png

实现效果

format,png

从上图中我们可以看到,利用TimeLine做了两个动画效果,一个是进门的动画,一个是出门的动画,其中除了门打开,人物跑动进入和出去,还有Cinemachine实现的镜头切换。

创建项目

format,png

微卡智享

01

创建项目

format,png

format,png

新建了一个Unity3D的项目,我们直接在资源商店下载了两个免费资源Anime Character : Arisa (Free)和School assets

format,png

导入了学校的场景后,再把我们的人物也放入到场景之中,如上图显示。

02

设置触发事件的门

format,png

上图中我们找到要触发事件的门,然后在门上加了一个Text的显示,在门中找到对应的Cube后看其本身就是一个MeshCollider,在这个Cube上我们调整旋转中Y的值,改90或是-90就可以令门进行打开或是关闭,这样我们在做TimeLine时通过调整这个Cube的Y轴旋转即可实现开关门的效果了

03

设置Cinemachine

format,png

新建一个空物体改名为Camera,然后在上面创建两个Cinemachine虚拟摄像机,其中CMPlayer绑定在人物下面的MainCamera中,并且设置为3rd Person Follow第三人称跟随。

format,png

CMMath的虚拟摄像机设置在进门后教室的位置,镜头的朝着门的方向看。

04

设置TimeLine动画

format,png

打开窗口里时间轴的界面,界面中创建一个空物体起名为TimeLine,然后在其下面再创建两个空物体分别是MathIn和MathOut,用于创建进门和出门的两个动画。

format,png

点击MathIn后在时间轴内点Create后,设置对应的保存目录及文件名,左边的时间轴就可以开始进行编辑了。

format,png

在MathIn里面开始编辑动画,上图中可以看到,我们先设置了Cinemathine的两个摄像机切换,然后Player的下面有两个动画,一个是人物的动作(分为平常动画和跑动动画),另一个是人物的位置移动。最后下面黄色框中说明的是我们的Cube_10也就是门的动画,这里就是通过修改其Y轴的旋转,实现开门和关门的效果。

完成这些动画的时间最关键的是上图中蓝框中关键帧的位置,也就是说是时间线,大概在多少帧做什么动作,每个动画前面的红色圆点点击后就是录制的功能,点开后设置其关键帧的位置后,设置对应的当前相关参数。

format,png

上面动图中可以看到设置Timeline的整个流程,这样我们就是把两个动画通过这样的方式完成了,时间轴上有一个播放按钮,如果开头的实现效果中的动画那样,在每次设置时都可以进行播放看看效果。

05

脚本编辑

上面的动画已经完成后,我们就可考虑到下一步怎么实现触发动画了,现在只做了一个门的触发,后面需要加上不能的教室播放不同的效果,所以这里播放动画的脚本应该挂载到人物身上,通过人物碰撞检测,用于判断播放哪个动画,进门和出门的动画因为不同,所以也要考虑到现在的状态是进门还是出门,用来判断播放不同的动画。

format,png

在Scripts脚本下创建了两个C#的脚本,一个是DoorController脚本控制碰撞时播放的动画,另一个PlayerStatus脚本用于处理判断人物进入的哪个门的状态。

PlayerStatus

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class PlayerStatus
{
    public Dictionary<string, bool> classroom;


    public PlayerStatus()
    {
        classroom = new Dictionary<string, bool>();
        classroom.Add("Math", false);
    }


}


里面加入一个为Dictionary<string, bool>的属性,在实例化时加入了数学Math的类,后面的bool值用于判断现在是在教室里还是教室外。

DoorController

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Playables;


public class DoorController : MonoBehaviour
{
    private PlayerStatus status = null;


    public List<Transform> timelines;


    // Start is called before the first frame update
    void Start()
    {
        status = new PlayerStatus();


        //获取TimeLine下所有设置好的动画
        GameObject go = GameObject.Find("TimeLine");
        timelines = go.GetComponentsInChildren<Transform>(true).ToList();
    }


    private void OnCollisionEnter(Collision collision)
    {
        //获取到碰撞体的标签值
        string tagname = collision.gameObject.tag;
        string playname = string.Empty;
        switch (tagname)
        {
            //当标签是数学,根据是否在教室内判断播放的动画
            case "Math":
                playname = status.classroom[tagname] ? "MathOut" : "MathIn";
                
                break;
        }


        //判断是否可以播放TimeLine
        if (!string.IsNullOrEmpty(playname))
        {
            StartCoroutine(PlayTimeLine(playname, tagname));
        }
    }


    IEnumerator PlayTimeLine(string name,string tagname)
    {
        PlayableDirector director = timelines.Find(t => t.name == name).GetComponent<PlayableDirector>();
        director.Play();


        yield return new WaitForSeconds(2f);
        //播放完后修改进屋状态
        status.classroom[tagname] = !status.classroom[tagname];
    }


}


DoorController中我们实例化了PlayerStatus,然后在Start()中把TimeLine中下面的PlayableDirctor都加载进来,在OnCollisionEnter事件中通过判断碰撞体的标签,对应PlayerStatus中的值来判断当前应该播放的动画,然后使用协程的方式进行在加载好的PlayableDirctor列表中找到对应的播放动画进行播放。播放完后再修改PlayerStatus的状态。

06

绑定脚本及触发

format,png

把我们编辑好的DoorController脚本添加到人物组件中。

format,png

然后在门的Cube_10的组件中标签页添加一个Math的标签,这个值和PlayerStatus类中的stirng值要一样,如果这里不设置的话,当人物碰撞到门的时候会什么也不触发。

这样就可以实现TimeLine过场动画的效果了,下面的实例操作视频。

format,png

扫描二维码

获取更多精彩

微卡智享

format,png

「 往期文章 」

Unity3D中使用Joystick Pack实现摇杆控制

预告——Joystick Pack使用效果

Unity3D网络通讯(六)-- UnityWebRequest实现WebService通讯

 

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Unity TimelineUnity 引擎中的一个时间轴工具,它用于创建复杂的、多阶段的动画序列。Unity Timeline 不仅可以实现动画混合,而且还提供了强大的工具和功能来实现动画的各种混合方式。 在 Unity Timeline 中,可以通过添加和编辑各种动画轨道来创建动画序列。每个动画轨道可以包含不同的动画剪辑,这些剪辑可以是来自不同的动画片段或者不同的动画控制器。通过将这些动画剪辑串联在一起,就可以实现动画的混合。 Unity Timeline 还支持混合树和混合器,这使得在动画序列中实现复杂的动画混合变得更加容易。混合树可以将多个动画状态和过渡规则组合在一起,使得在不同动作之间平滑过渡变得十分灵活。混合器则提供了一种便捷的方式来控制动画状态之间的混合过渡和权重。 除了基本的动画混合功能外,Unity Timeline 还提供了丰富的转换和修饰器功能,使得动画的混合过程更加精细化和个性化。通过调整过渡曲线、添加淡入淡出效果、调整动画速度等方式,可以实现更加平滑和自然的动画混合效果。 综上所述,Unity Timeline 可以非常方便地实现动画的混合。无论是基本的动画片段串联,还是复杂的动画混合变换,Unity Timeline 都提供了一系列强大的工具和功能来满足开发者的需求。 ### 回答2: Unity Timeline可以实现动画混合。动画混合是指将多个动画片段无缝地连接在一起,以实现更加流畅自然的动画过渡效果。在Unity中,Timeline是一个强大的工具,可以创建和编辑时间轴,控制和混合不同的动画片段。 使用Unity Timeline,我们可以将多个动画状态连接在一起,然后根据指定的规则进行混合。例如,我们可以通过控制时间曲线和变换曲线来制定动画的过渡效果。我们还可以根据需要在时间轴上添加和编辑事件,并进行动画状态之间的补间。 通过Unity Timeline,我们可以实现多种动画混合效果,如淡入淡出、平滑过渡、融合等等。我们可以根据动画状态的优先级、权重、时间曲线等来控制动画的混合效果,实现更加精细的动画控制。 总之,Unity Timeline是一个强大的工具,可以实现动画混合效果。通过使用Timeline,我们可以创建复杂、流畅的动画过渡,并且可以根据需求进行细节调整。无论是游戏开发还是其他领域的动画制作,Unity Timeline都是一个非常有用的工具。 ### 回答3: 是的,Unity Timeline可以实现动画混合。动画混合是指同时播放多个动画,使它们平滑地过渡,并按照一定的权重进行混合。Unity Timeline为开发者提供了一个可视化的时间轴编辑器,可以方便地对动画进行管理和控制。 在Unity Timeline中,我们可以创建多个动画轨道,并在每个轨道上放置不同的动画剪辑。通过设置每个动画剪辑的权重和过渡曲线,可以使动画在时间轴上平滑切换和过渡。开发者可以使用Timeline中的插值器,例如Blend Tree,来控制动画的混合过程,使不同的动画之间实现平滑的过渡效果。 此外,Unity Timeline还提供了灵活的控制选项,比如可以调整动画的播放速度、循环模式、延迟启动等。还可以通过添加事件轨道,在特定的时间点触发脚本事件,实现更高级的交互和逻辑控制。 总的来说,Unity Timeline是一个强大的工具,可以帮助开发者实现复杂的动画混合效果,使游戏或应用程序中的角色和场景动画更加丰富和流畅。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值