Search Unity

Question Creating sprite animation from sprite array in runtime

Discussion in 'Animation' started by Gunner22, May 31, 2021.

  1. Gunner22

    Gunner22

    Joined:
    Jan 15, 2020
    Posts:
    56
    Hi I would like to create animation from array of sprites that I create in runtime. I manage to create animation clip but when I assign it to animation it does not play. I cant create animation in editor because sprits I am using for animation existe only in runtime.

    Here is my code:
    Code (csharp):
    1.  
    2.  public void CreateAnimation()
    3.     {
    4.         Sprite[] sprites = createSprite();
    5.  
    6.         AnimationClip animClip = new AnimationClip();
    7.  
    8.         AnimationClipSettings newSettings = new AnimationClipSettings();
    9.         newSettings.loopTime = true;
    10.         AnimationUtility.SetAnimationClipSettings(animClip, newSettings);
    11.  
    12.         EditorCurveBinding spriteBinding = EditorCurveBinding.PPtrCurve("", typeof(SpriteRenderer), "m_sprite");
    13.  
    14.         float interval = 1 / 4f;
    15.         ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[sprites.Length + 1];
    16.  
    17.         for (int i = 0; i < spriteKeyFrames.Length; i++)
    18.         {
    19.             if(i == spriteKeyFrames.Length - 1)
    20.             {
    21.                 spriteKeyFrames[i].time = i * interval;
    22.                 spriteKeyFrames[i].value = sprites[0];
    23.             }
    24.             else
    25.             {
    26.                 spriteKeyFrames[i].time = i * interval;
    27.                 spriteKeyFrames[i].value = sprites[i];
    28.             }
    29.         }
    30.  
    31.         AnimationUtility.SetObjectReferenceCurve(animClip, spriteBinding, spriteKeyFrames);
    32.  
    33.         anim.clip = animClip;
    34.         anim.AddClip(animClip, "test");
    35.         anim.Play("test");
    36.     }
    37.  
    I also tried using AnimatorOverrideController:

    Code (csharp):
    1.  
    2. public void CreateAnimation()
    3.     {
    4.         Sprite[] sprites = createSprite();
    5.  
    6.         AnimationClip animClip = new AnimationClip();
    7.      
    8.         AnimationClipSettings newSettings = new AnimationClipSettings();
    9.         newSettings.loopTime = true;
    10.         AnimationUtility.SetAnimationClipSettings(animClip, newSettings);
    11.      
    12.         EditorCurveBinding spriteBinding = EditorCurveBinding.PPtrCurve("", typeof(SpriteRenderer), "m_sprite");
    13.  
    14.         float interval = 1 / 4f;
    15.         ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[sprites.Length + 1];
    16.  
    17.         for (int i = 0; i < spriteKeyFrames.Length; i++)
    18.         {
    19.             if(i == spriteKeyFrames.Length - 1)
    20.             {
    21.                 spriteKeyFrames[i].time = i * interval;
    22.                 spriteKeyFrames[i].value = sprites[0];
    23.             }
    24.             else
    25.             {
    26.                 spriteKeyFrames[i].time = i * interval;
    27.                 spriteKeyFrames[i].value = sprites[i];
    28.             }
    29.         }
    30.  
    31.         AnimationUtility.SetObjectReferenceCurve(animClip, spriteBinding, spriteKeyFrames);
    32.  
    33.         AnimatorOverrideController animatorOverrideController = new AnimatorOverrideController();
    34.         animatorOverrideController.runtimeAnimatorController = animC.runtimeAnimatorController;
    35.         animatorOverrideController["TestAnim"] = animClip;
    36.         animC.runtimeAnimatorController = animatorOverrideController;
    37.  
    38.     }
    39.  
    createSprite() function returns array of sprites i am using for animation
     
  2. Gunner22

    Gunner22

    Joined:
    Jan 15, 2020
    Posts:
    56
    BUMP!!