• Unity
  • Update announcements?

Hello,

Is there a newsletter, or some way to keep up with updates released for the Unity runtime? As it stands now, my understanding is I need to just occasionally check on the http://esotericsoftware.com/spine-unity-download page to see if the "last updated" date changed?

It would be nice if I could be told when I should update. Have you also considered submitting the package to the Unity Asset Store (as a free package, naturally)? It handles notifications of new releases automatically.

Thanks

Related Discussions
...

That would be in the official repo: Commits
The unitypackage is just meant to mirror changes to the repository.

If there are significant new features or changes, I usually post a new topic about it here.
Otherwise, you should check the spine-unity-download page. That's also where we keep the upgrade notes.

The Unity Asset Store imposes a Unity asset license that's incompatible with the Spine Runtimes License. So we couldn't.

Is there any version numbers on the spine runtime? Can I see what version of the runtime I have installed right now?

Have to admit, there's a lot that's frustrating about your reply.

1: You can't subscribe to changes on GitHub in a way that helps here. Moreover, you have one repo for all runtimes. I only am interested in updates to Unity.

2: Not sure what you mean to imply by the unitypackage mirroring repo. It's listed as the preferred method for installing the runtime in Unity. Why would I go anywhere else?

3: Should I be expected to just subscribe to the entire (noisy) Unity support forum for a potential new meaningful post from you? At least make a single changelog announcement post, so we can just subscribe to that. Pin it and instruct everyone to do so.

4: Again, my desire is to not just occasionally check on pages and grep for changes. I'd like to be notified when changes are available... like the asset store handles.

5: As davidsvson said, it's difficult to even tell what version I have installed in Unity at any given time. I end up checking my own commit history, hopefully I included what date the download page said. Why don't you use version numbers, and include it in the files?

6: Lastly, I'm far from a lawyer but this is the only asset we use that seems to have that issue. What's the incompatibility? Skimming the Asset Store and Spine Runtime licenses, I don't understand what it'd be.

Overall, and this is getting into emotional territory, my impression from using Spine and implementing the runtimes for the last year is that your company isn't user-, animator-, or developer-centric at all. I'm constantly frustrated by the unhelpful responses from your company on this forum. My animator is frustrated with the lack of support for common animation-industry techniques. It feels like you begrudgingly support all these different runtimes, where none of them get the attention they deserve (jack of all trades, master of none).

We're constantly left wondering "who and what is Spine for?" when our seemingly basic desires are completely unaddressed. We've paid a lot for this software, and the support is abysmal.

What's the last thing you folks on the Spine team have produced, besides Spine? Have you made a video game using Spine, since establishing the company? Who plays it, if you did? Who is Spine for?

Observations:
The priorities in product management appear to be either incredibly disorganized, or not considered.
It's a dysfunctional way to produce software, and would be a shame to see this be the reason this tool & company collapses.

Solutions:
Have a clear cut answer to: "who and what is Spine for?"
Listen to specific user feedback. It's tangible (not assumed direction).

I suppose you have some good points there.

We could just list the Unity-specific changes separately a page linked on the Spine-Unity Download page, since that's where we also hoped to centralize the update notes too. It used to live in a forum thread.
And a Twitter account just for spine-unity whenever there are minor but meaningful changes and fixes get pushed to an updated unitypackage.
Major features and changes are still going to have a forum topic.
We could also add a simple text file to the spine-unity folder to keep the editor version match of it.

Still, note that major updates (eg, from 3.5 to 3.6) need to be applied to Spine Editor, the runtime and all exported skeletons at the same time.
That's one reason why we would not tend to go with automatically pushing updates to people, or channels that would make it easy for people to accidentally update one before updating the others. A lot of users have been burned by this before (which led to a lot of extra work needing to be done at a critical time in their development cycles.)

Also note that the runtime isn't an OS, browser or mobile app that has security fixes that people need to get regularly and immediately. You see and control the code, and you could make any changes to it and tell what's wrong when something goes wrong. If something does and there's no fix, you can report it and we can investigate and fix it. If you think there's an essential feature missing, you can post in the forums.

The legal stuff has to do with this: https://unity3d.com/legal/as_provider and Spine runtime distribution requiring that the user have a Spine License (ie, "bought Spine"). The Spine runtimes are source-available but are not under an open source license. I don't know enough about it to explain in precise terms. I'll try to find someone to clarify what's unclear.

You don't seem to have posted often though. Which responses have been insufficient/unhelpful? And what are these common animation industry techniques?

pasquale, it's disconcerting to hear you think we don't listen to users, as we put considerable effort into supporting our users. You've only made 2 posts, one of them this complaint, so I'm not sure why you feel so jaded.

Everyone, we welcome all feedback, however this thread is about staying on top of runtime updates so let's try to stay on topic.

jacobbijani, you make some valid points and we have been working to improve our runtime versioning. Starting with version 3.5, we release editor updates as betas until all runtimes are up to date, then we do a non-beta release. Starting with 3.6, all Spine users will receive a non-beta release email announcement (which they can opt out of). This is the highest level versioning event and probably what most users are interested in. It is equivalent to what you are used to for versioned releases of other assets that you may use and is likely a good time to update your runtime version.

Git master always works with the latest non-beta release. Between non-beta releases we do minor fixes in master. We do this so users do not need to wait for the next big non-beta editor release to get minor runtime fixes. If you aren't having problems, you probably don't need these fixes. These are versioned only by Git commits, though we have recently begun documenting API changes/breakage and behavioral changes in the CHANGELOG.md file in the runtime repository root, categorized by runtime. The idea is that users can look here when updating rather than digging through Git commits to find important changes.

As Pharan mentioned, the Git commit history provides the most granular view of runtime changes. Note that you can view the history for a particular folder if you are interested in changes for only a specific runtime. For example, see the spine-unity commit history. I think push notifications for commits would be too granular/noisy, even for a specific runtime.

I would guess that very few other products provide Git access at all, so you would never even see commits during development, only at each release. While we provide very granular access to the runtime source, it is not necessary to stay updated to the very latest. Updating any software dependency involves risk and is not a task to be taken lightly.

Just to make things clear, Pasquale is my animator whom I referenced earlier.

I think you should focus less on how many posts we have, and just on whether or not what we're saying might happen to be true. I've read and searched on the forum since finding Spine. You can surmise a lot about a community without posting yourself.

In a small way, your post is an example of what I'm talking about. Isn't this my thread? Why not just reply to my concerns here? You sort of just glossed over them, and only replied to the update stuff. Which, thanks, those changes would be appreciated. While I can obviously choose not to update my runtime, what's the point of you publishing changes if I don't incorporate them? I've only ever downloaded the latest unitypackage from the website.

So, we're not trying to be a pain in the butt. I don't doubt your intentions. We are obviously passionate about this and have put a lot of effort and energy into launching our upcoming game with Spine runtimes at it's core. If Spine wasn't worth the effort we would have ditched it a long time ago. It could just be so much more effortless. The language we see on the forum and GitHub issues just often leave us scratching our heads about who your target market is. To be honest, it seems too large!

Anyway... I'd like to continue discussing our specific problems.

Our biggest one is with root motion. There's all kinds of old and dead end posts on the forum about it. Its mostly users trying to help each other. Overall, Esoteric employees seem to have an aversion to it.

Root Motion and Animation Blending
Applying Root Motion
Root motion Mecanim
Root Motion - Animation movement or engine movement ?
Leap Attacks, Jumping, etc
Root motion is not working
Root Motion - How to code it properly?

We're having issues getting this to work in our game. It's pretty frustrating, as moving around seems super core to implementing a Spine character. To us, root motion seems like the most reliable way to implement high quality animation cycles. If not via root motion, I never found an official guide on "how to drive a Spine character with your own movement code." How do you do it in Spine? We see this, and ask "aren't people moving their characters around? What is this thing for?"

Another, on the editor side, is with looping. To make an endless loop, we duplicate the first and last keyframe. The editor has an option to control where your loop cycles from. However, when we export for the runtime there's no way to exclude that final duplicate frame. I've found that via "trackEntry.animationEnd" there's a way to control where a loop stops, but it's time-based. It'd be so much easier to just "drop the last frame". Instead, once it's in the runtime, I have to do some magic-number-backed math to figure out where the final frame starts. This is looping, which seems incredibly core. "How are people doing looping? Do they not run into this?"

The last example I have right now is the way BoneFollowers work. They're incompatible with physics-backed GameObjects in Unity. Once something has a Rigidbody2D, you get a performance hit if you move it with it's transform (as the physics engine has to recalculate the scene). I've had to reimplement your BoneFollower script to my own based on Rigidbody2D's MovePosition/MoveRotation. Our characters have colliders, which we track to a bone. "Are we really the only ones doing this? Has no one else noticed the performance hit?"

Thanks for hearing out our feedback. And thanks for dedicating your time into making this thing at all.

In defense of Esoteric, they have given great feedback to me and others who are actively in the forums. I've always felt this is one of the best supported packages.

Related to your question about that final point:

The Unity2D thread about performance hits and improvements using rigid bodies only happened last week and Pharan already implemented the update using kinematic rigidbodies to improve the performance. (I think it was actually done a couple days ago!)

Pharan is highly dutiful and responsible - he even released an early root motion exploration that several people used that I saw.

pasquale seemed to want to have a general gripe session in a thread he didn't start which is about update announcements. Asking to keep a thread from getting derailed is perfectly reasonable.

jacobbijani wrote

I think you should focus less on how many posts we have, and just on whether or not what we're saying might happen to be true. I've read and searched on the forum since finding Spine. You can surmise a lot about a community without posting yourself.

From our perspective, when multiple new users appear and begin dog piling complaints, we are interested in where those feelings are coming from. It appears that you are complaining that nothing works and that we provide poor support without ever having asked for assistance.

jacobbijani wrote

In a small way, your post is an example of what I'm talking about. Isn't this my thread? Why not just reply to my concerns here? You sort of just glossed over them, and only replied to the update stuff.

You stated you were frustrated and you criticized our support. I thought providing you our usual, good support for the problem you stated would be appropriate. I am sorry that you feel frustrated using Spine. I expect we can improve that if you give us a chance.

jacobbijani wrote

While I can obviously choose not to update my runtime, what's the point of you publishing changes if I don't incorporate them? I've only ever downloaded the latest unitypackage from the website.

If you want versioned updates, you get those when we do big releases like 3.4, 3.5, and soon 3.6. If you want more granular updates or don't want to wait for the next release to get fixes, you can look at the master Git branch. If you want bleeding edge you can look at the X.X-beta Git branch (currently 3.6-beta). There's no reason to get the latest after every Git commit, though you can if you like.

jacobbijani wrote

Our biggest one is with root motion.

I'll let Pharan field this one.

jacobbijani wrote

Another, on the editor side, is with looping. To make an endless loop, we duplicate the first and last keyframe. The editor has an option to control where your loop cycles from. However, when we export for the runtime there's no way to exclude that final duplicate frame.

Why do you want to exclude the last frame? That frame is needed to tween values so they match the first frame when playback is looped. Consider this animation:

frame 0: 10
frame 50: 20
frame 100: 10

If you removed frame 100, the value would tween from 10 to 20, then stay at 20 until playback looped, then it would snap to 10.

jacobbijani wrote

I've found that via "trackEntry.animationEnd" there's a way to control where a loop stops, but it's time-based. It'd be so much easier to just "drop the last frame". Instead, once it's in the runtime, I have to do some magic-number-backed math to figure out where the final frame starts. This is looping, which seems incredibly core. "How are people doing looping? Do they not run into this?"

What exactly is the problem you are trying to solve?

jacobbijani wrote

The last example I have right now is the way BoneFollowers work. They're incompatible with physics-backed GameObjects in Unity. Once something has a Rigidbody2D, you get a performance hit if you move it with it's transform (as the physics engine has to recalculate the scene). I've had to reimplement your BoneFollower script to my own based on Rigidbody2D's MovePosition/MoveRotation. Our characters have colliders, which we track to a bone. "Are we really the only ones doing this? Has no one else noticed the performance hit?"

I expect Pharan has input here, but what you are doing doesn't sound crazy. It sounds like maybe we could provide a RigidbodyBoneFollower script. Users will still need to use the appropriate one based on their scenario. Or, as Xelnath mentioned, an optimization may be already done.

jacobbijani wrote

Thanks for hearing out our feedback. And thanks for dedicating your time into making this thing at all.

Thanks for providing the feedback. 🙂 We know there is still a lot we can do to improve the runtimes and we are actively working on improving them.

For Root Motion, have you seen this module? https://gist.github.com/pharan/bc0e07647f6c066f432385518ac49149
If you're using Mecanim, there's not much we can do with the limited API they expose.
We can adapt the above code but loops will be a problem, which I think is a major part of root motion so it would be largely unusable.
If we had a callback or could detect loops reliably, problem would be solved.

In what way do you mean "movement code" not involving root motion?
Do you mean other than having a Physics Rigidbody control the Transform? or taking direct control of the GameObject's Transform position yourself? Is there a different paradigm you're after?

For BoneFollower and physics, did you mean BoundingBoxFollowers?
As Xelnath mentioned, there was a recent update where it now automatically adds a new Kinematic Rigidbody2D so it doesn't incur that cost anymore. That's actually mentioned in the upgrade notes.

If you were just using BoneFollowers, note that they are pretty agnostic to what you add to the GameObject they belong to. BoneFollowers can be used for purely graphical things like particle systems and sprites. Even other skeletons.
So if they were custom colliders, you should also add a kinematic Rigidbody2D to each as well to eliminate that physics model rebuild, in which case, moving the transform would be fine albeit it would not have interpolation in the physics update.

Pharan, one problem I've run into with Root Motion and spine has been that the root point snaps or blends back to the zero point and accurately keeping the visual skeleton and the gameplay component in the right spot is challenging and hard to do.

Especially if you're blending animations together.

Just $.05

Good point, Xelnath.
Maybe this needs custom apply code on the AnimationState, like we do with EventTimeline to get the custom threshold.
We'll have to take a look at this over the week.

We're not using Mechanim, just your SkeletonAnimation component. Mechanim seemed more limited / less supported, which sounds like you're confirming?

I hadn't seen that module. Was that linked somewhere? I will give this a shot. However, I think what Xelnath is describing has been one of our issues as well. I've struggled with the root motion bone blending back to the origin when the animations blend (e.g. from walk into idle). Another thing that would be super helpful, along with an official script, is an official suggestion of how to prepare the Spine file.

To clarify my "movement code" comment. None of our Spine characters are actually controlled by the player or via physics. They're all AI-driven. So they move until they reach a predefined target, basically. For what's relevant to this discussion, our characters simply translating left/right only on X (we conform them to the slope and angle of our ground outside the scope of root motion logic). Here's some videos from our game, it might make what I'm trying to describe more clear: https://twitter.com/OKDracula http://giphy.com/channel/okdracula

Our ideal character motion code allows the Spine animation to drive the translation along X. So I could play the "walk" animation, which has root motion information baked in, and it translates along X until it reaches the target.


We tried BoundingBoxFollowers initially but as I recall it acted very strangely. The collider ended up as a big jumbled overlapping mess, which didn't really move around in-line with the character's motion. Like the points were all in the wrong order, or something maybe?

So, to that end we ended up using a BoneFollower on a separate GameObject with a Collider2D and a Rigidbody2D.

My understanding of the docs was once it has a Rigidbody2D, you aren't supposed to reposition it with trasnform at all, you instead use MovePosition/MoveRotation. Did I misinterpret that? I did some profiling of the differences but maybe I misinterpreted it. They changed the way Rigidbody2D works a bit in 5.5, as well. https://docs.unity3d.com/Manual/class-Rigidbody2D.html

What would you say is the recommended way to add a Collider2D to a character, and have it track as it moves around? BoundingBoxFollowers? Any guide on how to set it up on the Spine and runtime sides?


I see that update on the spine-unity-download page. I think it's normally common for changelogs to be reverse-chronological. Also, none of this is in the "important spine unity topics" thread, nor the docs, nor the getting started page. This is my frustration, the information is all over the place., and naturally some is also outdated. For example, this page still says events don't fire during mixing which is longer true in the latest version yes? And the sample code is also incorrect now Coding for Spine Events and AnimationState callbacks

FWIW we'd love to help define and test officially supported root motion support! Would it help if Pasquale walked you through how we're currently implementing our root motion information in Spine?

Xelnath and I did have a bit of a discussion with the Unity Technologies programmer who did the box2D integration.
The Rigidbody2D is a bidirectional integration component between UnityEngine.Transform and an internal box2D body representation.
Moving a Rigidbody2D's transform is fine. It doesn't cause performance issues, but it does apply changes immediately and removes interpolation (in the case where you are moving large distances).
Applying motion using MovePosition/MoveRotation applies the change in the physics update, and is recommended if you want physics faithfulness, crucial if things are moving really quickly.

Thanks for reporting that outdated docs.
I personally would want an API Reference that was just for Unity users so they don't have to look anywhere else, particularly for beginners programmers (plenty of whom are Unity users) who would just be thoroughly confused by the language-agnostic docs we currently have, though I'm not sure how much sense that makes for updates.

Having a sample case would be useful, yes. We'd have to be sure it's general enough to be useful to most people.
If you can share a usable Spine project or exported assets, you can send them to contact@esotericsoftware.com
Watermarked or blacked-out images would probably be fine for our purposes if you're concerned about it leaking.

The "official way" to prepare the Spine rig would come with the correct implementation.
Currently, I can't imagine what limitations it would impose on root bone movement in Spine Editor. I suppose ambiguities would arise if the Transform were scaled, but that's on the Root Motion implementation end.