Skip to content

Cast of Characters

We've talked about setting up your cameras, now let's talk about the characters in the scene, and how we manipulate them.

Identifying Characters

For all the actions which affect characters, we of course need to be able to identify the character we're talking about. We already have SpeakerIDs (and names) in the script, but currently those have no connection with our actors in the scene.

We've mentioned before that when using the BP_SudsProDialogueRunner to launch dialogue, the player character and all NPCs are registered as Participants. This usually means that they at least implement ISUDSParticipant - however, characters should also implement ISudsProCharacter:

ISudsProCharacter interface

By implementing "Get Dialogue Character Identifier" you can associate a character with the SpeakerID used to speak their lines in the dialogue. You can then use this to move or animate the character, as shown below.

Marks

We talked about character marks in the previous section in relation to framing shots. "Marks" is a term from film making, and is a physical spot that an actor should aim to be in, so that the camera shots will work, there's the right spacing between characters, and so on.

Most of the time we'll want to position our characters when we enter dialogue, so we can frame our camera shots nicely, and avoid cases where characters are awkwardly talking nose-to-nose just because that's where the player had stopped their character when they initiated the dialogue! 😄

SUDS Pro provides a class called "BP_DialogueCharacterMark" which acts as both a destination for a character, and an edit-time placeholder for camera shot framing.

To move a character to a mark in script, you use the CharacterMove event:

[event CharacterMove `Player`, `PlayerMark`]

This will try to move the character named Player to the mark named PlayerMark. You probably want to do this at the start of the dialogue, perhaps disguised by a fade.

The name Player is resolved via calling the ISudsProCharacter interface for all participants, but how is PlayerMark resolved?

Well, if you're using BP_SudsProDialogueRunner to initiate your dialogue, then it has a list of marks you can fill in:

PlayerMark defined in runner

But, any participant that implements ISudsProMarkProvider could supply a link to a mark. The character is moved instantly to that location and rotation. There are callbacks in the ISudsProCharacter interface that lets you customise this movement if you'd rather not just teleport, more information can be found in the full character docs.

Animations

Another common thing you'll probably want to do with your characters is to make them animate / emote during dialogue.

Here's how you'd tell a character called Manny to play an animation called Wave:

[event CharacterAnim `Manny`, `Wave`]

The character Manny is identified as described above, but how does Wave get resolved to an animation? It happens via another ISudsProCharacter interface function, "Get Dialogue Animation"; here's a simple implementation:

Dialogue Animation

So you implement the mapping of an animation name to an animation sequence by implementing this function. It means you can write your scripts with general emote names without worrying about animation assets, and resolve them later to specific animations per character.

For ad-hoc animations like this to work, your character's animation blueprint needs to have an appropriate Animation Slot, ideally called "DefaultSlot" for simplicity. More details on this in the full character docs

Character Notifications, Properties

You can also send characters general notifications from the dialogue script:

# A notification
[event CharacterNotify `Manny`, `SomethingHappened`, {AnArgument}]

Or even modify their properties directly!

[event CharacterPropSet `Manny`, `Mood`, 3]

For more information on this, see the full character docs.