Download

Synchronizing blendspaces between two characters?

I’d like to put together some “paired” animations with looping and some random variation, e.g. a smaller character riding another character, similar to Master Blaster from Mad Max (Master Blaster | The Mad Max Wiki | Fandom), but with the player able to take control and “ride” multiple enemies.

In my limited experimentation, a blend space seems ideal for incorporating random variation in looping animations like Idle and Walk. For the Idle animations, I want to have some random variation in playback speed. Right now, I’m doing the following:

  1. Create Blend Spaces for each actor, using sequences that are “paired up” appropriately
  2. Create two actors and set them to play their associated Blend Spaces, with an exposed “Speed” float variable as input to the Blend Space playback speed
  3. Spawn the two actors in my custom GameMode blueprint
  4. Periodically (re)generate a random float in GameMode
  5. Using the actor references spawned in 3, set their Speed variable to the random float (which then gets passed to the Blend Space playback speed of each actor)

The problem is that if the pair Idles for long enough, the animations get desynced, probably because there’s some lag between with the first actor updates his speed and the second one updates its speed, which builds up over time.

I found this thread from 3 years ago regarding a horse + rider problem: Horse Mount: How to sync 2 blendspace animations; the rider and the horse? - Animation - Unreal Engine Forums

The solution there seems to be to create a “composite” skeleton that includes all the bones from both skeletons. But this would be a real pain to set up in Maya, as all of my humanoid characters have identical rigs (distinguished in scene using namespaces) and share morphs with the same names (e.g., eyes closed, smile, frown, etc.), and I think I’d need to rename all of those in order to export them as a single skeleton and have morphs driven correctly in UE4.

Is there some other, more elegant way to do this? Ideally some way to make sure that when Actor 1 starts a loop at frame 1, Actor 2 also starts at frame 1. I think AnimSequences and AnimMontages support this, but can it be done with BlendSpaces?

I think I’ve figured out a decent solution. Basically, in each Anim BP, convert the blendspace node into a blendspace evaluator. Then treat one actor as the “parent” that drives the animation time, and have the other as a “child” that reads the animation time from the parent. It seems to work well.

Thank you for this, DsyD!!!
This came up in a search and blendspace evaluator was exactly what I was looking for.

FYI, this syncs the animations, but it doesn’t seem to trigger anim notifies. I think maybe an alternative method using a “Begin” notify in the parent animation to reset the child animation might work, but I haven’t tried it yet.

Hey, thanks for posting! Sorry to necro 3 years later, but I’ve got the same issue and I can’t seem to find a way to get the animation time from the ‘parent’ blendspace playing. Do you remember how you did it?I’ve found the Blendspace Evaluator node, just need to feed the variable to drive it. Thanks