Unity Timeline使用
1.創(chuàng)建Timeline:打開面板Window->Sequencing->Timeline
(1.1)選擇一個要添加 Timeline 的物體,我創(chuàng)建一個物體就叫 Timeline(可以隨意命名),選擇Timeline,然后在面板上顯示 Create 按鈕,如下
點 Create 按鈕,保存一個 *.playable 的文件,然后自動給Timeline物體添加一個 PlayableDirector 腳本
腳本參數(shù) Playable :TestTimeline 就是創(chuàng)建的 TestTimeline.playable 文件
Play On Awake:勾選則自動播放
選擇GameObject Timeline可以看到 Timeline 面板
2.創(chuàng)建Activation Track (顯示/隱藏物體軌道
(2.1)在左側(cè)空白處,鼠標(biāo)右鍵,選擇 ActivationTrack
(2.2) 創(chuàng)建一個 Cube,為了方便管理,放在 Timeline 下方
然后拖拽到 Activation 軌道的目標(biāo)物體上
右側(cè)Active區(qū)域是Cube物體顯示的時間區(qū)域(Timeline執(zhí)行到這個時間段,物體是顯示的,在這個時間段之外時,物體都是隱藏的)
可以左右拖動,可以把鼠標(biāo)放在左右兩側(cè)拉長時間區(qū)域
(2.3)點擊左側(cè)對勾區(qū)域,Post-playback state
Active狀態(tài):Timeline完成播放時,將綁定的游戲?qū)ο蟮臓顟B(tài)設(shè)置為激活(顯示)狀態(tài)
Inactive狀態(tài):Timeline完成播放時,將綁定的游戲?qū)ο蟮臓顟B(tài)設(shè)置為停用(隱藏)狀態(tài)
Revert狀態(tài):Timeline開始播放之前,將綁定的游戲?qū)ο蟮臓顟B(tài)設(shè)置為停用(隱藏)狀態(tài)
Leave As Is狀態(tài):Timeline完成播放時,綁定的對象狀態(tài)是顯示的就設(shè)置為顯示狀態(tài),Timeline完成播放時,綁定的對象狀態(tài)是隱藏的,就設(shè)置為隱藏狀態(tài)
名詞解釋:
**Timeline完成播放時:**Timeline播放時間到,所有軌道結(jié)束時,才是Timeline完成播放時
(2.4)選擇軌道上的 Active,在 Inspector 面板上可以看到參數(shù)
Start:開始時間(秒) f:幀(60幀/秒)
End:結(jié)束時間(秒)
Duration:持續(xù)時間(秒)
(2.4.1)選擇掛Playable Director 腳本的GameObject,在 Timeline窗口左上角,點擊三角預(yù)覽播放
(2.4.2)直接運行Unity也可以預(yù)覽播放
(3)創(chuàng)建 Animation Track (動畫軌道)
(3.1)空白位置鼠標(biāo)右鍵,選擇 Animation Track
創(chuàng)建一個 Cube 拖拽到 None 位置
提示 Create Animator on Cube:添加Animator 組件到Cube上,點擊Create 即可,自動在 Cube 上掛一個Animator 組件
(3.2)添加動畫幀
在軌道空白位置鼠標(biāo)右鍵
Create Annotation from clipboard contents:創(chuàng)建一個動畫幀,在動畫軌道上出現(xiàn)標(biāo)簽如下
AddFrom Animation Clip:彈出窗口選擇一個現(xiàn)有的動畫幀
也可以直接將一個動畫幀拖拽到軌道上,如角色預(yù)制體拖拽到左側(cè)作為綁定對象,然后將角色的動畫拖拽到軌道上即可實現(xiàn)播放
(3.3) 創(chuàng)建 Create Annotation from clipboard contents
(3.3.1)點擊左側(cè)紅色圓圈,開始錄制,在軌道上顯示紅色并且有 Recoding… 字體提示
然后選擇綁定的對象 Cube,在Inspector面板上,可以選擇Cube上添加的可用組件添加動畫幀
如Transform,可以分別在 Position、Rotation、Scale 位置鼠標(biāo)右鍵 彈框選擇 AddKey
點擊 AddKey將在左側(cè)軌道下方出現(xiàn)選擇的屬性,點擊下方圖中紅色位置,可以顯示隱藏編輯屬性
展開如下
(3.3.2)在軌道區(qū)域雙擊打開動畫編輯窗口
切換到 Curves 編輯動畫
(3.3.3)左上角Recorded為保存的動畫名,動畫存放在當(dāng)前編輯的TestTimeline.playable 下方,如下圖,保存多個動畫會自動命名為 Recorded(1)、Recorded(2)、Recorded(3)…
(3.3.4)點擊動畫軌道上的動畫幀,在Inspector面板查看參數(shù),如下
Track Offsets:將相同的位置和旋轉(zhuǎn)偏移應(yīng)用到動畫軌道上所有的動畫片段
- Position: 添加控制Position 動畫幀
- Rotation: 添加控制 Rotation 動畫幀
Apply Foot IK:啟用動畫反向動力學(xué)功能
Apply Avatar Mask:啟動/禁用動畫骨骼遮罩,啟動遮罩時,所選的遮罩會應(yīng)用到當(dāng)前動畫軌道上所有的動畫片段
Default Offset Match Fields:動畫軌道上所有的動畫片段在進行匹配片段偏移時,選擇默認(rèn)的匹配選項
(3.4)AddFrom Animation Clip 添加一個現(xiàn)有動畫幀
(3.4.1)將角色拖拽到左側(cè)綁定
模型需要添加Animator腳本
Animator屬性Controller為空即可
(3.4.2)在右側(cè)軌道右鍵 AddFrom Animation Clip 或者拖拽一個動畫幀到軌道上
運行或者預(yù)覽即可查看動畫播放
(3.4.3)在軌道上選擇動畫幀,在Inspector面板查看參數(shù)
可以修改片段的名稱
(3.4.3.1)Clip Timing 屬性包含一下內(nèi)容
Start:動畫片段開始時間
End:動畫片段結(jié)束時間
Duration:動畫片段持續(xù)時間
Ease In Duration:淡入動畫片段所需時間
Ease Out Duration:淡出動畫片段所需時間
(3.4.3.2)
Pre-Extrapolate:設(shè)置該動畫幀開始播放前的狀態(tài),該屬性會影響動畫片段的淡入
None:在播放clip前Capsule會保持真實位置而不是動畫位置
Hold:在播放clip前Capsule會保持第一幀動畫位置
Loop:在播放clip前不停循環(huán)clip,保證在clip開始前動畫內(nèi)容正好播到結(jié)尾,不過開頭不一定(主要看留出時間)
Ping Pong:會播放來回clip(會自動補動畫),保證在clip開始時機前動畫內(nèi)容正好回到開頭
Continue:只能在unity運行時查看,保持的是Loop或Hold選項的狀態(tài)
Post-Extrapolate:設(shè)置動畫片段的后外推,該屬性影響動畫片段的淡出
(3.4.3.3)Blend Curves:包含以下屬性
In:自動/手動調(diào)整動畫片段的淡入曲線
Out:自動/手動調(diào)整動畫片段的淡出曲線
(3.4.3.4) Animation Playable Asset:包含以下屬性
Clip Transform Offsets:將位置和旋轉(zhuǎn)偏移應(yīng)用于所選動畫片段的根運動
Offset Match Fields:進行匹配片段偏移時,在片段級別上設(shè)置的匹配選項
(3.4.4)動畫融合,拖拽兩個動畫相互穿插控制融合時間
(4) 創(chuàng)建 Audio Track (音效軌道)播放音效
(4.1)軌道添加音效
軌道空白處右鍵 Add From Audio Clip 或者直接將音效拖拽到軌道上
(4.2)音效參數(shù)
點擊軌道上音效片段,Inspector 面板查看參數(shù)
(4.2.1)Audio Playable Asset:包含以下屬性
Clip:選擇音頻片段使用的音頻文件。
Loop:設(shè)置音頻片段是否循環(huán)播放。
Volume:設(shè)置音頻片段的音量。
(5)Signal Track:信號軌道,發(fā)射信號,相當(dāng)于發(fā)送一個事件
(5.1)在TimeWindow面板左側(cè)空白區(qū)域,右鍵選擇 Signal Track
創(chuàng)建后顯示如上,
(5.2)創(chuàng)建一個接收信號的 GameObject,我命名為 SingleReceiveObj,然后拖拽到左側(cè) None(Signal Receiver) 位置,提示添加 Create Signal Receiver 腳本,選擇 Create 即可在 GameObject 上自動掛 Signal Receiver 腳本,如下
(5.3) 在信號軌道空白處右鍵添加一個發(fā)射器
Add Signal Emitter:創(chuàng)建一個信號發(fā)射器,發(fā)射器顯示如下
點擊信號發(fā)射器看Inspector 面板,Emit Signale 位置可以選擇已經(jīng)創(chuàng)建的發(fā)射器
Time:發(fā)射信號的時間
Retroactive:
EmitOnce:勾選后只會發(fā)射一次信號
Emit Signal:選擇一個發(fā)射信號Asset,可以復(fù)用之前創(chuàng)建的,也可以選擇 Create Signal 創(chuàng)建一個
Add Signal Emitter From Signal Asset: 會打開選擇窗口,可以選擇已經(jīng)創(chuàng)建的發(fā)射器
(5.4)配置接收函數(shù)
// 創(chuàng)建一個接收信號的腳本,類名隨意
public class SignalReceiveTest : MonoBehaviour
{
public void OnTimelineSignal()
{
Debug.LogError("收到信號了");
}
}
將 SignalReceiveTest
腳本掛到 SingleReceiveObj
物體上
在 Signal Receiver 下方點擊 AddReaction
點擊 +
選擇 Runtime,在 NoFunction 處下拉選擇 SignalReceiveTest
腳本上的 OnTimelineSignal
函數(shù)
運行預(yù)覽,時間軸執(zhí)行到信號發(fā)射器位置時,將會調(diào)用到 OnTimelineSignal 函數(shù)
(5.5).自定義信號
(5.5.1)新建信號發(fā)射類,繼承 SignalEmitter
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
// 自定義的信號
public class CustomSignal : SignalEmitter
{
// 自定義參數(shù)
public string eventName;
public int param;
}
創(chuàng)建一個 Signal Track 軌道,然后在右側(cè)右鍵,如下可以看到新建的信號發(fā)射器
創(chuàng)建一個接收信號的GameObject我命名為 CustomSignalReceiverObj
,添加 SngnalReceiver
腳本,并拖拽到信號軌道
(5.5.2)選擇新創(chuàng)建的 Custom Signal,在Inspector 面板可以看到 CustomSignal 類的兩個參數(shù) eventName和 param,可以手動輸入?yún)?shù)值
(5.5.3) 創(chuàng)建信號接收類
/// <summary>
/// 自定義信號接收器
/// </summary>
public class CustomSignalReceiver : MonoBehaviour, INotificationReceiver
{
public void OnNotify(Playable origin, INotification notification, object context)
{
var signal = notification as CustomSignal;
if (signal != null
&& signal.asset != null)
{
Debug.LogError(signal.number + " " + signal.param);
}
}
}
將腳本CustomSignalReceiver
掛到 CustomSignalReceiverObj
上
選擇添加的自定義信號發(fā)射器Custom Signal 如下
查看Inspector面板下方顯示
運行后將自動觸發(fā) CustomSignalReceiver 類的 OnNotify 函數(shù)
(6)創(chuàng)建 Control Track
(6.1)控制物體顯示
方法一:將場景內(nèi)的物體拖拽到右側(cè)軌道上綁定,下方 Sphere
方法二:將預(yù)制體拖拽到右側(cè)軌道上綁定,下方 Cube1
運行,時間軸執(zhí)行到軌道開始時間時,將綁定物體顯示出來,軌道時間結(jié)束后隱藏
Control Track 綁定的如果是場景內(nèi)的物體,則直接控制其顯示/隱藏
Control Track 綁定的如果是預(yù)制體,可以自動加載預(yù)制體并控制其顯示隱藏
(6.2)點擊軌道上的片段,在Inspector 面板查看參數(shù)
SourceGameObject:綁定的物體是場景內(nèi)的GameObject 如上 Sphere
- Prefab:預(yù)制體拖拽到軌道上,Prefab屬性關(guān)聯(lián)對綁定對象的引用,如上 Cube1
Post PlayBack 同 (2.3) Post-playback state
(6.3)Control Track嵌套控制其他的Timeline
再創(chuàng)建一個Timeline2
Playable Director 腳本Play On Awake 不勾選(不自動播放)
在 Timeline上創(chuàng)建一個Control Track,將Timeline2 拖拽到右側(cè)軌道上,嵌套到Timeline
(6.4)在 Timeline選擇被嵌套的 Timeline2,查看Inspector面板
Control Activation:
勾選時,Timeline 執(zhí)行時會調(diào)用 Timeline2,主要讓Timeline2做一些前置處理
不勾選時,Timeline執(zhí)行時需要等到Timeline2時間開始位置才觸發(fā)Timeline2
看例子,下面是 Timeline2控制一個Cube的顯示
(6.4.1)如果在Timeline軌道上將Timeline2 的 Control Activation 勾選,則Timeline一開始執(zhí)行,Timeline2控制Cube 立即隱藏,直到執(zhí)行到 Timeline2需要顯示Cube的時候,才將 Cube顯示出來
(6.4.2)如果在Timeline軌道上將Timeline2 的 Control Activation 不勾選,則Timeline一開始執(zhí)行,Timeline2 不會控制Cube隱藏(Cube一開始是顯示的),知道執(zhí)行到Timeline2開始時間位置,Timeline2才控制Cube先隱藏,然后時間到 Active 位置時將Cube顯示
(7)添加 TrackGroup(軌道組)
將多個軌道規(guī)劃為一個組,方便管理,先創(chuàng)建一個 TrackGroup,然后在TrackGroup
(8)操作輔助
(8.1) Lock軌道加鎖,選中一個軌道,在軌道空白位置,右鍵選擇Lock
加鎖標(biāo)志如下
解鎖:選擇加鎖的軌道,右鍵 Unlock
加鎖的作用:當(dāng)編輯完成一個軌道后,避免無意修改,加鎖,該軌道將不能被編輯,也不能被刪除,起到一個保護的作用,當(dāng)需要編輯時解鎖即可
(8.2)Mute 軌道靜默,選中一個軌道,在軌道空白位置,右鍵選擇Mute
靜默標(biāo)志如下
解除靜默:選擇靜默的軌道,右鍵 Unmute
靜默的作用:軌道靜默后預(yù)覽/播放時該軌道將不會播放,不生效了,當(dāng)有多個軌道在編輯時,你想專注查看某一個或者一些軌道效果,可以將其他的軌道設(shè)置靜默。
(8.3)軌道優(yōu)先級
軌道排序優(yōu)先級為,下面軌道優(yōu)先級>上面軌道優(yōu)先級
如果多個軌道控制的是同一個物體,則最下面的一個軌道生效
如何調(diào)整優(yōu)先級:在左側(cè)拖拽一個軌道,上下挪動,一條白線顯示的位置就是可以放置的位置,在白線位置松開鼠標(biāo)即可,如下
(8.4)三種模式:Mix model、Ripple model、Replace model
上圖紅色框中三個按鈕分別對應(yīng)Mix model、Ripple model、Replace model
Mix model:拖動右側(cè)軌道上的剪輯相互獨立,當(dāng)兩個剪輯相交時為,兩個剪輯混合
Ripple model:拖動右側(cè)軌道上的剪輯,會一同推動它左右兩側(cè)的剪輯
Replace model:拖動右側(cè)軌道上的剪輯,當(dāng)剪輯覆蓋其他剪輯時,將其他剪輯替換掉
(9)添加自定義軌道
(9.1)我添加一個設(shè)置 Image 顏色的 自定義軌道,執(zhí)行到軌道幀開始位置時改變Image顏色,軌道幀結(jié)束時將Image顏色設(shè)置為(0, 0, 0,0)
先看效果,下圖中 TimeTest->Image Track 是自定義的軌道
綁定的對象類型為 UGUI->Image
在軌道右側(cè),鼠標(biāo)右鍵添加軌道幀,Add Image Asset 也是自定義添加的
(9.2)選中 ImageAsset 在 Inspector 面板查看參數(shù)
Image Asset 部分
Image Color:添加的自定義顏色屬性,執(zhí)行時將Image 的顏色設(shè)置為這個顏色
Param:添加的自定義 Int 類型屬性
需要添加三個腳本文章來源:http://www.zghlxwxcb.cn/news/detail-483964.html
(9.3) 添加軌道幀資源,上方右鍵Add Image Asset 就是下面代碼創(chuàng)建的
using System;
using UnityEngine;
using UnityEngine.Playables;
namespace TimeTest
{
/// <summary>
/// 創(chuàng)建軌道資源
/// </summary>
[Serializable]
public class ImageAsset : PlayableAsset
{
// 設(shè)置的顏色
public Color imageColor;
// 參數(shù)
public int param;
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
// 創(chuàng)建一個新的 Playable(Script類型)
// ScriptPlayable<ImageMixerBehavior>.Create 實際接收兩個參數(shù)
// 第一個參數(shù)是 Graph
// 第二個參數(shù)是 我們創(chuàng)建的這個Playable接收幾個參數(shù),默認(rèn)不填寫那么就是0個輸入
var playable = ScriptPlayable<ImageMixerBehavior>.Create(graph);
// 通過 GetBehaviour 獲取上面創(chuàng)建的 ImageMixerBehavior 類型實例
var imageMixerBehavior = playable.GetBehaviour();
// 將軌道資源參數(shù)賦值給 imageMixerBehavior
imageMixerBehavior.imageColor = imageColor;
imageMixerBehavior.param = param;
// 返回 Playable 類型實例,Unity會幫我們自動連接
return playable;
}
}
}
(9.4)添加軌道,TimeTest->Image Track 就是下面代碼創(chuàng)建的
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using UnityEngine.UI;
namespace TimeTest
{
/// <summary>
/// 自定義 Timeline 軌道 ImageTrack (名字隨意定)
/// 在 Timeline 添加軌道位置右鍵,新加 TimeTest->ImageTrack
/// </summary>
[TrackColor(0.13f, 0.18f, 0.9f)] // 軌道顏色
[TrackBindingType(typeof(Image))] // 綁定對象類型為 UnityEngine.UI.Image
[TrackClipType(typeof(ImageAsset))] // 軌道幀類型為 ImageAsset (也需要自定義)
public class ImageTrack : TrackAsset
{
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
{
return ScriptPlayable<ImageMixerBehavior>.Create(graph, inputCount);
}
}
}
(9.5)添加軌道執(zhí)行邏輯
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.UI;
namespace TimeTest
{
/// <summary>
/// 繼承自 PlayableBehaviour,定義 Playable 的行為
/// </summary>
public class ImageMixerBehavior : PlayableBehaviour
{
private Image img;
public Color imageColor;
public int param;
/// <summary>
/// 重寫 OnBehaviourPlay 函數(shù),第一次執(zhí)行到軌道幀開始的時間
/// </summary>
/// <param name="playable"></param>
/// <param name="info"></param>
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
base.OnBehaviourPlay(playable, info);
}
/// <summary>
/// 重寫 ProcessFrame 函數(shù),Timeline 開始執(zhí)行,直到所有軌道結(jié)束,每幀都會調(diào)用這個方法
/// </summary>
/// <param name="playable"></param>
/// <param name="info"></param>
/// <param name="playerData">綁定對象 類型為:ImageTrack 類設(shè)置的 TrackBindingType 類型 Image</param>
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
Color blendColor = Color.clear;
// 轉(zhuǎn)換為綁定對象 Image
img = playerData as Image;
int inputCount = playable.GetInputCount();
if (null != img && inputCount > 0)
{
for (int i = 0; i < inputCount; i++)
{
float weight = playable.GetInputWeight(i);
ImageMixerBehavior imageMixerBehavior = ((ScriptPlayable<ImageMixerBehavior>)playable.GetInput(i)).GetBehaviour();
// 獲取顏色值
blendColor += imageMixerBehavior.imageColor * weight;
}
// 給綁定的 Image 對象設(shè)置顏色
img.color = blendColor;
}
}
/// <summary>
/// 執(zhí)行到當(dāng)前軌道幀 End Time
/// </summary>
/// <param name="playable"></param>
/// <param name="info"></param>
public override void OnBehaviourPause(Playable playable, FrameData info)
{
base.OnBehaviourPause(playable, info);
if (null != img)
{
img.color = Color.clear;
}
}
}
}
執(zhí)行即可預(yù)覽效果文章來源地址http://www.zghlxwxcb.cn/news/detail-483964.html
(10)代碼控制播放、暫停、停止
public class PlayableDirectorController : MonoBehaviour
{
private PlayableDirector playableDirector;
void Start()
{
playableDirector = GetComponent<PlayableDirector>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
// 暫停播放,時間軸停在當(dāng)前位置
playableDirector.Pause();
}
if (Input.GetKeyDown(KeyCode.D))
{
// 播放/繼續(xù)播放,從時間軸當(dāng)前位置播放
playableDirector.Play();
}
if (Input.GetKeyDown(KeyCode.W))
{
// 停止播放,時間軸回到0
playableDirector.Stop();
}
}
}
到了這里,關(guān)于Unity Timeline使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!