Since we have LinkedAnimGraphs that can receive Parameters like AnimSequences we would be able to create specific AnimGraphs that would receive specific animations and would be able to be shared with any of our animation blueprints.
That would allow for very complex character animations to be maintained very easily, since it would be all in one place and used by any amount of other characters.
Even if it causes crashes if used wrongfully, like passing an AnimAsset that is not from the specific skeleton
At least put a boolean hidden in the class properties somewhere, like bIsSharedAnimBP with a @Warning informing what a sharedAnimBP is or so people who are learning Unreal or AnimBP specificly does not toggle that
Or make it a different animBlueprint class altogheter with features that could cause problems removed, or modified
I see, so, i create a Skeleton with only the Root bone, now if i import another mesh and use that skeleton, it will not generate a new skeleton anymore, but the new bones will be there in the Root Only skeleton, is that what you mean by shared animBP?
If so, have you been doing it for a while? do you do it at all?
Yes. All the other bones after the root bone count as “additional limbs” since they aren’t in the skeleton asset, which is why the root bone is white and the rest are greyed out. When playing animations, if the skeletal mesh doesn’t have same bones as the animation, the missing bones are just ignored (you can see this in my video when the character t-poses). Since the skeleton asset only has a root bone, and the animation blueprint uses that skeleton asset, all meshes that have a root bone (which is all skeletal meshes) can use that animation blueprint.
Also, you can set the preview mesh for the animations to which skeletal mesh it’s for (though, this isn’t necessary, as it’s just for the preview).
No, not really; I would probably only do this for simple things like simple characters or weapon systems, where the animations will all follow the same flow (e.g. primary_fire, secondary_fire, reload, etc.). The reason is that different characters may have different requirements for what they need to do & how they need to animate. The graph is shared, so it may make things complicated with very different character types; I also noticed that all bones for all valid skeletal meshes are listed, so if you have many meshes with many different bone names, it can get messy. And, with bone nodes, those nodes look for specific bones in order of the hierarchy, so you need to take that into account, as well.
Yeah thanks for sharing, but that is not what i mean’t
I was looking for something that would prevent anything from breaking, this would cause too much problem with very different skeletons, since if two skeletons have a single bone that is named the same, the structure would break, unless they where in the exact same place
Not really, i don’t want to share one animation across multiple skeletons
I want to share one Animation Graph which is just a “Behaviour Tree”, that would receive Animation Assets as parameters to play, so every Skeleton could pass their specific animation asset to play in that slot
Movement Component Anim Graph Asset
Moving Forward AnimAsset
Moving Backward AnimAsset
then this asset would calculate what needs to play at the right time and play the parametrized asset
If animations were actually unlinked from a skeleton, then the animation blueprints could also be independent from it.
That said, not all biped and quadruped move alike.
But the problem isn’t the animations to use, which have to be different, as much as the fact the skeletons would have to be mostly made up of virtual bones in order to share the same boiler plate.
Honestly, I would settle for a time remaining node that isn’t directly linked to the animation in the state machine.
Every darn time you copy over a BP and swap Animations the transitions are what breaks…
Ok, I get what you mean now. Still, different characters with very different skeletons (e.g. a human & a strider from half life) move differently and will require different setups. Imagine a climbing animation for a human vs. a dragon vs. a snake vs. a bird, or even something simpler like a look around or attack animation.
There’s Get Relevant Anim Time, which gets the time of the most “relevant” animation; I tested it on the third person anim bp and it works.
Unfortunately it’s not as direct timing / fast path wise in testing.
Making just replacing the direct node a little better despite the time it takes (really don’t go around swapping ABP out more than once a year anyway).
Unfortunately, things are not always easy. I agree that you should not change some parts too often, because this can lead to premature wear of neighboring nodes, which endure physical stress when dismantling the device.
No, you are wrong on this, ofc not everything moves alike, but you can create patterns and adjust everything with parameters, so if you have a good parametrized component you can move everything with the same Component/AnimGraph and adjust the values, the base of movement is always the same
Yes, specific stuff can be moved out from a movement component and placed inside a “climbing component” for instance, components are made to be easily fragmented, so when you make a new character you can choose which of your components you would like to use
I’m thinking you mean a “general” animation graph that handles just the broad things (like move, attack, take damage, etc. ) and is independent of any skeleton. Then you can use it on any skeleton and plug in animations or animation graphs into parameters, which will allow you to share logic with characters of any skeleton without having to copy & paste them manually.
If that’s the case, that’s basically already possible, though, not 100% to what you want. Just build an animation graph that references no animations (i.e. empty variables), then do “duplicate anim blueprints and retarget”, uncheck “show only compatible skeletons”, select your skeleton, and click retarget. It duplicates the animation blueprint and changes the skeleton, which is essentially what you’re looking for. I tried it and it worked: