Using buttons to create a dialogue tree.

Hi, I’m trying to work out some coding. I’m trying to use the GUI buttons to create a dialogue tree.
Basically three buttons pop up. One is a question and two on the bottom, if clicked lead, to another question with two more answers. And so on.
I can’t get the buttons on the bottom to load or show the next group of three buttons.
The last two choices, answers 12A and 13A to disable the script so the player doesn’t reactivate it again when they move away from the person talking (who’s Sean) in the script.

My script needs a lot of work, but I’m confused about how to approach fixing it up.

using System.Collections;

public class DialogueChoice : MonoBehaviour {
    private bool  pressedButton = false;
    public GameObject Button1Q;
    public GameObject Button2A;
    public GameObject Button3A;
    public GameObject Button2Q;
    public GameObject Button4A;
    public GameObject Button5A;
    public GameObject Button3Q;
    public GameObject Button6A;
    public GameObject Button7A;
    public GameObject Button4Q;
    public GameObject Button8A;
    public GameObject Button9A;
    public GameObject Button5Q;
    public GameObject Button10A;
    public GameObject Button11A;
    public GameObject Button6Q;
    public GameObject Button12A;
    public GameObject Button13A;
    public Transform player;
    public float playerDistance;
    public GameObject Sean2;



    void Start () {
        Button1Q = GameObject.Find ( "Button1Q" );
        Button1Q.SetActive (false);
        Button2A = GameObject.Find ( "Button2A" );
        Button2A.SetActive (false);
        Button3A = GameObject.Find ( "Button3A" );
        Button3A.SetActive (false);
        Button2Q = GameObject.Find ( "Button2Q" );
        Button2Q.SetActive (false);
        Button4A = GameObject.Find ( "Button4A" );
        Button4A.SetActive (false);
        Button5A = GameObject.Find ( "Button5A" );
        Button5A.SetActive (false);
        Button3Q = GameObject.Find ( "Button3Q" );
        Button3Q.SetActive (false);
        Button6A = GameObject.Find ( "Button6A" );
        Button6A.SetActive (false);
        Button7A = GameObject.Find ( "Button7A" );
        Button7A.SetActive (false);
        Button4Q = GameObject.Find ( "Button4Q" );
        Button4Q.SetActive (false);
        Button8A = GameObject.Find ( "Button8A" );
        Button8A.SetActive (false);
        Button9A = GameObject.Find ( "Button9A" );
        Button9A.SetActive (false);
        Button5Q = GameObject.Find ( "Button5Q" );
        Button5Q.SetActive (false);
        Button10A = GameObject.Find ( "Button10A" );
        Button10A.SetActive (false);
        Button11A = GameObject.Find ( "Button11A" );
        Button11A.SetActive (false);
        Button6Q = GameObject.Find ( "Button6Q" );
        Button6Q.SetActive (false);
        Button12A = GameObject.Find ( "Button12A" );
        Button12A.SetActive (false);
        Button13A = GameObject.Find ( "Button13A" );
        Button13A.SetActive (false);


    }
  
    // Update is called once per frame
    void Update () {

      
        playerDistance = Vector3.Distance (player.position, Sean2.transform.position);
        if (
            playerDistance < 4f)
          
        {

            ButtonGroup();

            }
        }

  

    void ButtonGroup(){

        Button1Q.SetActive (true);
        Button2A.SetActive (true);
        Button3A.SetActive (true);
        {

        if
            //Button2A
            (pressedButton) {
            Button1Q.SetActive (false);
            Button2A.SetActive (false);
            Button3A.SetActive (false);
            Button2Q.SetActive (true);
            Button4A.SetActive (true);
            Button5A.SetActive (true);
        }

            else
            if
            //Button 3A
            (pressedButton)
            {
            Button1Q.SetActive (false);
            Button2A.SetActive (false);
            Button3A.SetActive (false);
            Button3Q.SetActive (true);
            Button6A.SetActive (true);
            Button7A.SetActive (true);
            }
            else
            if
            //Button 4A
            (pressedButton)

            {
            Button2Q.SetActive (false);
            Button4A.SetActive (false);
            Button5A.SetActive (false);
            Button5Q.SetActive (true);
            Button10A.SetActive (true);
            Button11A.SetActive (true);
            }


            else
            if
            //Button 5A
            (pressedButton)
            {
            Button2Q.SetActive (false);
            Button4A.SetActive (false);
            Button5A.SetActive (false);
            Button3Q.SetActive (true);
            Button6A.SetActive (true);
            Button7A.SetActive (true);
            }


            else
            if
            //Button 6A
            (pressedButton)
            {
            Button3Q.SetActive (false);
            Button6A.SetActive (false);
            Button7A.SetActive (false);
            Button4Q.SetActive (true);
            Button8A.SetActive (true);
            Button9A.SetActive (true);
            }

            else
            if
            //Button 7A
            (pressedButton)
            {
            Button3Q.SetActive (false);
            Button6A.SetActive (false);
            Button7A.SetActive (false);
            Button5Q.SetActive (true);
            Button10A.SetActive (true);
            Button11A.SetActive (true);
            }
            else
            if
            //Button 8A
            (pressedButton)
            {
            Button4Q.SetActive (false);
            Button8A.SetActive (false);
            Button9A.SetActive (false);
            Button5Q.SetActive (true);
            Button10A.SetActive (true);
            Button11A.SetActive (true);
            }
            else
            if
            //Button 9A
            (pressedButton)
            {
            Button4Q.SetActive (false);
            Button8A.SetActive (false);
            Button9A.SetActive (false);
            Button6Q.SetActive (true);
            Button12A.SetActive (true);
            Button13A.SetActive (true);
            }
            else
            if
            //Button 10A
            (pressedButton)
            {
            Button5Q.SetActive (false);
            Button10A.SetActive (false);
            Button11A.SetActive (false);
            Button6Q.SetActive (true);
            Button12A.SetActive (true);
            Button13A.SetActive (true);
            }
            else
            if
            //Button 11A
            (pressedButton)
            {
            Button5Q.SetActive (false);
            Button10A.SetActive (false);
            Button11A.SetActive (false);
            Button6Q.SetActive (true);
            Button12A.SetActive (true);
            Button13A.SetActive (true);
            }
            else
            if

            //Button 12A
            //Button 13A
            (pressedButton)
            {
            //Disable script
}
}
}
}

So if i understand you right what you try to archive is this.

I dont want to explain everything but more give you a push in the right direction .

You start your quiz at point 0 what is also the scene_number the text for the buttons is stored in a string array so in this example we need for scene 0 the awnser [0] and [1].

The next step will be to move to the next branch.

//if the player takes the right awnser  the next scene_number is 
scene_number = scene_number * 2 +2; // = 2
// on the left side
scene_number = scene_number * 2 +1; // = 1

Now we also need the new strings for the buttons.

//the left button will be
left_button_index = scene_number * 2 ; // = 4
// on the left side
scene_number = scene_number * 2 +1; // = 5

After this we stand on at point 2 and have the right text loaded 4 and 5.

Here is some more code to get you startet

using UnityEngine;
using System.Collections;
using UnityEngine.UI;



public class quiz : MonoBehaviour {

    // you will need only one pair of buttons add those in the editor to the GameObject with this script
    public GameObject button_left;
    public GameObject button_right; 

    private string[] awnsers = {"awnser a1","awnser b1","awnser a2","awnser b3","awnser a4","awnser b4",}; //better import from a extern file like a xml file
    private int scene_number = 0;

    // place holder dont want to set up a ui script
    bool left_pressed;
    bool right_pressed;
    //

    void Start ()
    {
        SetButtonText (); // we start with 0
    }

    private void SetButtonText()

    {
        button_left.transform.FindChild("Text").transform.GetComponent<Text>().text  = awnsers[scene_number * 2];
        button_right.transform.FindChild("Text").transform.GetComponent<Text>().text = awnsers[(scene_number * 2) + 1];
    }

    void Update ()
    {
        if (left_pressed == true)
            scene_number = scene_number * 2 + 1;
        if(right_pressed == true)
            scene_number = scene_number * 2 + 2;
        if (left_pressed == true || right_pressed == true)
            SetText ();
    }
}

Thanks a lot for the feedback. I’m sure I will learn a lot from this.

Thanks for your time. :slight_smile: