Jump to content
Sign in to follow this  
overbaal

ANSWERED Dialogos entre NPCS

Recommended Posts

2 hours ago, nomoregames said:

@TheShopKeeper Si lo que buscas es hacer las conversaciones mediante nodos, te recomiendo que utilices fungus 

https://assetstore.unity.com/packages/templates/systems/fungus-34184

es totalmente personaliza-ble,  puedes todo tipo de conversaciones (desde tipo fallout hasta a algo más final fantasy) y tiene un foro de dudas que siempre esta activo 

No se cuanto tendrás avanzado, pero te valdrá le pena hacer el cambio.

jeje, solo me falta decir algo como; llame ahora y le damos una batidora de regalo.

 

Suerte.

Hmmm, interesante, por suerte estoy en una fase de desarrollar todas las mecánicas del juego antes de crear el juego. Gracias por la info voy a hecharle un vistazo.

Edited by TheShopKeeper

Share this post


Link to post
Share on other sites
18 hours ago, nomoregames said:

Hace un tiempo que me puse con fungus, si tienes alguna duda dímela

Muchas gracias por la ayuda, hasta ahota solo tengo la siguiente duda.

¿Cómo puedo mostrar una variable que tenga en algún script en Fungus? Ejemplo: El personaje tiene un script llamado "Character_Movement" donde hay una variable int que guarda la cantidad de pasos que ha caminado en el juego. ¿Cómo puedo mostrar ese int en Fungus sin inicializarlo desde el mismo Fungus?

Share this post


Link to post
Share on other sites

tienes que crear una variable de el mismo tipo en el diagrama de flujo (Flowchart), hacer que esta sea publica, y luego, en un script en el que tengas importada la librería fungus, creas una var Fungus a la que llamare f, y luego simplemente pones (imaginemos que la variable es de tipo bool) 

  public Flowchart f;
bool EstaVivo = false;
    void Start()
    {
        f.SetBooleanVariable("nombre de la bariable creada en el flowchart",EstaVivo );
    }

No se si se me entiende.... 

 

si te sigues con dudas, te recomiendo que mires este video

a partir de el minuto 21

 

suerte

Edited by nomoregames

Share this post


Link to post
Share on other sites
On 6/11/2020 at 10:39 AM, nomoregames said:

tienes que crear una variable de el mismo tipo en el diagrama de flujo (Flowchart), hacer que esta sea publica, y luego, en un script en el que tengas importada la librería fungus, creas una var Fungus a la que llamare f, y luego simplemente pones (imaginemos que la variable es de tipo bool) 


  public Flowchart f;
bool EstaVivo = false;
    void Start()
    {
        f.SetBooleanVariable("nombre de la bariable creada en el flowchart",EstaVivo );
    }

No se si se me entiende.... 

 

si te sigues con dudas, te recomiendo que mires este video

a partir de el minuto 21

 

suerte

Muchas gracias, te expresaste muy bien, voy a hecharle un buen vistazo a la documentación.

  • Like 1

Share this post


Link to post
Share on other sites
On 5/30/2020 at 12:32 PM, overbaal said:

Buenas gente, queria preguntar una duda aver si alguien puede darme una idea de como hacer que 2 NPCS dialoguen entre si.

He pensado en las Coroutines, que un NPC empieze y luego esa misma llame a otra Coroutine del otro NPc para dialogar pero no se por donde empezar.

Gracias de antemano y un saludo!

Ei, 

yo me vi en las mismas hace poco y acabe creando un script configurable para dialogos, muy sencillo de configurar. Se basa en un array de frases, cada frase es de un struct definido que he llamado _sentence. Cada _sentence esta compuesta por el texto, el personaje al que pertenece y si tiene que activar o desactivar el bocadillo que rodea al texto. Puedes tener multiples NPC's cada uno con frases diferentes, bocadillos o no, y activarlos o desactivarlos en la frase que quieras.... la verdad es que se me hace complicado de explicar como es y como funciona, casi que lo mejor es que le des un vistazo al vídeo que te dejo al final. 

El script vendría a ser este: 

public class DialogManager : MonoBehaviour
{
    /*
     * El _dialogBox es opcional, es una caja
     * que rodea al texto, el script solo
     * la activa y desactiva. 
     */
    [System.Serializable]
    public struct _dialogBox
    {
        public int _character; //Personaje al que pertenece. 
        public GameObject _box; //Objeto a activar / desacticar 
    }

    /*
     * _sentence. El dialogo se construye en base a un array
     * de esta estructura
     */
    [System.Serializable]
    public struct _sentence
    {
        public int _character; //Caracter al que pertence la frase. 
        public string _2say; //Lo que tiene que decir. 
        public bool _active; //Indica si se tiene que activar el marco de dialogo. 
        public bool _deactive; //Se desactivara el marco de dialogo en la siguiente frase. 
    }
    
    public TextMeshPro[] _textContainers; //Array de TextMeshPro en los que se muestra el texto 
    public _sentence[] _sentences; //Array de frases que diran nuestros protagonistas
    public _dialogBox[] _dialogBoxes; //El marco que puede mostrarse rodeando las frases. 

    [SerializeField]
    private float _speedWrite; //Tiempo que pasa entre que se escribe una letra y la otra. 

    //private bool _enableDisableBox = false; 
    private int _index = 0; //Contador interno para saber por que frase vamos. 


    private void Start()
    {
        CleanText(); //Limpiamos el texto que se pueda encontrar en los textmeshpro
        if (_sentences[_index]._active == true)
        {
            //En el caso de que la primera frase lo indique activamos el dialogbox. 
            EnableDisableBox(true);
        }
        //Empezamos la conversacion. 
        StartCoroutine(Talk());
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            /*En el caso de que se detecte una pulsacion
            de mouse se continua el dialogo. */
            ContinueDialog(); 
        }
    }

    public void CleanText()
    {
        //Eliminamos el texto de todos los TextMeshPro
        for (int i = 0; i < _textContainers.Length; i++)
        {
            _textContainers.text = "";
        }
    }

    /*
     * Esta funcion se ejecuta en paralelo.
     * Escribe las frases letra por letra. 
     * */
    IEnumerator Talk()
    {
        //Elimina el texto previo. 
        _textContainers[_sentences[_index]._character].text = "";
        foreach (char letra in _sentences[_index]._2say.ToCharArray())
         {
            //Suma cada letra al TextMeshPro
             _textContainers[_sentences[_index]._character].text += letra;
            //La funcion se espera el tiempo indicado.
            yield return new WaitForSeconds(_speedWrite);
         }
    }
    /*
     * Activa o desactiva el elemento que puede contener el texto
     * y que se lo indicamos en el editor
     * */
    public void EnableDisableBox(bool enable)
    {
        _dialogBoxes[_sentences[_index]._character]._box.SetActive(enable);
    }
    /*
     * Continua con la siguente frase del dialogo
     */
    public void ContinueDialog()
    {
        if (_sentences[_index]._deactive == true)
        {
            //Si la frase anterios tenia que ser desactivada llamamos a
            //la funcion que desactiva su globo 
            EnableDisableBox(false);
        }
        //Aumentamos en 1 el _index con lo que pasamos a la siguiente frase. 
        _index += 1;

        //Comprobamos que tenemos otra sentencia que escribir
        if (_index < _sentences.Length)
        {
            if (_sentences[_index]._active == true)
            {
                //Si es necesario activamos su dialog box
                EnableDisableBox(true);
            }

            StartCoroutine(Talk());
        }
        else
        {
            //si es la ultima frase, limpiamos el texto. 
            CleanText();
        }
    }
}

Si has empezado a usar Fungus esto te va a parecer del paleolitico y super simple, pero como ejemplo de como crearlo no esta mal del todo. 

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...