Permanent state change after preview

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);
        }
    }

It looks like AddFromComponent isn’t properly detecting the sprite field.

Try this to put the sprite field into preview explicitly, along with the enable field on the animator.

[TrackClipType(typeof(SpriteClip))]
[TrackBindingType(typeof(SpriteRenderer))]
public class SpriteTrack : TrackAsset
{
    public override void GatherProperties(PlayableDirector director, IPropertyCollector driver)
    {
        var binding = director.GetGenericBinding(this);
        var spriteRenderer = binding as SpriteRenderer;
        if (spriteRenderer != null)
        {
            driver.AddFromName<SpriteRenderer>(spriteRenderer.gameObject, "m_Sprite");
            driver.AddFromName<Animator>(spriteRenderer.gameObject, "m_Enabled");
        }           
    }
}