Page 1 of 1

custom AudioWait()

Posted: Sat Dec 09, 2023 10:07 am
by joeylu
Hi Tony,
My project uses an audio middleware and has a lot of extended logics for playing audio, by checking the dialogue sequence command, I have found the AudioWait() requires direct access to the audio clip file.
So my first question is that if I need the AudioWait() to access a custom scriptable object file (our middleware), is that possible?

Say it is not possible and I need to write my own LUA script to handle the audio play, here are my questions:

1. In most case, my game allows player to click continue button to advance to the next dialogue node, if player does that, current audio voice for current entry should be immediately stopped, I guess I need call my middleware to stop the audio at OnConversationLineEnd() and also OnConversationCancelled(), am I missing any?

2. If the player does not click continue button to advance, the audio file should be fully played before dialogue automatically advance to next node, similar as AudioWait() does. But by default the dialogue duration is based on Character per second option with the total characters in a single node, can you give me a brief idea how to achieve this?

I actually have more questions but before we getting there, let's focus on the most important questions here first :)

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 11:31 am
by Tony Li
Hi,

Write a custom sequencer command for your middleware audio plugin. (If it's FMOD, just use FMODWait().)

Custom sequencer commands are fairly easy to write. There's a starter template in Plugins / Pixel Crushers / Dialogue System / Templates / Scripts. To learn how to write custom sequencer commands, please see the Cutscene Sequence Tutorials. The final video in the series covers custom sequencer commands.

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 11:56 am
by joeylu
Tks for the quick reply
Writing custom sequence or custom LUA is not a problem, that's exactly what I'm working on
However, I might missed something from the template, seems I still cannot find an answer for my #2 question

2. If the player does not click continue button to advance, the audio file should be fully played before dialogue automatically advance to next node, similar as AudioWait() does. But by default the dialogue duration is based on Character per second option with the total characters in a single node, can you give me a brief idea how to achieve this?

can you guide me where to look for in your tutorials? or some brief logics that I can start with? tks

or to make it simple, how do you stop the dialogue entry (not letting it to advance to next entry both from script and sequence), as well as manually advance from script and sequence?

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 12:21 pm
by Tony Li
Hi,

The subtitle duration is based on the Sequence, not necessarily on total characters.

If a dialogue entry's Sequence field is blank, it will use the Dialogue Manager GameObject's Display Settings > Camera & Cutscene Settings > Default Sequence.

The Default Sequence is initially set to:

Code: Select all

Delay({{end}})
which delays for a duration specified by the special keyword {{end}}. This keyword is determined by the total characters and the Dialogue Manager's Subtitle Settings > Subtitle Chars Per Second and Min Subtitle Seconds.

However, the Sequence (or Default Sequence) can be different. For example, if the Sequence is:

Code: Select all

Delay(3)
then the subtitle will delay for 3 seconds.

If the Sequence is:

Code: Select all

AudioWait(entrytag)
it will delay for the duration of the audio clip named by the entrytag keyword.

A Sequence is done when all of its sequencer commands have called their Stop() methods.

In your custom sequencer command, don't call Stop() until the audio is done playing.

Note: If the player clicks ahead using the continue button, your custom sequencer command's OnDestroy() method should stop the audio.

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 12:37 pm
by joeylu
got it, will give it a try, thank you Tony

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 10:39 pm
by joeylu
Hi Tony,
SequencerCommand works like a charm :)
But I still need your advice.

Say if I need to get the current actor, and current subtitle text in SequencerCommand, I can pass the actor name as the parameter, or pass the dialogue entry id as the parameter, then lookup the entry in DialogueManager.

So my question is that is there a built in way in SequencerCommand the access the dialogue entry that is currently being played? Manually passing a string parameter for dialogue entry id is a bit unsafe if entries are constantly changing.

Re: custom AudioWait()

Posted: Sat Dec 09, 2023 11:34 pm
by Tony Li
Hi,

In your sequencer command, the current subtitle is in DialogueManager.currentConversationState.subtitle. The current speaker is in the 'speaker' property.

Re: custom AudioWait()

Posted: Sun Dec 10, 2023 12:09 am
by joeylu
Thank you Tony, that solves my problem :)

Re: custom AudioWait()

Posted: Sun Dec 10, 2023 9:19 am
by Tony Li
Glad to help!

Re: custom AudioWait()

Posted: Wed Dec 13, 2023 5:49 am
by achootwo
For your first question, if you want AudioWait() to access a custom scriptable object file, it's generally possible with proper integration. Ensure your middleware supports this kind of extension.

Regarding your second set of questions:

To stop the audio when the player clicks continue, calling your middleware to stop the audio at OnConversationLineEnd() and OnConversationCancelled() is a good approach.

For automatic advancement after full audio playback, consider using coroutine or timers. Calculate the playback time based on character count and characters per second, then trigger the dialogue advancement.