查看: 75|回复: 0

[简易教程] 【Unity】TimeLine&Cinemachine系列教程——动作特写!

[复制链接]

708

主题

76

听众

7649

积分

头头

Rank: 12Rank: 12Rank: 12

发表于 2020-11-30 09:41 |显示全部楼层
前言:
上一篇简单的对TimeLine功能有了简单的了解,这一期依然从TimeLine的特性入手,用引擎自身的功能完成我们该篇目的——动作特写。这里会介绍到一款专业的镜头插件Cinemachine,可以很方便的制作镜头跟踪和切换的效果。


(该篇动图较多,先做流量预警-。-)


效果预览:








首先先介绍今天的特约嘉宾——Cinemachine


先看下他的能力:
1.跟踪功能






2.自由视角






3.轨道相机






4.多个目标处理






当然能力不仅仅是这些,他能很方便解决多个镜头切换之间插值效果,和智能选择镜头机位。这里就先不多细讲了。


先看一下他的组件


创建一个虚相机






















/*Cinemachine的所有镜头处理都是一个虚拟相机控制游戏中的主摄像机来实现的,意思是整个游戏内不会创建新的摄像机*/
参数介绍:
Priority:优先级,当有多个摄像机存在时,选用优先级最高的摄像机。
LookAt:摄像机观察的物体
Follow:摄像机跟随的物体
Lens:摄像机的常规设置,这里就不多说了。
Aim:主要是修改摄像机观察物体在镜头内的位置














先说基本的:
Damping:可以设置水平和竖直方向上的阻尼效果
ScreenXY:屏幕中心位置,一般都不会修改
BiasXY:SoftZone的偏移位置


关于DeadZone和SoftZone多说无益直接看修改效果:






可以理解摄像机的一个无反应区域DeadZone(转向死间,即无反应区), 摄像机在DeadZone区域外将会发生位移,让目标点始终处于DeadZone中。






SoftZone则是当目标是在这个地区,相机将逐渐重新调整到理想的位置,根据系统的阻尼速度。
Body:






FollowOffset:跟随位置的偏移,比如我设置跟随物体为A角色,摄像机偏移A角色到他上方2米后方3米的位置






Damping:物体跟随的阻尼效果
Binding Mode:






如果摄像机要根据观察目标的坐标旋转变换做变换,比如旋转,就需要修改BindingMode为Lock To Target
修改后,模型旋转会带动摄像机旋转








最后一个为噪音功能,先不做细讲。可以用于模拟手持摄像机的感觉。


好了,到这里各位应该对Cinemachine有了初步的了解。




实战开始~


初始镜头创建
首先创建一个群组目标的摄像机






创建好后会出现两个物体






我们在targerGroup选择要出现在摄像机内的两个模型目标






可以修改摄像机主要偏向的权重,这里用平均的就可以。






之后将摄像机看向targerGroup物体,调节body偏移位置。






场景中能直接看到设置的效果








我们改变了下物体的位置,发现距离过近后摄像机会非常靠前。我们可以修改CM vcam1上的Minmum Distance为2,就可以防止出现摄像机过近的问题。








TimeLine动画创建
不管做任何事情都需要有调理的去做,因此最好能先创建好TrackGroup分个组,然后我们先创建好主角的动画。






我们将要播放的动画直接拖到动画轨道上就可以,而且还可以处理融合。






但是当角色移动和跳跃如果利用动画本身来做有时候不好调整打击时间。所以我们就要利用到Override功能。






它可以很方便的在角色播放动画的时候,再对角色进行动画覆盖,比如角色正在播放跑步动画,我们可以覆盖上移动的动画,实现角色跑向目标。
Override功能的时间轨道双击就成了我们经常用到的Animation编辑器。在这里调节好不同时间角色位置,实现TimeLine播放时的位置匹配。






Animation里面的调节也很方便的查看每帧调节的效果






之后再做一个敌人配合Unity娘的殴打,同样的需要Override动画位移








目前的效果








这里有个动画知识点需要扩展:
很多模型的动画都会有修改骨骼点位置,Unity的Animator有一个选项






勾选后模型的的位置会跟随骨骼根节点的位置移动,但是有时候我们不想让动画直接修改物体的位移变化,比如我们要自定义跳跃的高度和位移距离,这里最好就要屏蔽掉动画的位移。
怎么屏蔽呢?将模型动画类型改为人形骨骼。






在Animations选项中可以看到,Root Transforem XXX的选项,分别对应是否会旋转、高度变化、XZ平面变化。






我这里屏蔽了升龙拳的前后位移变化,这样我们就可以自己定义动画的距离。




TimeLine镜头控制
点击Add创建Cinemachine






先把我们的默认摄像机放入轨道






创建一个新的摄像机,这个摄像机选好位置后一直看向Unity娘~






同样拖入轨道






TimeLine会将摄像机重叠的地方做插值,这样镜头切换就显得非常平滑。








特效添加
之前找半天没找到特效添加的地方,结果发现TimeLine是用Control Track控制轨道来实现的。






给轨道添加一个Clip来控制资源






可以看到Control属性是这样的,先简单介绍一下属性意义






Source Game Object:用做选择场景内的物体,选择的物体将会在TimeLine运行到该Clips时激活。
(如果直接用物体激活来做,不能在编辑模式下看到粒子的变化)
Prefab:选择项目的预制体资源,如果选择好预制体后,Source Game Object会修改为Parent Object,代表生成的预制体将会放在哪个场景物体下。






加入的特效可以来回拖动看实际效果








时间缩放
动作游戏里面增加打击感经常会用到时间缩放,同时TimeLine里面目前没有找到可以加速播放的地方,所以就需要先手写一个时间缩放功能。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Playables;
  5. using UnityEngine.Timeline;
  6. public class PlayableTime : BasicPlayableBehaviour
  7. {
  8.    /// <summary>
  9.    /// 曲线
  10.    /// </summary>
  11.    public AnimationCurve mCurve;
  12.    /// <summary>
  13.    /// 当前时间进度
  14.    /// </summary>
  15.    private float curTime;
  16.    /// <summary>
  17.    /// 最大时间
  18.    /// </summary>
  19.    private float maxTime;
  20.         public override void OnGraphStart(Playable playable) {
  21.         }
  22.         public override void OnGraphStop(Playable playable) {
  23.        Time.timeScale = 1;
  24.    }
  25.    public override void OnBehaviourPlay(Playable playable, FrameData info)
  26.    {
  27.        maxTime= (float)PlayableExtensions.GetDuration(playable);
  28.    }
  29.         public override void OnBehaviourPause(Playable playable, FrameData info) {
  30.    }
  31.    public override void PrepareFrame(Playable playable, FrameData info)
  32.    {
  33.        curTime += info.deltaTime;
  34.        //曲线值
  35.        Time.timeScale = mCurve.Evaluate(curTime/ maxTime);
  36.    }
  37. }
  38.    // Called each frame while the state is set to Play
  39.    public override void PrepareFrame(Playable playable, FrameData info)
  40.    {
  41.        curTime += info.deltaTime;
  42.        Time.timeScale = mCurve.Evaluate(curTime/ maxTime);
  43.    }
  44. }
复制代码
写好后添加到PlayableTrack ,






添加我们的PlayableTime作为Clips,曲线值作为我们的时间缩放值。






将我们正在踢到敌人的那一帧时间缩放为0.01倍时间,实现顿帧效果。






实现的时间瞬间静止的感觉






/*这里不得不提一下,我们自定义的Clips也能再TimeLine里面实现插值效果,Time.timeScale的效果会在两个Clips之间融合变化。(简直非常方便到炸裂)*/








总结
TimeLine结合Cinemachine可以实现很棒的影视游戏效果,而且方便在编辑的时候直接看效果,做到来回拖动看细节,同时还能解决片段与片段之间的融合插值效果。调节起来非常的方便,而且自定义的脚本也很容易放入TimeLine中做效果。
而如果拿TimeLine做游戏开发还需要脚本动态修改TimeLine的值,不然就算能做一个非常好的游戏效果,不能运用再实际项目中,一切都是空谈。
下一篇将会讲解代码控制TimeLine,如何实现动态修改TimeLine的参数,让TimeLine嵌入我们的游戏之中,尽请期待~




附上源码:
https://github.com/chs71371/TimeLine










对游戏开发感兴趣的同学,欢迎围观我们:【皮皮关游戏开发教育】 ,会定期更新各种教程干货,更有别具一格的线下小班教育。在你学习进步的路上,有皮皮关陪你!~
我们的官网地址:http://levelpp.com/
我们的游戏开发技术交流群:610475807
我们的微信公众号:皮皮关

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

楼主热帖
人人为我 我为人人 互相分享 互相学习 互相进步 一带一路
温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐 上一条 /1 下一条

Unity游戏引擎开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2021-1-23 14:47 , Processed in 0.103751 second(s), 38 queries .