Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by RobRas · Oct 07, 2017 at 06:43 PM · c#animationruntimeloopwrapmode

Programmatically created AnimationClip will not loop

Hello everyone,

With help from this post, I was able to programmatically create an AnimationClip at runtime with my spritesheet. However, it will not loop.

Here's the code that generates the AnimationClip:

 public static AnimationClip LoadNewAnimatedSprite(string folderPath, string animationName, float pixelsPerUnit = 1.0f) {
         AnimationClip animClip = new AnimationClip();
         Texture2D spriteTexture;
         string jsonPath = folderPath + "/" + animationName + ".json";
         string imagePath = folderPath + "/" + animationName + ".png";
         if (_animations.ContainsKey(jsonPath)) {
             return _animations[jsonPath];
         }
         using (StreamReader reader = File.OpenText(jsonPath)) {
             JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(reader));
             var meta = o["meta"];
             spriteTexture = LoadTexture(imagePath);
             var frames = o["frames"];
             List<Sprite> sprites = new List<Sprite>();
             int i = 0;
             foreach (var frame in frames) {
                 Vector2 pos = new Vector2((int)frame["frame"]["x"], (int)frame["frame"]["y"]);
                 Vector2 size;
                 if ((bool)frame["rotated"]) {
                     size = new Vector2((int)frame["frame"]["h"], (int)frame["frame"]["w"]);
                 } else {
                     size = new Vector2((int)frame["frame"]["w"], (int)frame["frame"]["h"]);
                 }
                 Rect slice = new Rect(pos, size);
                 Vector2 pivot = new Vector2((float)frame["pivot"]["x"], (float)frame["pivot"]["y"]);
                 Sprite newSprite = new Sprite();
                 newSprite = Sprite.Create(spriteTexture, slice, pivot, pixelsPerUnit);
                 sprites.Add(newSprite);
             }
 
             animClip.frameRate = 3;
             EditorCurveBinding spriteBinding = new EditorCurveBinding();
             spriteBinding.type = typeof(SpriteRenderer);
             spriteBinding.path = "";
             spriteBinding.propertyName = "m_Sprite";
 
             ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[sprites.Count];
             for (i = 0; i < sprites.Count; i++) {
                 spriteKeyFrames[i] = new ObjectReferenceKeyframe();
                 spriteKeyFrames[i].time = i;
                 spriteKeyFrames[i].value = sprites[i];
             }
             AnimationUtility.SetObjectReferenceCurve(animClip, spriteBinding, spriteKeyFrames);
             AssetDatabase.CreateAsset(animClip, "assets/TEMP/" + animationName + ".anim");
             AssetDatabase.SaveAssets();
             AssetDatabase.Refresh();
         }
         return animClip;
     }

And here's the code that creates and adds the clip to an Animator, as well as sets the clip to looping. Note that _loaded is static:

 private void InitAnimationController() {
         string animation = "Walk_S";
         if (!_loaded) {
             AnimationClip clip = SpriteCreator.LoadNewAnimatedSprite(Data.Sprite, animation);
             var settings = AnimationUtility.GetAnimationClipSettings(clip);
             settings.loopTime = true;
             AnimationUtility.SetAnimationClipSettings(clip, settings);
             clip.wrapMode = WrapMode.PingPong;
             controller = AnimatorController.CreateAnimatorControllerAtPath("Assets/TEMP/StateMachineTransition.controller");
             controller.AddMotion(clip);
             _loaded = true;
         }
         Animator a = gameObject.AddComponent<Animator>();
         a.runtimeAnimatorController = controller;
     }

Here's what the saved AnimationClip asset looks like once created. Note that Loop Time is checked and Wrap Mode is set to Ping Pong, as expected.

Walk_S

However, once run, the animation only runs once without looping. If, while running, I uncheck and then recheck Look Time, it will loop, but will wrap as though set to "Loop" regardless of what I change the Wrap Mode to.

I have tried various solutions, like where I set the Loop Time and Wrap Mode. I tried setting both in a coroutine a frame after the clip creation, but I'm met with the same results. Any idea how I can get this working?

Thank you for the help!

walk-s.png (29.0 kB)
Comment
Add comment · Show 4
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image redemptor · Mar 16, 2018 at 02:20 PM 0
Share

Why 'm_Sprite' and not 'Sprite', in spriteBinding.propertyName?

avatar image Bunny83 redemptor · Mar 16, 2018 at 03:43 PM 0
Share

Because it's the actual property name in the native C++ code of the Unity engine. If you want to know the property names of built-in variables, set your asset serialization mode to "force text" and open a serialized asset in a text editor. If you have trouble reading the YA$$anonymous$$L format, have a look at those pages

avatar image redemptor Bunny83 · Mar 16, 2018 at 03:48 PM 0
Share

thanks dude!

avatar image redemptor · Mar 16, 2018 at 03:46 PM 0
Share

I found the answer https://docs.unity3d.com/ScriptReference/AnimationClip.SetCurve.html

2 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by NinjaEntertainment · Oct 07, 2017 at 07:23 PM

Hi you must set animation TO LEGACY WHEN YOU PLAY THEM IN SCRIPT GetComponent().Play("ANIMATION NAME"); and find LOOP in inspector... that's all

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image RobRas · Oct 07, 2017 at 08:00 PM 0
Share

Hello, thank you for the response!

When I try to set the clip to legacy, it says that legacy animationclips are not allowed in animator controllers and I am left with no sprite image what-so-ever.

avatar image
0

Answer by Bunny83 · Mar 16, 2018 at 03:48 PM

Since the question got already bumped:


My guess is you don't properly save your changes to your animationclip. At the end of your "LoadNewAnimatedSprite" method you actually create and store the clip to disk. However you later change the animationclip settings without marking the clip as dirty. You should use EditorUtility.SetDirty on the animationclip after you changed your setting.


When you change the settings in the inspector the inspector will take care of propertly saving the changes.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

458 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Animation keeps looping even on WrapMode.Once; 1 Answer

How to avoid animation from resetting after its completion? 1 Answer

Distribute terrain in zones 3 Answers

My Animation Loops 3/4 of the way through 3 Answers

How to set component property value at runtime not having components source? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges