Hey it's been a while.
I'm working on a quest right now for my game and stumbled upon the following problem.
My maps are pretty segmented with loading screens in between, so if the player talks to an NPC, and said NPC tells the Player to meet somewhere else in another scene, what would be an optimal way to do so with Dialogue System? I have some ideas but it's been the case a lot of the time where I come up with a convoluted solution only to find this framework already has a good solution built in.
What I want to do is the following:
>Talk to NPC in Scene 1, they tell players to meet up somewhere else in Scene 2
>After finishing the conversation the screen fades to black, the NPC disappears, then fade back to normal
>Players go to Scene 2 and meet with the NPC who is now there and has another conversation loaded (or continues an old one, who knows? maybe that's the right way to go about it).
My solution right now would be to have the same NPC in Scene 2 but disabled, then write a script that enables it once the condition has been met, but frankly I have no clue if this is already a common scenario that Dialogue System can handle.
Bear in mind that I also do not know how to fade out, make NPC disappear then fade in. I tried to do it but it happens during the dialogue node, so that should tell you all about how bright I am, lol.
Hopefully it's clear enough to get some help. Thanks in advance!
Best practices for moving NPCs between scenes
Re: Best practices for moving NPCs between scenes
Hi,
If you don't want it to happen during a conversation, you can play the same sequence above manually in C# using DialogueManager.PlaySequence("sequence") or in a Dialogue System Trigger's Actions > Play Sequence field.
That's a common way to do it. Make a prefab of your NPC. Put an instance of the prefab in scene 1 and another instance in scene 2. Deactivate the one in scene 2. On an active GameObject (empty GameObject is fine), add a Dialogue System Trigger with these settings:
- Trigger dropdown set to OnSaveDataApplied. (It will run when the scene transition is done or when the scene is started.)
- Conditions set to check if the quest is in a specific state (e.g., "Meet me in scene 2" state is active).
- Actions > Set GameObject Active or Actions > OnExecute() Event activates the NPC GameObject.
If you want to do it during the dialogue node, use a sequence like this:
Code: Select all
Fade(stay,1); // Fade to black over 1 second.
SetActive(YourNPCName, false)@1; // Deactivate NPC at the 1-second mark.
Fade(in,1)@1 // Fade in over 1 second at the 1-second mark.
Re: Best practices for moving NPCs between scenes
Thanks for the reply. This is way better than the convoluted thing I was about to do on my own.
One thing though. The set active line in the sequence doesn't seem to be working for me. I wrote the name of the NPC in there and it won't go away, only if I use scene events or the enable/disable action, but since it's separate from the sequence I can't use it in tandem with the fade in/out.
The fade works as intended, it's just the setactive line that's giving me issues.
One thing though. The set active line in the sequence doesn't seem to be working for me. I wrote the name of the NPC in there and it won't go away, only if I use scene events or the enable/disable action, but since it's separate from the sequence I can't use it in tandem with the fade in/out.
The fade works as intended, it's just the setactive line that's giving me issues.
Re: Best practices for moving NPCs between scenes
Hi,
Are there any warnings in the Console window, such as the one below?
Dialogue System: Sequencer: SetActive() command: subject 'gyaru-chan' is null
(Make sure the Console window isn't filtering out warnings, and that your Dialogue Manager's Other Settings > Debug Level is set to Warnings or Info.)
The GameObject name has to match exactly, including upper/lowercase.
Are there any warnings in the Console window, such as the one below?
Dialogue System: Sequencer: SetActive() command: subject 'gyaru-chan' is null
(Make sure the Console window isn't filtering out warnings, and that your Dialogue Manager's Other Settings > Debug Level is set to Warnings or Info.)
The GameObject name has to match exactly, including upper/lowercase.
Re: Best practices for moving NPCs between scenes
The sequence works, SetActive included, if the trigger is on another object and not the NPC itself (documentation says the latter won't work, since it's part of the conversation. It also won't work during a conversation for this reason, I think). So for testing purposes I made it so this object triggers the sequence when the conversation with gyaru-chan is over (with a trigger inside the NPC set to on conversation end to enable it), and it worked, but the NPC goes back to active when I return to the scene. The NPC has all the save system stuff in place, so it's a bit of a mystery as to why it won't stay disabled.Tony Li wrote: ↑Thu Sep 23, 2021 8:13 pm Hi,
Are there any warnings in the Console window, such as the one below?
Dialogue System: Sequencer: SetActive() command: subject 'gyaru-chan' is null
(Make sure the Console window isn't filtering out warnings, and that your Dialogue Manager's Other Settings > Debug Level is set to Warnings or Info.)
The GameObject name has to match exactly, including upper/lowercase.
On the matter of the console errors, I do get this whenever I start a conversation with every NPC so far in the game.
But I doubt this has anything to do with what I'm trying to do. It's been there this whole time but never cause problems.
So yeah I don't exactly know what I'm doing here. I'm clearly missing something in the process.
Edit: I just realized what I wrote is a bit confusing. The NPC in question is always gyaru-chan, it's not an NPC out of the conversation.
Re: Best practices for moving NPCs between scenes
Hi,
Note: If the NPC's GameObject starts inactive at design time (i.e., before entering play mode), you must put the ActiveSaver on a different, active GameObject instead, and assign the NPC to the GameObject To Watch field.
You can use a scene event if you have difficulty getting SetActive() to work.
Add an ActiveSaver to the NPC in scene 1, and assign the NPC GameObject itself to the GameObject To Watch field. This component will save the NPC GameObject's active/inactive state.moetan14 wrote: ↑Thu Sep 23, 2021 8:35 pmThe sequence works, SetActive included, if the trigger is on another object and not the NPC itself (documentation says the latter won't work, since it's part of the conversation. It also won't work during a conversation for this reason, I think). So for testing purposes I made it so this object triggers the sequence when the conversation with gyaru-chan is over (with a trigger inside the NPC set to on conversation end to enable it), and it worked, but the NPC goes back to active when I return to the scene. The NPC has all the save system stuff in place, so it's a bit of a mystery as to why it won't stay disabled.
Note: If the NPC's GameObject starts inactive at design time (i.e., before entering play mode), you must put the ActiveSaver on a different, active GameObject instead, and assign the NPC to the GameObject To Watch field.
You can use a scene event if you have difficulty getting SetActive() to work.
A UnityEvent is misconfigured. Check the Dialogue Manager and Player for components that have UnityEvents, such as DialogueSystemEvents components.
Re: Best practices for moving NPCs between scenes
Alright! the active saver worked like a charm, but it had to go on an empty object and not the NPC for it to work. Thanks a lot for the guindance!
Re: Best practices for moving NPCs between scenes
Ah, good catch. I forgot that if the ActiveSaver was on the NPC and the NPC was inactive, the ActiveSaver wouldn't be active to save its state when changing scenes.