Last active
May 2, 2018 11:57
-
-
Save ousttrue/9ca70d4d7ce633dd3442d59cf751bbb1 to your computer and use it in GitHub Desktop.
A custom timeline track for Unity2017.3. File name must be same as class name at clip and track.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using UnityEngine; | |
using UnityEngine.Playables; | |
using UnityEngine.Timeline; | |
public class AlphaBehaviour : PlayableBehaviour | |
{ | |
public float Alpha; | |
} | |
public class AlphaMixerBehaviour : PlayableBehaviour | |
{ | |
CanvasGroup m_trackBinding; | |
bool m_firstFrameHappened; | |
float m_initialValue; | |
public override void OnGraphStop(Playable playable) | |
{ | |
m_firstFrameHappened = false; | |
if (m_trackBinding == null) | |
{ | |
return; | |
} | |
// 初期値の復旧 | |
m_trackBinding.alpha = m_initialValue; | |
} | |
public override void ProcessFrame(Playable playable, FrameData info, object playerData) | |
{ | |
m_trackBinding = playerData as CanvasGroup; | |
if (m_trackBinding == null) | |
{ | |
return; | |
} | |
if (!m_firstFrameHappened) | |
{ | |
// 初期値の記憶 | |
m_initialValue = m_trackBinding.alpha; | |
m_firstFrameHappened = true; | |
} | |
// 全clipのalpha値をweightに応じて合計する | |
int inputCount = playable.GetInputCount(); | |
float alpha = 0; | |
for (int i = 0; i < inputCount; ++i) | |
{ | |
var inputWeight = playable.GetInputWeight(i); | |
var inputPlayable = (ScriptPlayable<AlphaBehaviour>)playable.GetInput(i); | |
var input = inputPlayable.GetBehaviour(); | |
alpha += input.Alpha * inputWeight; | |
} | |
// 反映 | |
m_trackBinding.alpha = alpha; | |
} | |
} | |
[Serializable] | |
public class AlphaClip : PlayableAsset, ITimelineClipAsset | |
{ | |
public ClipCaps clipCaps | |
{ | |
get { return ClipCaps.Blending; } | |
} | |
[SerializeField, Range(0, 1)] | |
public float Alpha; | |
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) | |
{ | |
var playable =ScriptPlayable<AlphaBehaviour>.Create(graph); | |
// Playableにクリップの設定を反映する | |
var behaviour = playable.GetBehaviour(); | |
behaviour.Alpha = Alpha; | |
return playable; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[TrackColor(0, 0, 0)] | |
[TrackClipType(typeof(AlphaClip))] | |
[TrackBindingType(typeof(CanvasGroup))] | |
public class AlphaTrack : TrackAsset | |
{ | |
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) | |
{ | |
// Hack to set the display name of the clip | |
foreach (var c in GetClips()) | |
{ | |
var clip = (AlphaClip)c.asset; | |
c.displayName = string.Format("{0:0.00}", clip.Alpha); | |
} | |
return ScriptPlayable<AlphaMixerBehaviour>.Create(graph, inputCount); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment