Skip to content

Instantly share code, notes, and snippets.

@Hermesiss
Created November 17, 2019 22:42
Show Gist options
  • Save Hermesiss/d1428396bc4273f0b8ed958eecf21432 to your computer and use it in GitHub Desktop.
Save Hermesiss/d1428396bc4273f0b8ed958eecf21432 to your computer and use it in GitHub Desktop.
Image Sprite Switcher Track for Unity Timeline
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;
}
}
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);
}
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);
}
}
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;
}
}
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