幽默风趣的过场动画,不仅让玩家享受片刻的安宁的同时,也会推进着故事的发展,如今的游戏,不仅仅需要我们去塑造强烈的可玩性,沉浸式的游戏体验,也是每一款优质游戏所追寻的。
从远时代RTS经典冰封王座3、真三国无双系列,近一点,比如火焰文章与后宫们之间的剧情对话、奥德赛的全球追新娘行动、动物森友会、维京纪元、灾厄启示录等等,不同的游戏中,你都能看到过场动画与对话系统的元素,那你是否想在自己的游戏中,添加电影级别的过场动画呢?
本系列视频将会介绍:如何在Unity运行的过程中触发、以及制作电影级别的(对话系统)过场动画。
先看看本文实现的最终效果
本文主要是介绍TimeLine的简单使用方法,同时结合Cinemachine演示案例,其中TimeLine是Unity2017以上版本才出现的功能,本文使用的是unity2021版本;
虚拟相机Cinemachine需要手动添加,在Window→PackageManager中添加Cinemachine
对Cinemachine不了解的同学,推荐看看发哥的这篇文章:Unity Cinemachine快速上手,详细案例讲解
素材选择用自己喜欢的就行
https://assetstore.unity.com/packages/3d/animations/zombie-animation-pack-free-150219
在场景新建空物体Tiemline,选择物体后再Timeline窗口点击Create创建,选择保存文件位置,到此timeline创建完毕
在选择Timeline物体时,在选择拖动其他物体时不小心点到timeline界面会变成选择物体的界面(没有创建),所以在对Timeline操作时可以点击Timeline右上角状态,锁定界面;
前方出现一个游荡的僵尸,先是待机状态,后发现了你,向你移动而来
创建使用虚拟相机
在Timeline上创建CinemachineTrack轨道,将MainCamera指定给轨道,拖拽CMvcam1到轨道上
再次创建一个Virtual相机,可以复制CMvcam1,然后改变相机的位置,在拖到轨道上,点击播放按钮预览场景
此时会发现相机视角是突然的变化,如果想要实现过渡效果,只需要将两个Clip片段部分重合就可以了,具体效果需要结合实际需求
运行可以看到相机的切换变得平滑了
越来越多的游戏会通过镜头语言与过场动画,来推动做事的发展,游戏会在玩家不同的游玩时间,给予玩家特定的游戏情绪,或高潮、或平静,把控玩家节奏的同时,将最新的CG技术“炫耀
"给所有的玩家,,所以~你是否想在自己的游戏中,快速掌握添加「场景对话
」的过渡呢
下面介绍如何通过脚本自定义Timeline过场动画中「对话系统
」的内容
如果要选择自定义轨道的话,要首先了解组成Timeline这一条轨道的四个组成部分
using UnityEngine;
using UnityEngine.Timeline;
public class DialogueTrack : TrackAsset { }
保存之后,你就已经成功了在Track List(轨道列表)当中单击右键,就可以创建我们的自定义【对话轨道
】了
但是你现在还是无法像大多数内置轨道一样,在轨道上单击右键,直接创建出配对轨道的对话Clip片段
比如需要绑定Rigidbody刚体
using UnityEngine;
using UnityEngine.Timeline;
//设置轨道绑定对象的类型(对话系统包括多个内容(文本框,头像文字等),不需要绑定
//如果只是单纯的字幕,可以绑定Text;
[TrackBindingType(typeof(Rigidbody))]
public class DialogueTrack : TrackAsset { }
我们其实还可以为我们自定义的每个轨道,选择自定义的颜色,比如说我们的【动画轨道】是蓝色的,我们的【Cinemachine轨道】是深红色的,通过特性【TrackColor】RGB的数值决定
using UnityEngine;
using UnityEngine.Timeline;
[TrackBindingType(typeof(Rigidbody))]
public class DialogueTrack : TrackAsset { }
新建脚本DialogueClip.cs和DialogueBehavior.cs分别继承自PlayableAsset和PlayableBehaviour
using System.Collections;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class DialogueClip : PlayableAsset
{
//pulic修饰才可以在右侧Inspector面板显示
public DialogueBehavior template = new DialogueBehavior();//一般都将变量命名为template
//继承PlayableAsset的抽象方法
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
//创建并返回Playable
var playable = ScriptPlayable<DialogueBehavior>.Create(graph, template);
return playable;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using TMPro;
// 序列化,可以在Inspector面板输入数值
[System.Serializable]
public class DialogueBehavior : PlayableBehaviour
{
private PlayableDirector playableDirector;
[Header("对话框")]
//使用ExposedReference来创建对话场景对象的应用,一般class都用这个创建对象
public ExposedReference<Transform> dialog;
private Transform _dialog;
[Multiline(3)]//定义三行文本框
public string dialogStr;
//当拥有PlayableBehaviour的Playable被创建时调用。
public override void OnPlayableCreate(Playable playable){
Debug.Log("调用OnPlayableCreate");
playableDirector = playable.GetGraph().GetResolver() as PlayableDirector;
}
//当拥有这个PlayableBehaviour的PlayableGraph启动时调用。
public override void OnGraphStart(Playable playable)
{
Debug.Log("调用OnGraphStart");
_dialog = dialog.Resolve(playable.GetGraph().GetResolver());
}
// 当Playable的状态设置为播放时调用
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
_dialog.GetComponent<TextMeshProUGUI>().text = dialogStr;
}
//类似MonoBrhavior中的Update方法,每一帧都会调用
public virtual void ProcessFrame(){
Debug.Log("调用ProcessFrame");
}
//当Playable的状态设置为暂停时调用。这是你可以重置或清理你在OnBehaviourPlay中设置的东西的地方。每执行完一次Clip,调用一次
public override void OnBehaviourPause(Playable playable, FrameData info){
//重置
_dialog.GetComponent<TextMeshProUGUI>().text = "";
}
}
using UnityEngine;
using UnityEngine.Timeline;
//DialogueClip是自定的Clip脚本
//TrackClipType定义哪种类型的Clip片段可以被添加到轨道上去
[TrackClipType(typeof(DialogueClip))]
public class DialogueTrack : TrackAsset { }
定义完Clip片段以后,在Timeline面板DialogueTrack轨道上右键就可以新建DialogueClip
Playable Director 组件存储了Timeline实例(Timeline instance)与Timeline资源(Timeline Asset)间的连接。
组件控制着Timeline实例何时播放、如何更新它的时钟(clock),以及Timeline实例播放结束后发生什么。
Playable Director组件还显示关联的Timeline资源(Playable属性)的轨道列表(Bindings属性)。
使用Playable属性手动将Timeline资源与场景游戏对象关联。
关联操作相当于为选中的Timeline资源创建一个Timeline实例(注意这些关系描述)。
创建Timeline实例后,可以使用Playable Director组件的其他属性来控制实例,并通过Timeline资源选择制作场景中哪些对象的动画。
使用Update Method属性来设置Timeline实例用来更新时间(timing)的时钟源(clock source)。 Update Method支持以下时钟源:
Play on Awake属性设置Timeline实例是否在游戏开始时就播放。
定义Timeline实例播放完成后的行为。 Wrap Mode属性还定义了Timeline编辑窗口处于Play Range模式时的情况。
Initial Time属性定义Timeline实例从时间轴的第几秒开始播放。
Bindings属性显示轨道信息及对象绑定信息。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~