I’m trying to create a track that changes the sprite when it’s finished, but every time I watch its preview it’s permanently changing the sprite renderer sprite.
I’ve trying to use GatherProperties for that but it didn’t work.
(it’s also disabling the animator, which also doesn’t revert after preview).
As a workaround (it’s messing my scenes all the time) I’ve added “EditorApplication.isPlaying” guard.
[TrackBindingType(typeof(SpriteRenderer))]
[TrackClipType(typeof(ForceEndOfAnimation))]
public class ForceEndOfAnimationTrack : TrackAsset
{
public override void GatherProperties(PlayableDirector director, IPropertyCollector driver)
{
var binding = director.GetGenericBinding(this);
var spriteRenderer = binding as SpriteRenderer;
if (spriteRenderer == null)
{
base.GatherProperties(director, driver);
return;
}
driver.AddFromComponent(spriteRenderer.gameObject, spriteRenderer);
driver.AddFromComponent(spriteRenderer.gameObject, spriteRenderer.gameObject.GetComponent<Animator>());
base.GatherProperties(director, driver);
}
}
public class ForceEndOfAnimation : PlayableAsset
{
[SerializeField] private ForceEndOfAnimationPlayable template;
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
return ScriptPlayable<ForceEndOfAnimationPlayable>.Create(graph, template);
}
}
[Serializable]
public class ForceEndOfAnimationPlayable : PlayableBehaviour
{
private SpriteRenderer spriteRenderer;
public Sprite endSprite;
private Animator animator;
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
if (spriteRenderer == null)
{
spriteRenderer = (SpriteRenderer) playerData;
animator = spriteRenderer.GetComponent<Animator>();
}
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
if (!EditorApplication.isPlaying)
{
base.OnBehaviourPause(playable, info);
return;
}
if (animator != null)
animator.enabled = false;
if (spriteRenderer != null)
spriteRenderer.sprite = endSprite;
base.OnBehaviourPause(playable, info);
}
}