You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.0 KiB
93 lines
3.0 KiB
#if TEXT_TRACK_REQUIRES_TEXTMESH_PRO |
|
|
|
using TMPro; |
|
using UnityEngine; |
|
using UnityEngine.Playables; |
|
|
|
namespace Timeline.Samples |
|
{ |
|
// The runtime instance of a the TextTrack. It is responsible for blending and setting the final data |
|
// on the Text binding |
|
public class TextTrackMixerBehaviour : PlayableBehaviour |
|
{ |
|
Color m_DefaultColor; |
|
float m_DefaultFontSize; |
|
string m_DefaultText; |
|
|
|
TMP_Text m_TrackBinding; |
|
|
|
// Called every frame that the timeline is evaluated. ProcessFrame is invoked after its' inputs. |
|
public override void ProcessFrame(Playable playable, FrameData info, object playerData) |
|
{ |
|
SetDefaults(playerData as TMP_Text); |
|
if (m_TrackBinding == null) |
|
return; |
|
|
|
int inputCount = playable.GetInputCount(); |
|
|
|
Color blendedColor = Color.clear; |
|
float blendedFontSize = 0f; |
|
float totalWeight = 0f; |
|
float greatestWeight = 0f; |
|
string text = m_DefaultText; |
|
|
|
for (int i = 0; i < inputCount; i++) |
|
{ |
|
float inputWeight = playable.GetInputWeight(i); |
|
ScriptPlayable<TextPlayableBehaviour> inputPlayable = (ScriptPlayable<TextPlayableBehaviour>)playable.GetInput(i); |
|
TextPlayableBehaviour input = inputPlayable.GetBehaviour(); |
|
|
|
blendedColor += input.color * inputWeight; |
|
blendedFontSize += input.fontSize * inputWeight; |
|
totalWeight += inputWeight; |
|
|
|
// use the text with the highest weight |
|
if (inputWeight > greatestWeight) |
|
{ |
|
text = input.text; |
|
greatestWeight = inputWeight; |
|
} |
|
} |
|
|
|
// blend to the default values |
|
m_TrackBinding.color = Color.Lerp(m_DefaultColor, blendedColor, totalWeight); |
|
m_TrackBinding.fontSize = Mathf.RoundToInt(Mathf.Lerp(m_DefaultFontSize, blendedFontSize, totalWeight)); |
|
m_TrackBinding.text = text; |
|
} |
|
|
|
// Invoked when the playable graph is destroyed, typically when PlayableDirector.Stop is called or the timeline |
|
// is complete. |
|
public override void OnPlayableDestroy(Playable playable) |
|
{ |
|
RestoreDefaults(); |
|
} |
|
|
|
void SetDefaults(TMP_Text text) |
|
{ |
|
if (text == m_TrackBinding) |
|
return; |
|
|
|
RestoreDefaults(); |
|
|
|
m_TrackBinding = text; |
|
if (m_TrackBinding != null) |
|
{ |
|
m_DefaultColor = m_TrackBinding.color; |
|
m_DefaultFontSize = m_TrackBinding.fontSize; |
|
m_DefaultText = m_TrackBinding.text; |
|
} |
|
} |
|
|
|
void RestoreDefaults() |
|
{ |
|
if (m_TrackBinding == null) |
|
return; |
|
|
|
m_TrackBinding.color = m_DefaultColor; |
|
m_TrackBinding.fontSize = m_DefaultFontSize; |
|
m_TrackBinding.text = m_DefaultText; |
|
} |
|
} |
|
} |
|
|
|
#endif
|
|
|