Page 1 of 1

Impatient NPC (please help)

Posted: Tue Sep 08, 2015 12:02 am
by GregOfTomorrow
I'm trying to make an NPC that will start talking again if the Player doesn't choose a dialogue option fast enough.

I've created a script that continuously updates a "patience" variable using...

Code: Select all

DialogueLua.SetVariable ("patience", patience);
...and...

Code: Select all

DialogueLua.GetVariable ("patience").AsFloat;

and I've confirmed by using...

Code: Select all

Debug.Log ("patience = "+DialogueLua.GetVariable ("patience").AsFloat);
...that the variable is in fact going down to zero (though the variable I see in the Database Inspector doesn't seem to move from its original value).


Does anyone know what I'm doing wrong or if my entire approach is flawed? Please help!

Re: Impatient NPC (please help)

Posted: Tue Sep 08, 2015 8:54 am
by Tony Li
Hi,

That code will work to count down a patience meter. But when it hits zero, what do you do?

[EDIT: It just occurred to me that your dialogue entry might have a Condition that checks the Patience variable. Conditions are only checked before dialogue entries are shown; they're not evaluated continuously while the entry is onscreen.]

The easiest solution might be to use a different approach. You can set a Response Timeout in the Dialogue Manager's Input Settings. If it's non-zero, the dialogue UI will take some action. The default action auto-selects the first response. You could make it something like "[say nothing]".

If you don't want to auto-select the first response, you can change the action to End Conversation, and then add a script that has an OnConversationTimeout method. In this method, you can restart the conversation at a certain point, either by manually calling DialogueManager.StartConversation with a specific entry ID or by setting a variable that the conversation could check as a condition. Or you could make the NPC bark, instead of restarting the conversation, and walk away.

(BTW, if you don't want to show the timer while it's counting down, you can add a CanvasGroup to it and set its Alpha to zero.)

If you don't want to use the built-in timer, you can manually change the conversation to another dialogue entry by using code similar to below:

Code: Select all

// Get the current conversation's ID:
var conversationID = DialogueManager.CurrentConversationState.subtitle.dialogueEntry.conversationID;

// This is the dialogue entry we want to jump to when impatient:
var entryID = 42; // (Replace with your number/algorithm.)

// Get the dialogue entry:
var impatientEntry = DialogueManager.MasterDatabase.GetDialogueEntry(conversationID, entryID);

// Get the conversation state for that entry:
var impatientState = DialogueManager.ConversationModel.GetState(impatientEntry);

// Change the conversation to that state:
DialogueManager.ConversationController.GotoState(impatientState); 
Those are just some ideas off the top of my head. If they don't help, let me know. There's always more than one way to skin a cat. :-)

EDIT: Another idea is to write a custom sequencer command to jump to a specified entry, which is actually really easy using the provided template. The command could fire at a specified time, like this:
  • Dialogue Text: "So what do you say?"
  • Response Menu Sequence: GotoEntry(42)@5
The entry above will show "So what do you say?". During the response menu, it will play the sequence above. If the player selects a response before 5 seconds are up, it will cancel the sequence, so GotoEntry will never fire.

Re: Impatient NPC (please help)

Posted: Wed Sep 09, 2015 2:50 pm
by GregOfTomorrow
Thanks Tony. That's a lot to take in. I'll let you know when I have time to go through it in depth and try your suggestions out. It seems like you have a solid grasp of what I'm trying to do. Thanks for your great response.

Re: Impatient NPC (please help)

Posted: Wed Sep 09, 2015 3:24 pm
by Tony Li
Sorry about the information dump. Feel free to just give it a light skim-over and then ask for more details about whichever approach you'd like to take. Using a Response Timeout is easiest, but it might not be exactly what you're looking for.