Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Bydark en Abril 12, 2017, 08:41:02 PM

Título: Pasar de un diálogo a otro...
Publicado por: Bydark en Abril 12, 2017, 08:41:02 PM
Muy buenas, llevo varios días intento pasar de un diálogo a otro, sinceramente la manera de hacerlo tal vez no sea la más óptima, pero bueno, de momento con conseguirlo me conformo, después depuraré el código.
 
 
 
El problema que tengo es que mi código se va directamente a la segunda frase, y no sé como decirle que eso sólo debe hacerlo al pulsar por segunda vez la tecla "J"
 
 
 
Aquí os dejo el código, es C#  aunque haya puesto JavaScript para que se coloree un poquito:
 
 
 
PD: El script hace referencia al método GetMsg, el cuál está en otro script, no voy a poneros ese script porque no viene al caso y funciona perfectamente :) .
 
 
 

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
public class DeteccionDialogo : MonoBehaviour {
[SerializeField] GameObject PanelMsg;
[SerializeField] Text msgText;
[SerializeField] GameObject ButtonTalk;
    bool talking = false;
bool PressTalk = false;
int frases;
int contadorfrase;
void Start () {
   GetComponent<Collider> ().isTrigger = true;
   PanelMsg.SetActive (false);
   ButtonTalk.SetActive (false);
}
void OnTriggerEnter (Collider other) {

   if (other.CompareTag("npc")) {
      print ("Tag Comparado");                     // Se comparan los tags y si es NPC aparece el cartel para hablar
      ButtonTalk.SetActive (true);
   }
}
 
void OnTriggerStay (Collider other) {
   if (other.name == "npc_1" && Input.GetKey("j") ) {         // Si el nombre del otro collider es npc_1 y pulsas la tecla J... (FUNCIONA)
      ButtonTalk.SetActive (false);
      string msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_1 ();      //Si el NPC es el 1, se muestra el texto del método GetMsg_1 (FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
      if (Input.GetKey ("j")) {
      
         msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_2 ();      //Al pulsar DE NUEVO la tecla J, debería mostrar el siguiente texto.. (NO FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
            }                     
   }
}
void OnTriggerExit (Collider other) {
   if(other.CompareTag("npc")){
      ButtonTalk.SetActive (false);
      PanelMsg.SetActive (false);
   }
}
}

 
 
 
 
 
Muchísimas gracias y espero que podáis ayudarme a encontrar en qué estoy fallando, un saludo !
Título: Pasar de un diálogo a otro...
Publicado por: kingtrase en Abril 12, 2017, 10:33:02 PM
Aunque la forma en que lo haces no es la correcta ni de lejos, te dire una inconcluencia en tu codigo para que avances algo.
 

if (other.name == "npc_1" && Input.GetKey("j") ) {         // Si el nombre del otro collider es npc_1 y pulsas la tecla J... (FUNCIONA)
      ButtonTalk.SetActive (false);
      string msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_1 ();      //Si el NPC es el 1, se muestra el texto del método GetMsg_1 (FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
      if (Input.GetKey ("j")) {
      
         msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_2 ();      //Al pulsar DE NUEVO la tecla J, debería mostrar el siguiente texto.. (NO FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
            }                     
   }

 
En ese codigo lo que haces es: si mientras other.name es igual a npc1 y Input.getkey(j)  es pulsado, metes un if otra vez Input.getkey(j). si dejas la tecla J presionada un rato al final funcionara el codigo..., tendrias que hacer que: si el mensaje 1 se ha leido, se muestre el mensaje 2... pero te digo que esta no es la forma de hacerlo ni de lejos.
 
Busca en la assetStore algun plugin de dialogo... Suerte!
 
 
Título: Pasar de un diálogo a otro...
Publicado por: Bydark en Abril 12, 2017, 11:14:45 PM
Cita de: kingtrase date=1492029182Aunque la forma en que lo haces no es la correcta ni de lejos, te dire una inconcluencia en tu codigo para que avances algo.
   
   

if (other.name == "npc_1" && Input.GetKey("j") ) {         // Si el nombre del otro collider es npc_1 y pulsas la tecla J... (FUNCIONA)
      ButtonTalk.SetActive (false);
      string msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_1 ();      //Si el NPC es el 1, se muestra el texto del método GetMsg_1 (FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
      if (Input.GetKey ("j")) {
      
         msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_2 ();      //Al pulsar DE NUEVO la tecla J, debería mostrar el siguiente texto.. (NO FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
            }                     
   }

   
      En ese codigo lo que haces es: si mientras other.name es igual a npc1 y Input.getkey(j)  es pulsado, metes un if otra vez Input.getkey(j). si dejas la tecla J presionada un rato al final funcionara el codigo..., tendrias que hacer que: si el mensaje 1 se ha leido, se muestre el mensaje 2... pero te digo que esta no es la forma de hacerlo ni de lejos.
   
   
      Busca en la assetStore algun plugin de dialogo... Suerte!
   
   
       
   


Muchas gracias, si, sé que hay mejores formas de hacerlo, pero llevo días programando y bueno de momento esta es la más asequible, seguiré tu consejo.
 
He visto un buen plugin para esto, se llama "Fungus", pero la verdad es que lo he visto complejo para algo "tan sencillo"...te dejo el link por si te interesa a ti o alguien que lea este hilo, muchas gracias.
 
 
 
Fungus - Asset Store (https://www.assetstore.unity3d.com/en/#!/content/34184)
Título: Pasar de un diálogo a otro...
Publicado por: lightbug en Abril 13, 2017, 12:48:51 AM
Cita de: Bydark date=1492022462El problema que tengo es que mi código se va directamente a la segunda frase, y no sé como decirle que eso sólo debe hacerlo al pulsar por segunda vez la tecla "J"
   


Eso calculo que es por el GetKey, si queres que detecto solo cuando la presionas usa GetKeyDown.
 
Tenes un getKey dentro de un getKey o ya estoy borracho? las entradas manejalas puramente en Update(), quita todo eso del "stay", podes jugar con el Enter Exit (ya que se llama menos veces que el stay y no tendria sentido, a no ser que se entrada los npc esten dentro del trigger) y indicar un flag que sea npcDisponible = true/false por ej. En update haces algo como:
 

void OnTriggerEnter(Collider col)
{
...
      npcDisponible = true;
}
void OnTriggerExit(Collider col)
{
...
      npcDisponible = false;
}
void Update()
{
if(npcDisponible)
    {
       if(Input.GetKeyDown(KeyCode.J))
          pasarDeDialogo();   //lo que sea
    }
}

 
 
 
 
 
 
Título: Pasar de un diálogo a otro...
Publicado por: Bydark en Abril 13, 2017, 01:16:56 AM
Cita de: lightbug date=1492037331Eso calculo que es por el GetKey, si queres que detecto solo cuando la presionas usa GetKeyDown.
   
   
      Tenes un getKey dentro de un getKey o ya estoy borracho? las entradas manejalas puramente en Update(), quita todo eso del "stay", podes jugar con el Enter Exit (ya que se llama menos veces que el stay y no tendria sentido, a no ser que se entrada los npc esten dentro del trigger) y indicar un flag que sea npcDisponible = true/false por ej. En update haces algo como:
   
   

void OnTriggerEnter(Collider col)
{
...
      npcDisponible = true;
}
void OnTriggerExit(Collider col)
{
...
      npcDisponible = false;
}
void Update()
{
if(npcDisponible)
    {
       if(Input.GetKeyDown(KeyCode.J))
          pasarDeDialogo();   //lo que sea
    }
}

   
       
   
   
       
   
   
       
   


Muchas gracias, acabo de conseguirlo haciéndolo desde el update como me recomiendas, por fin...muchísimas gracias.
Título: Pasar de un diálogo a otro...
Publicado por: pioj en Abril 13, 2017, 11:33:54 AM
Marcar la respuesta correcta, pls.