Unity UI Dialogue System or Multiple-Response Dialogue System Unity 3d

So I have an issue, I have a Dialogue system and a player raycast interaction. The raycast is not caliing the MultipleResponseDialogueSystem.
The Player interaction code:

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

public class Player : MonoBehaviour
{
    public float interactionDistance = 5f;
    public KeyCode interactKey = KeyCode.E;

    private bool inDialogue = false;
    private MultipleResponseDialogueSystem npcDialogueSystem;

    void Update()
    {
        if (Input.GetKeyDown(interactKey))
        {
            RaycastHit hit;
            if (Physics.Raycast(transform.position, transform.forward, out hit, interactionDistance))
            {
                if (hit.collider.CompareTag("NPC"))
                {
                    Debug.Log("Interacting with object " + npcDialogueSystem);
                    Debug.DrawRay(transform.position, transform.forward * interactionDistance, Color.green, 1f);
                    npcDialogueSystem = hit.collider.GetComponent<MultipleResponseDialogueSystem>();
                    inDialogue = true;
                    npcDialogueSystem.ShowDialogueOptions();
                }
            }
        }
    }
}

And this is my Dialogue code:

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

public class MultipleResponseDialogueSystem : MonoBehaviour
{
    public string[] dialogueOptions;
    public string[] npcResponses;

    private bool inDialogue = false;

    public void StartDialogue()
    {
        // Check if the player is already in dialogue
        if (inDialogue)
        {
            return;
        }

        // Start the dialogue by showing the dialogue options
        ShowDialogueOptions();

        // Set inDialogue to true
        inDialogue = true;
    }

    public void ShowDialogueOptions()
    {
        // Display the dialogue options to the player using Unity's UI system
        // This can be done by creating a new Canvas and adding UI elements like buttons and text

        // Create a new Canvas
        GameObject canvasGameObject = new GameObject("Dialogue Canvas");
        Canvas canvas = canvasGameObject.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;

        // Create a new Panel
        GameObject panelGameObject = new GameObject("Dialogue Panel");
        panelGameObject.transform.SetParent(canvas.transform);
        RectTransform panelRectTransform = panelGameObject.AddComponent<RectTransform>();
        panelRectTransform.anchorMin = new Vector2(0.5f, 0f);
        panelRectTransform.anchorMax = new Vector2(0.5f, 0f);
        panelRectTransform.pivot = new Vector2(0.5f, 0f);
        panelRectTransform.anchoredPosition = new Vector2(0f, 50f);
        panelRectTransform.sizeDelta = new Vector2(400f, 200f);
        Image panelImage = panelGameObject.AddComponent<Image>();
        panelImage.color = new Color(0f, 0f, 0f, 0.8f);

        // Create buttons for each dialogue option
        for (int i = 0; i < dialogueOptions.Length; i++)
        {
            GameObject buttonGameObject = new GameObject("Dialogue Option " + (i + 1));
            buttonGameObject.transform.SetParent(panelGameObject.transform);
            RectTransform buttonRectTransform = buttonGameObject.AddComponent<RectTransform>();
            buttonRectTransform.anchorMin = new Vector2(0f, 1f - ((i + 1) * 0.25f));
            buttonRectTransform.anchorMax = new Vector2(1f, 1f - (i * 0.25f));
            buttonRectTransform.pivot = new Vector2(0.5f, 0.5f);
            buttonRectTransform.anchoredPosition = Vector2.zero;
            buttonRectTransform.sizeDelta = Vector2.zero;
            Button button = buttonGameObject.AddComponent<Button>();
            Text buttonText = buttonGameObject.AddComponent<Text>();
            buttonText.text = dialogueOptions[i];
            buttonText.color = Color.white;
            buttonText.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
            buttonText.fontSize = 24;
            buttonText.alignment = TextAnchor.MiddleCenter;

            // Add an onClick event to the button that calls RespondToDialogueOption on the NPC GameObject
            int index = i;
            button.onClick.AddListener(() => { gameObject.GetComponent<MultipleResponseDialogueSystem>().RespondToDialogueOption(index); });
        }
    }

    public void RespondToDialogueOption(int index)
    {
        // Display the NPC's response to the selected dialogue option
        Debug.Log(npcResponses[index]);

        // End the dialogue by destroying the Dialogue Canvas and setting inDialogue to false
        inDialogue = false;
        Destroy(GameObject.Find("Dialogue Canvas"));
    }
}

So, what does it do?

First thing is check whether the raycast is hitting anything. If the raycast hits something, check and find out if it’s the object that you think it is. Use Debug.Log() to output information that you need.

If your raycast is behaving unexpectedly, try drawing the ray with Debug.DrawRay. See if the ray is actually where you think it is.

I did Debug.Log() and Debug.DrawRay there is just nothing.

Then your code isn’t running.

The purpose of “doing a Debug” of any kind isn’t for you to run back here and breathlessly report what did or did not happen.

The purpose is for YOU to begin to reason about what your program is doing.

This is NOT an optional step for you if you intend to write software, especially something as complicated and hairy as an interactive multipath dialog system. This is NOT a trivial beginner system in any sense.

Here’s more reading on the process of debugging.

Time to start debugging! Here is how you can begin your exciting new debugging adventures:

You must find a way to get the information you need in order to reason about what the problem is.

Once you understand what the problem is, you may begin to reason about a solution to the problem.

What is often happening in these cases is one of the following:

  • the code you think is executing is not actually executing at all
  • the code is executing far EARLIER or LATER than you think
  • the code is executing far LESS OFTEN than you think
  • the code is executing far MORE OFTEN than you think
  • the code is executing on another GameObject than you think it is
  • you’re getting an error or warning and you haven’t noticed it in the console window

To help gain more insight into your problem, I recommend liberally sprinkling Debug.Log() statements through your code to display information in realtime.

Doing this should help you answer these types of questions:

  • is this code even running? which parts are running? how often does it run? what order does it run in?
  • what are the names of the GameObjects or Components involved?
  • what are the values of the variables involved? Are they initialized? Are the values reasonable?
  • are you meeting ALL the requirements to receive callbacks such as triggers / colliders (review the documentation)

Knowing this information will help you reason about the behavior you are seeing.

You can also supply a second argument to Debug.Log() and when you click the message, it will highlight the object in scene, such as Debug.Log("Problem!",this);

If your problem would benefit from in-scene or in-game visualization, Debug.DrawRay() or Debug.DrawLine() can help you visualize things like rays (used in raycasting) or distances.

You can also call Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene manually, looking for all the parts, where they are, what scripts are on them, etc.

You can also call GameObject.CreatePrimitive() to emplace debug-marker-ish objects in the scene at runtime.

You could also just display various important quantities in UI Text elements to watch them change as you play the game.

Visit Google for how to see console output from builds. If you are running a mobile device you can also view the console output. Google for how on your particular mobile target, such as this answer or iOS: https://discussions.unity.com/t/700551 or this answer for Android: https://discussions.unity.com/t/699654

If you are working in VR, it might be useful to make your on onscreen log output, or integrate one from the asset store, so you can see what is happening as you operate your software.

Another useful approach is to temporarily strip out everything besides what is necessary to prove your issue. This can simplify and isolate compounding effects of other items in your scene or prefab.

Here’s an example of putting in a laser-focused Debug.Log() and how that can save you a TON of time wallowing around speculating what might be going wrong:

https://discussions.unity.com/t/839300/3

“When in doubt, print it out!™” - Kurt Dekker (and many others)

Note: the print() function is an alias for Debug.Log() provided by the MonoBehaviour class.

This is a clue in itself. For example if you write something like

{
Debug.Log("testing");
}```
and then nothing happens then that gives you the clue that exp does not equal 1.