Unity implementa control de diálogo

Propósito: Crear un script que pueda controlar la apariencia del cuadro de diálogo y el contenido del diálogo. Cuando el personaje esté cerca del NPC, puedes presionar la tecla e para pasar al siguiente diálogo.

Contenido adicional: Si se agrega el sistema de misiones, al recibir una misión, el jugador hace clic en e varias veces para saltarse el diálogo sin comprender los requisitos de la misión, por lo tanto, al acercarse nuevamente al NPC y presionar e, se deben repetir los requisitos de la misión, eso es decir, se repite la última oración del texto . Además, un NPC puede tener varios conjuntos de contenido de texto y debe poder cambiar entre cada contenido.

Vídeo de demostración

plan:

1. Guardar el contenido de la conversación

Utilice el almacenamiento de archivos xml, motivo: conveniencia, el contenido de texto correspondiente a una función pertenece a sus subelementos y el contenido se puede leer citando la biblioteca proporcionada por c#. Además, ya existen tutoriales que utilizan xml para facilitar la implementación. Me gustaría agradecer al usuario de Zhihu 5hT89p.

Tutorial sobre cómo crear un sistema de diálogo usando Unity - Zhihu (zhihu.com)

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<girl>
<suit>
<line>hello</line>
<line>come here</line>
<line>go to fight a monster</line>
</suit>
<suit>
<line>you win!</line>
<line>go to open the box</line>
<line>just continue to adventure,bye</line>
</suit>
</girl>
</Root>

Hay dos conjuntos de contenidos de diálogo en el texto anterior, uno es al aceptar la tarea:

Hola

comer

ir a luchar contra un monstruo

Otro conjunto es después de completar la tarea:

¡tú ganas!

ve a abrir la caja

Sólo continúa con la aventura, adiós.

Gracias al tutorial novato por permitirme entender xml y poder escribir el código anterior.

Elementos XML | Tutorial para principiantes (runoob.com)

2.Control del contenido de la conversación

Primero, el texto debe leerse desde xml y almacenarse en el contenido de la matriz bidimensional. La razón de las dos dimensiones es que un NPC tiene múltiples conjuntos de contenido de diálogo. Un conjunto de diálogos ocupa una línea y varios conjuntos requieren múltiples líneas. .

private List<List<string>> content=new List<List<string>>();
void Start()
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(Application.dataPath + "/dialog/content.xml");        
        XmlNode xmlNode = xml.SelectSingleNode("Root" + "/" + transform.name);       
        foreach (XmlNode x1 in xmlNode.ChildNodes)
        {
            List<string> my = new List<string>();
            foreach (XmlNode x2 in x1.ChildNodes)
            {
                my.Add(x2.InnerText);
            }
            content.Add(my);                
        }        
    }

En segundo lugar, cambie el contenido del texto y muéstrelo en el cuadro de diálogo .

Hay dos puntos a considerar: primero, el cuadro de diálogo solo se mostrará cuando el personaje esté cerca, por lo que es necesario agregar un criterio de distancia al código. En segundo lugar, es posible que algunos NPC siempre puedan hablar, pero algunos NPC solo pueden hablar una vez y ya no pueden interactuar, por lo que es necesario establecer una bandera pública para distinguir estos dos tipos de NPC.

IEnumerator nextWord()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            nextOrNot = true;
        }
        if (Input.GetButtonDown("Submit") && Mathf.Abs(player.transform.position.x - transform.position.x)<effectDist)
        {         
            if(nextOrNot)
            {                
                whichSuit++;
                whichString = 0;
                nextOrNot = false;
            }
            if (whichSuit < content.Count)
            {
                if (whichString < content[whichSuit].Count)
                {
                    panel.SetActive(true);
                    words.enabled = true;
                    words.text = content[whichSuit][whichString];
                    whichString++;
                }
                else
                {
                    panel.SetActive(false);
                    words.enabled = false;
                    if (alwaysHasWord)
                    {                        
                        whichString--;
                    }
                    else
                    {
                        this.enabled = false;                      
                    }                    
                }
            }
            else
            {
                panel.SetActive(false);
                words.enabled = false;
            }
            yield return new WaitForSeconds(.2f);
        }
        else if(Mathf.Abs(player.transform.position.x - transform.position.x) > effectDist)
        {
            panel.SetActive(false);
            words.enabled = false;
        }
        yield return null;
    }

Para encontrar la oración específica que se va a decir, establezca el tipo int WhichSuit y WhichString como índice de la matriz bidimensional para ubicar qué decir. AlwaysHasWord es el indicador que determina si el carácter repite la última oración. poder repetir la última oración, por lo tanto, si siempreHasWord es verdadero, reste 1 del índice, que todavía está dentro del rango válido de la matriz de dos dígitos (en realidad, la cadena correspondiente a la última columna de la fila, es decir , La última oración).     

 ¿Por qué utilizar corrutinas?

Porque al escribir scripts, siempre puedes encontrar que getButtonDown ejecuta más de un cuadro, lo que hará que el texto se salte continuamente, por lo tanto, usando la rutina, después de presionar e, siempre debes esperar 0,2 segundos antes de ejecutar nextWord() nuevamente. . , salta a la siguiente oración                                                                 

Supongo que te gusta

Origin blog.csdn.net/qq_16198739/article/details/126650482
Recomendado
Clasificación