Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Pasar de un diálogo a otro...

Iniciado por Bydark, Abril 12, 2017, 08:41:02 PM

Tema anterior - Siguiente tema
Abril 12, 2017, 08:41:02 PM Ultima modificación: Abril 12, 2017, 09:28:08 PM por pioj
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 !

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!
 
 

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



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

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
    }
}

 
 
 
 
 
 

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.

Marcar la respuesta correcta, pls.

Etiquetas: