Created
November 17, 2019 22:42
-
-
Save Hermesiss/d1428396bc4273f0b8ed958eecf21432 to your computer and use it in GitHub Desktop.
Image Sprite Switcher Track for Unity Timeline
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.UI; | |
[Serializable] | |
public class ImageSpriteSwitcherBehaviour : PlayableBehaviour { | |
public Sprite sprite; | |
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { | |
var image = playerData as Image; | |
if (image != null) image.sprite = sprite; | |
} | |
} |
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; | |
[Serializable] | |
public class ImageSpriteSwitcherClip : PlayableAsset, ITimelineClipAsset { | |
public ImageSpriteSwitcherBehaviour template = new ImageSpriteSwitcherBehaviour(); | |
public ClipCaps clipCaps => ClipCaps.None; | |
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) => | |
ScriptPlayable<ImageSpriteSwitcherBehaviour>.Create(graph, template); | |
} |
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 UnityEditor; | |
using UnityEngine; | |
/// <summary> | |
/// Put this inside Editor folder | |
/// </summary> | |
[CustomPropertyDrawer(typeof(ImageSpriteSwitcherBehaviour))] | |
public class ImageSpriteSwitcherDrawer : PropertyDrawer { | |
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { | |
const int fieldCount = 1; | |
return fieldCount * EditorGUIUtility.singleLineHeight; | |
} | |
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { | |
SerializedProperty ImageProp = property.FindPropertyRelative("sprite"); | |
Rect singleFieldRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); | |
EditorGUI.PropertyField(singleFieldRect, ImageProp); | |
} | |
} |
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 UnityEngine; | |
using UnityEngine.Playables; | |
using UnityEngine.UI; | |
public class ImageSpriteSwitcherMixerBehaviour : PlayableBehaviour { | |
Sprite m_DefaultSprite; | |
Image m_TrackBinding; | |
bool m_FirstFrameHappened; | |
// NOTE: This function is called at runtime and edit time. Keep that in mind when setting the values of properties. | |
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { | |
m_TrackBinding = playerData as Image; | |
if (m_TrackBinding == null) | |
return; | |
if (!m_FirstFrameHappened) { | |
m_DefaultSprite = m_TrackBinding.sprite; | |
m_FirstFrameHappened = true; | |
} | |
var inputCount = playable.GetInputCount(); | |
Sprite spr = null; | |
for (var i = 0; i < inputCount; i++) { | |
var inputWeight = playable.GetInputWeight(i); | |
var inputPlayable = | |
(ScriptPlayable<ImageSpriteSwitcherBehaviour>) playable.GetInput(i); | |
var input = inputPlayable.GetBehaviour(); | |
spr = inputWeight > 0.5f ? input.sprite : m_DefaultSprite; | |
} | |
m_TrackBinding.sprite = spr; | |
} | |
public override void OnPlayableDestroy(Playable playable) { | |
m_FirstFrameHappened = false; | |
if (m_TrackBinding == null) | |
return; | |
m_TrackBinding.sprite = m_DefaultSprite; | |
} | |
} |
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 UnityEngine; | |
using UnityEngine.Playables; | |
using UnityEngine.Timeline; | |
using UnityEngine.UI; | |
[TrackColor(0.3785221f, 0f, 0.4716981f)] | |
[TrackClipType(typeof(ImageSpriteSwitcherClip))] | |
[TrackBindingType(typeof(Image))] | |
public class ImageSpriteSwitcherTrack : TrackAsset { | |
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) { | |
return ScriptPlayable<ImageSpriteSwitcherMixerBehaviour>.Create(graph, inputCount); | |
} | |
public override void GatherProperties(PlayableDirector director, IPropertyCollector driver) { | |
#if UNITY_EDITOR | |
var trackBinding = director.GetGenericBinding(this) as Image; | |
if (trackBinding == null) | |
return; | |
var serializedObject = new UnityEditor.SerializedObject(trackBinding); | |
var iterator = serializedObject.GetIterator(); | |
while (iterator.NextVisible(true)) { | |
if (iterator.hasVisibleChildren) | |
continue; | |
driver.AddFromName<Image>(trackBinding.gameObject, iterator.propertyPath); | |
} | |
#endif | |
base.GatherProperties(director, driver); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment