Page 1 of 3

Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 2:09 pm
by annathehank
Hello again!

This time I'm working on a notification system for the map screen if the player has a conversation they can have with an NPC ready.

The thing I'm stuck on is figuring out what coding to use to pull Actor field data from the manager in the script.

I have two actor fields I added in the database, RelLvl that increases or decreases as you interact normally with NPCs, and TalkLvl that increases after you have a specific conversation with them. It's set up so that every ten points unlocks a new conversation, as long as the previous has already been activated.

This is what I have set up, I just don't know how to fill in the blanks to get the data from the manager synced up.

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PixelCrushers.DialogueSystem;
using System.Security.Cryptography.X509Certificates;

public class charalert : MonoBehaviour
{//Alert notification to display on map screen
    public GameObject AlertNotif;

    void Start()
    {
        //what I assume pulls actor data from the manager)
        var NPCconvos = Code to pull Actor data;
        //cycling through each actor component)
        foreach (Actor in NPCconvos)
        {//Look to see if the level of relationship matches the conversation level player is on
            if ((RelLvl*10)+1 >= TalkLvl)
            {//display altert notification on map screen
                Actor.GetComponent<charalert>().AlertNotif.SetActive(true);
            }
        }
    }
Thank you in advance!

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 2:35 pm
by Tony Li
Hi,

The list of actors is DialogueManager.masterDatabase.actors.

To get the runtime value of an actor's field, use DialogueLua.GetActorField.

Your script might look something like:

Code: Select all

public class charalert : MonoBehaviour
{//Alert notification to display on map screen
    public GameObject AlertNotif;

    void Start()
    {
        //(cycling through each actor component)
        foreach (Actor actor in DialogueManager.masterDatabase.actors)
        {//Look to see if the level of relationship matches the conversation level player is on
            int relLevel = DialogueLua.GetActorField(actor.Name, "RelLvl").asInt;
            int talkLevel =DialogueLua.GetActorField(actor.Name, "TalkLvl").asInt; 
            if ((RelLvl*10)+1 >= TalkLvl)
            {//display altert notification on map screen
                // You need to match up an Actor (which is just data in the dialogue database) with
                // a GameObject. If the GameObject has a DialogueActor component, you can use
                // CharacterInfo.GetRegisteredActorTransform:
                Transform actorTransform = CharacterInfo.GetRegisteredActorTransform(actor.Name);
                if (actorTransform != null)
                {
                    actorTransform.GetComponent<charalert>().AlertNotif.SetActive(true);
                }
        }
    }
}

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 2:52 pm
by annathehank
Thank you for the help!
There doesn't appear to be any compiler errors, yet when I run the game at this scene, I get an error for this line of code

Code: Select all

foreach (Actor actor in DialogueManager.masterDatabase.actors)
That says: NullReferenceException: Object reference not set to an instance of an object

Do I need to define the first 'Actor' somewhere earlier?

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 3:26 pm
by Tony Li
Does your scene have a Dialogue Manager GameObject? And is a dialogue database assigned to it?

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 3:34 pm
by annathehank
It does, yes.

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 3:36 pm
by annathehank
I ran it again and the error just...went away...
So I guess it fixed itslef :lol:

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 3:47 pm
by annathehank
However, it still doesn't seem to be turning on the alert.

Here's what the script looks like now (I realized I had the two values swapped)

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PixelCrushers.DialogueSystem;

public class charalert : MonoBehaviour
{//Alert notification to display on map screen
    public GameObject AlertNotif;

    void Start()
    {
      
        //cycling through each actor component)
        foreach (Actor actor in DialogueManager.masterDatabase.actors)
        {//Look to see if the level of relationship matches the conversation level player is on
            int RelLvl = DialogueLua.GetActorField(actor.Name, "RelLvl").asInt;
            int TalkLvl = DialogueLua.GetActorField(actor.Name, "Talklvl").asInt;
            if ((TalkLvl*10)+1 >= RelLvl)
            {//display altert notification on map screen
               Transform actorTransform = PixelCrushers.DialogueSystem.CharacterInfo.GetRegisteredActorTransform(actor.Name);
                if (actorTransform != null)
                {
                    actorTransform.GetComponent<charalert>().AlertNotif.SetActive(true);
                }
               
            }
        }
    }
And here's the components of the GameObject it's attached to:
Image

I auto-set Elise's talk value to 1 and relationship value to 10, so 1*10+1 is greater than 10, but it's not setting the image active.

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 4:18 pm
by Tony Li
Hi,

I recommend attaching the debugger. Set a breakpoint on the first line of that Start() method, and step through each line of code so you can check the values.

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 4:35 pm
by annathehank
I believe I followed all the steps to enter the debugging mode.

But...I'm not sure what values I'm looking for and where?

Image

Re: Referencing Actors and fields in custom script

Posted: Tue Jun 22, 2021 4:45 pm
by annathehank
Oop, found what I was doing wrong there.

This is where the issue appears. Image

It's not changing the talklvl to what it actually is set to when it's on Elise's name.

Image