【Unity】TimeLine&Cinemachine系列教程——動作特寫!

前言:
上一篇簡單的對TimeLine功能有了簡單的了解,這一期依然從TimeLine的特性入手,用引擎自身的功能完成我們該篇目的——動作特寫。這里會介紹到一款專業(yè)的鏡頭插件Cinemachine,可以很方便的制作鏡頭跟蹤和切換的效果。
(該篇動圖較多,先做流量預警-。-)
效果預覽:

首先先介紹今天的特約嘉賓——Cinemachine
先看下他的能力:
1.跟蹤功能

2.自由視角

3.軌道相機

4.多個目標處理

當然能力不僅僅是這些,他能很方便解決多個鏡頭切換之間插值效果,和智能選擇鏡頭機位。這里就先不多細講了。
先看一下他的組件:
創(chuàng)建一個虛相機



/*Cinemachine的所有鏡頭處理都是一個虛擬相機控制游戲中的主攝像機來實現(xiàn)的,意思是整個游戲內(nèi)不會創(chuàng)建新的攝像機*/
參數(shù)介紹:
Priority:優(yōu)先級,當有多個攝像機存在時,選用優(yōu)先級最高的攝像機。
LookAt:攝像機觀察的物體
Follow:攝像機跟隨的物體
Lens:攝像機的常規(guī)設置,這里就不多說了。
Aim:主要是修改攝像機觀察物體在鏡頭內(nèi)的位置


先說基本的:
Damping:可以設置水平和豎直方向上的阻尼效果
ScreenXY:屏幕中心位置,一般都不會修改
BiasXY:SoftZone的偏移位置
關于DeadZone和SoftZone多說無益直接看修改效果:

可以理解攝像機的一個無反應區(qū)域DeadZone(轉(zhuǎn)向死間,即無反應區(qū)), 攝像機在DeadZone區(qū)域外將會發(fā)生位移,讓目標點始終處于DeadZone中。

SoftZone則是當目標是在這個地區(qū),相機將逐漸重新調(diào)整到理想的位置,根據(jù)系統(tǒng)的阻尼速度。
Body:

FollowOffset:跟隨位置的偏移,比如我設置跟隨物體為A角色,攝像機偏移A角色到他上方2米后方3米的位置

Damping:物體跟隨的阻尼效果
Binding Mode:

如果攝像機要根據(jù)觀察目標的坐標旋轉(zhuǎn)變換做變換,比如旋轉(zhuǎn),就需要修改BindingMode為Lock To Target
修改后,模型旋轉(zhuǎn)會帶動攝像機旋轉(zhuǎn)

最后一個為噪音功能,先不做細講??梢杂糜谀M手持攝像機的感覺。
好了,到這里各位應該對Cinemachine有了初步的了解。
實戰(zhàn)開始~
初始鏡頭創(chuàng)建
首先創(chuàng)建一個群組目標的攝像機

創(chuàng)建好后會出現(xiàn)兩個物體

我們在targerGroup選擇要出現(xiàn)在攝像機內(nèi)的兩個模型目標

可以修改攝像機主要偏向的權重,這里用平均的就可以。

之后將攝像機看向targerGroup物體,調(diào)節(jié)body偏移位置。

場景中能直接看到設置的效果

我們改變了下物體的位置,發(fā)現(xiàn)距離過近后攝像機會非??壳啊N覀兛梢孕薷腃M vcam1上的Minmum Distance為2,就可以防止出現(xiàn)攝像機過近的問題。

TimeLine動畫創(chuàng)建
不管做任何事情都需要有調(diào)理的去做,因此最好能先創(chuàng)建好TrackGroup分個組,然后我們先創(chuàng)建好主角的動畫。

我們將要播放的動畫直接拖到動畫軌道上就可以,而且還可以處理融合。

但是當角色移動和跳躍如果利用動畫本身來做有時候不好調(diào)整打擊時間。所以我們就要利用到Override功能。

它可以很方便的在角色播放動畫的時候,再對角色進行動畫覆蓋,比如角色正在播放跑步動畫,我們可以覆蓋上移動的動畫,實現(xiàn)角色跑向目標。
Override功能的時間軌道雙擊就成了我們經(jīng)常用到的Animation編輯器。在這里調(diào)節(jié)好不同時間角色位置,實現(xiàn)TimeLine播放時的位置匹配。

Animation里面的調(diào)節(jié)也很方便的查看每幀調(diào)節(jié)的效果

之后再做一個敵人配合Unity娘的毆打,同樣的需要Override動畫位移

目前的效果

這里有個動畫知識點需要擴展:
很多模型的動畫都會有修改骨骼點位置,Unity的Animator有一個選項

勾選后模型的的位置會跟隨骨骼根節(jié)點的位置移動,但是有時候我們不想讓動畫直接修改物體的位移變化,比如我們要自定義跳躍的高度和位移距離,這里最好就要屏蔽掉動畫的位移。
怎么屏蔽呢?將模型動畫類型改為人形骨骼。

在Animations選項中可以看到,Root Transforem XXX的選項,分別對應是否會旋轉(zhuǎn)、高度變化、XZ平面變化。

我這里屏蔽了升龍拳的前后位移變化,這樣我們就可以自己定義動畫的距離。
TimeLine鏡頭控制
點擊Add創(chuàng)建Cinemachine

先把我們的默認攝像機放入軌道

創(chuàng)建一個新的攝像機,這個攝像機選好位置后一直看向Unity娘~

同樣拖入軌道

TimeLine會將攝像機重疊的地方做插值,這樣鏡頭切換就顯得非常平滑。

特效添加
之前找半天沒找到特效添加的地方,結(jié)果發(fā)現(xiàn)TimeLine是用Control Track控制軌道來實現(xiàn)的。

給軌道添加一個Clip來控制資源

可以看到Control屬性是這樣的,先簡單介紹一下屬性意義

Source Game Object:用做選擇場景內(nèi)的物體,選擇的物體將會在TimeLine運行到該Clips時激活。
(如果直接用物體激活來做,不能在編輯模式下看到粒子的變化)
Prefab:選擇項目的預制體資源,如果選擇好預制體后,Source Game Object會修改為Parent Object,代表生成的預制體將會放在哪個場景物體下。

加入的特效可以來回拖動看實際效果

時間縮放
動作游戲里面增加打擊感經(jīng)常會用到時間縮放,同時TimeLine里面目前沒有找到可以加速播放的地方,所以就需要先手寫一個時間縮放功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class PlayableTime : BasicPlayableBehaviour
{
/// <summary>
/// 曲線
/// </summary>
public AnimationCurve mCurve;
/// <summary>
/// 當前時間進度
/// </summary>
private float curTime;
/// <summary>
/// 最大時間
/// </summary>
private float maxTime;
public override void OnGraphStart(Playable playable) {
}
public override void OnGraphStop(Playable playable) {
Time.timeScale = 1;
}
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
maxTime= (float)PlayableExtensions.GetDuration(playable);
}
public override void OnBehaviourPause(Playable playable, FrameData info) {
}
public override void PrepareFrame(Playable playable, FrameData info)
{
curTime += info.deltaTime;
//曲線值
Time.timeScale = mCurve.Evaluate(curTime/ maxTime);
}
}
// Called each frame while the state is set to Play
public override void PrepareFrame(Playable playable, FrameData info)
{
curTime += info.deltaTime;
Time.timeScale = mCurve.Evaluate(curTime/ maxTime);
}
}
寫好后添加到PlayableTrack ,

添加我們的PlayableTime作為Clips,曲線值作為我們的時間縮放值。

將我們正在踢到敵人的那一幀時間縮放為0.01倍時間,實現(xiàn)頓幀效果。

實現(xiàn)的時間瞬間靜止的感覺

/*這里不得不提一下,我們自定義的Clips也能再TimeLine里面實現(xiàn)插值效果,Time.timeScale的效果會在兩個Clips之間融合變化。(簡直非常方便到炸裂)*/

總結(jié)
TimeLine結(jié)合Cinemachine可以實現(xiàn)很棒的影視游戲效果,而且方便在編輯的時候直接看效果,做到來回拖動看細節(jié),同時還能解決片段與片段之間的融合插值效果。調(diào)節(jié)起來非常的方便,而且自定義的腳本也很容易放入TimeLine中做效果。
而如果拿TimeLine做游戲開發(fā)還需要腳本動態(tài)修改TimeLine的值,不然就算能做一個非常好的游戲效果,不能運用再實際項目中,一切都是空談。
下一篇將會講解代碼控制TimeLine,如何實現(xiàn)動態(tài)修改TimeLine的參數(shù),讓TimeLine嵌入我們的游戲之中,盡請期待~
附上源碼:
https://github.com/chs71371/TimeLine
對游戲開發(fā)感興趣的同學,歡迎圍觀我們:【皮皮關游戲開發(fā)教育】 ,會定期更新各種教程干貨,更有別具一格的線下小班教育。在你學習進步的路上,有皮皮關陪你!~
我們的官網(wǎng)地址:http://levelpp.com/
我們的游戲開發(fā)技術交流群:610475807
我們的微信公眾號:皮皮關