Noticias

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

AYuda para realizar conversación interactiva

Iniciado por lozdanmultimedial, Febrero 15, 2016, 10:14:27 AM

Tema anterior - Siguiente tema
HOla, saludos a todo el grupo:QUiero establecer una conversación entre un FPC y un NPC usando para el FPC el teclado de la PC (SO. windous 10) que debe ser visualizado en pantalla y el NPC responde mediante un texto en pantalla.  El diálogo se dispara cuando el FPC colisiona con el Collider del NPC  y finaliza cuando egresa del mismo Collider, ( esto ya lo tengo hecho ). He buscado algo acá en el foro y lo que he encontrado no funciona, he leido la documentación de la Api de Unity y solo he logrado que se pueda tipear una pregunta y recibir la respuesta pero al intenar poner esto en algún tipo de loop para repetir la acción Unity se cuelga.Este es mi código:por favor  respuestas con código en C# o Js    y copiar y enviar  a lozdanmultimedial@gmail.comMuchas gracias a todos.
http://unityspain.com/applications/core/interface/file/attachment.php?id=9203">Conversacion1.cs

Que triste esto jajajaja la gente ya no pide que le corrijan scripts de 200 lineas (que ya era gracioso el tema), demandan que les hagas un sistema (conversacion, inventario, etc) y hasta te dicen para que sistema operativo lo quieren asi no hayan dudas xD y lo que faltaba por ver, que se lo mandes por correo como si trabajaras para ellos o un foro fuera un centro de asistencia personal 24horas ... si me pagas (como buen trabajador), yo te lo hago encantado P.D. otra alternativa es aprender a programar; asi podras hacer lo que necesites sin depender de un videotutorial. Un cordial saludo

Te pongo el código, así te será más fácil cuando te pague por ello. Recuerda que es multimedial!
using UnityEngine;
using System.Collections;

public class Conversacion1 : MonoBehaviour
{
   string entrada ;
   bool choque;
   bool aprete_Return = false;
   
   void Start () {
      entrada = "Borre este texto y dialogue con el sabio en no mas de 140 caracteres. ";
   }
   
   void OnTriggerEnter(Collider otro )
   {
      if (otro.tag == "Player")
       {
         choque = true;

      }// end if otro.tag == "Player"
   }
   
   void OnTriggerExit(Collider otro)
   {
      if (otro.tag == "Player") {
         choque = false;
      }
   }
   

void OnGUI()
{
   bool impacte = choque;
      if (choque)
       {
          Event e = Event.current;
     
           if (e.keyCode == KeyCode.Return)
          {
            aprete_Return = true;
         }
          else if (aprete_Return == false)
          {
            entrada = GUI.TextField (new Rect (0, 0, 500, 20), entrada, 140);
            // aca codificar el algoritmo para la respuesta del chatbot.       
         }
         
         if (aprete_Return == true) {
            string salida = "Hola mundo";
            salida = GUI.TextField (new Rect (0, 20, 500, 20), salida,140);
         }
      }// end if choque
         
}// end OnGUI

}// end class
 

Aunque coincido con los dos compañeros, te diré que los bucles no van funcionar en Unity como tú crees o esperas, si pones un bucle for o while y crees que se seguirá la ejecución del programa mientras uno de estos bucles no tenga fin se te va a colgar, busca info sobre Corrutinas y vuelve a postear, sin pedir que te manden la solución al correo, claro.

[quote author=lozdanmultimedial date=1455527667" data-ipsquote="" data-cite="lozdanmultimedial" class="ipsQuote">HOla, saludos a todo el grupo:QUiero establecer una conversación entre un FPC y un NPC usando para el FPC el teclado de la PC (SO. windous 10) que debe ser visualizado en pantalla y el NPC responde mediante un texto en pantalla.  El diálogo se dispara cuando el FPC colisiona con el Collider del NPC  y finaliza cuando egresa del mismo Collider, ( esto ya lo tengo hecho ). He buscado algo acá en el foro y lo que he encontrado no funciona, he leido la documentación de la Api de Unity y solo he logrado que se pueda tipear una pregunta y recibir la respuesta pero al intenar poner esto en algún tipo de loop para repetir la acción Unity se cuelga.Este es mi código:por favor  respuestas con código en C# o Js    y copiar y enviar  a lozdanmultimedial@gmail.comMuchas gracias a todos.Conversacion1.cs[/quote]no he visto tu codigo pero aqui te dejo un tutorial con codigo de ejemplo:http://www.morphodia.com/portal/lessons/conversacion-con-personajes/" rel="external nofollow]http://www.morphodia.com/portal/lessons/conversacion-con-personajes/seguro te ayudara mucho en el sistema de conversacion

MUchas gracias Blattor, ahora lo voy a ver.

cuando abri el script, me imagen un complejo algoritmo traducido a codigo, pero pues nah,  @lozdanmultimedial , tienes una base, pero muy muy sencilla, entonces, si quieres una conversacion "interactiva" ocupas un tipo lista de posibles preguntas y respuestas, entonces ambos lados tienen ese tipo de lista, y forme el usuario vaya seleccionando que pregunta hace, el que responde necesita verificar en su listado de respuestas que respuestas son las adecuadas, osea ocupas implementar un pequenio sistema experto, o un sistema de arbol jerarquico, no se darte un script asi nada mas, esta dificil puesto tu peticion no se soluciona con un script ya hecho.como todos ocupas primero saber un poco mas de programacion. asi que investiga un pco mas de listas,arreglos, estados, cambio de variables, y cosas asi, saludos

GRacias por tu respuesta ACArranza :pero por ahi no me explique bien lo que neceisto pues ya se que el sistema de preguntas y respuestas se hace con una base de dato o alguna de las estructuras de datos como las que mencionas, ese no es el problema, en mi código solo incorporé un par para ver el funcionamiento del flujo del algoritmo y esto es lo que aun ni he logrado hacer. A ver si puedo mejorar la explicaciónReiteero la cuestión no es la estructura de datos a emplear si no el flujo del algoritmoEn este sentido el mismo debería funcionar mediante un loop con alguan condicon de finalizacion o un break cuando el juagdor ingrese algún caracter especial como "return".El flujo deberia ser este, supongamos una conversación entre un NPC y un jugador humano que llamaremos "PLayer"entonces el dia´logo se dispara por la colision con el Collider del NPC (reitero que esto ya está hecho) y aparece un cuadro de texto que podria decir "hola que es lo que me quieres preguntar"en el paso siguiente debería abrirse otro cuadro de texto donde el usuario pueda tipear su pregunta, al presionar la tecla "return" el NPC debería volver a responder y así hasta que el usuario egrese del collider.Bien en los algoritmos de tipo "Eliza" o "Alice" u otros, el input de usario es procesado hasta obtener cada palabra de la oración ingresada y cargada en un array string [] palabras_del_input , luego el algoritmo busca en su base de datos alguna palabra que coincida con dicho input para seleccionar la respuesta, (esto no es la cueatión que deseo resolver, no respondan sobre esto por que tb lo tengo solucionado). Ya he probado justamente hacer un loop del tipo while o do while y el resultado es que UNity se cuelga supongo que por que la función OnGUI es una funcion que escucha eventos, pero en realidad la causa del cuelgue no me interesa, pero entonces no puedo usar ningún tipo de loop para que usuario y NPC dialoguen hasta que el usuario egrese del Collider.Si ejecutan el codigo que he adjuntado anteriormente o lo analizan verán que lo que sucede es:1) se abre un cuadro de texto con un texto que le indica al usuario lo que debe hacer, cuando el usuario apreieta la tecla "return" se abre otro cuador de texto con un "hola" que sería como la respuesta del NPC   y aquí acaba todo, lo que neceisto es que estas dos aciones se vuelvan a repetir hasta que el usuario abandone el Collider. ( reitero, la cuastión del Collider ya está resuelta ).Resumiendo: Ya que para que estas acciones se repitan y no pudiendo usar un loop, como debería hacerse esto.Ahora no necesito que me respondan a mi mail ya aprendí a usar este foro. Muchas gracias a todos.

Pues si dices que no te interesa la causa del cuelgue siendo tu problema principal ... Como mas se te podria ayudar (que no sea haciendo el script por ti) ?Como te ha dicho http://unityspain.com/profile/26011-juanma_teso/?do=hovercard" data-ipshover="" href="<___base_url___>/profile/26011-juanma_teso/">@juanma_teso si pones un bucle, da igual que la funcion sea OnGUI o Update o cualquier otra, siempre se te colgara si no tiene salida ... no importa que despues el codigo que contiene este bien escrito. No me he molestado en mirar el script has puesto, pero si te sirve de pista, las funciones Update o OnGUI ya son de por si solas una "especie de bucle".Saber programar no es solo escribir codigo, sino que mas importante que eso es saber lo que esta haciendo ese codigo en todo momento. Un saludo

GRacias Arthure por responderme .1) Bueno entonces por que se cualga y cual sería la solucón.2) si la funcion OnGUI es un bucle entonces por que las acciones no se vuelven a repetir??Quisiera comentarle lo siguiente por que ha varios me han respondido que debo aprender a programar y si tiene razón solo que yo tengo una cuestión de tiempo que explicaré a continuación:Este código es solo un pequeño experimento para realizar un chatbot entre jugador y un NPC donde el NPC en realidad responde cantando es decir que en lugar de responder mediante cuadro de texto dispara un archivo de audio guardado en disco.A su vez este chatbot es parte de un proyecto mayor que pueden leer aqui: https://www.facebook.com/clztesis2016/  donde está escrito brevemente ( a pesar de su longitud, jajaj ) en inglés y en español, scroleen hacia abajo que está en español por que lo publiqué primero.Ese proyecto a su vez es sólo la mitad de mi tesis final de posgrado en la carrera de "Magister en Tecnología y Estética del Arte Electrónico" UNTREF .El proyecto descripto en el facebook es lel prototipo de obra de arte electróncio que voy a presentar y se trata de uuna "NET ÓPERA", la otra parte de la tesis es la investigación teórica que consiste en definir el género net ópera, justificar teoricamente que la obra que presento es una ópera, cual sería la parte teatral de ma misma y cual la musical, los antecedentes culturales y otras obras que se puedan tomar como antecedentes de la mía, la cuktura de la web 2.0 o la web de la redes sociales y otras cuestiones.Todo el combo debe estar en manos de la universidad éste 29 de Agosto, no me queda mucho tiempo por eso necesito encontrar las soluciones rápidamente. Pasada la tesis será el tiempo de volver a estudiar algunas cuestiones sin la presión de tiempos de entrega.Aclaro una segunda cueastión, si yo fuese a dedicarme el resto de mi vida a la programación de video juegos entonces sería una cuestión fundamental YA pero mis proyectos de futuras obras de arte electrónico van por otros carriles aunque terminada la tesis me interesaría pasar de prototipo a obra finalizada y presentarla en diferentes premiaciones, eventos, convocatorias como el de Ars ELectronia de Linz y si alguna vez fuese premiada quien se cope con la idea repartiremos premios y otros ingresos en partes iguales.Desde ya muchas gracias por la paciencia que han demostrado dispensarme.Saludos desde Argentina Profesor Lozdan CLaudio ( Profesor en Mpusica or composición, facultad de Bellas Artes UNLP ciudad de La PLata, provincia de Buenos Aires, Argentina.

Hola, por partes ... a tu primera cuestion - duda ya has sido respondido en varias ocasiones en este mismo topic; cualquier bucle colgara la ejecucion si no tiene salida. No es que sea muy dificil de entender porque sucede lo mismo en cualquier ambito de la vida y no solo en programacion, pero te pongo un ejemplo grafico de una situacion ficticia (aunque sea muy chorra) a ver si asi captas la idea del problema :
  • Imagina que tienes que beber X veces una botella de agua, el procedimiento seria muy simple; llenas la botella, la bebes, vuelves a llenarla, y asi sucesivamente hasta terminar. Ahora imaginate que la botella tiene un agujero por donde se escapa mas agua de la que tu estas metiendo ... te encontraras con un bucle sin final (bucle infinito) porque nunca llegaras a llenar la botella. La solucion a este problema es de pura logica, y dependera de la situacion en concreto, pero que se puede resumir en asegurarse que siempre habra un momento en que se cumpla cierta condicion.
Respecto a tu segunda cuestion, no es que esas funciones sean bucles exactamente pero tienen un comportamiento muy similar ... si a un programador le dices que son bucles, te mirara con cara extraña porque es algo mas complejo que eso, pero si se lo dices a alguien que no tenga conocimiento podria ser algo valido por lo menos para entender que funcion tienen. El caso es que lo que haya dentro de esas funciones SIEMPRE se repetira, excepto que tu programes lo contrario ... te pongo otro ejemplo:
private bool segundoBoton = true;

private void OnGUI () {

    if (GUILayout.Button ("ocultar")) segundoBoton = false; // esta linea se ejecutara SIEMPRE
   
    if (segundoBoton)
   
        if (GUILayout.Button ("pulsar")) Debug.Log ("pulsado"); // esta linea solo se ejecutara si segundoBoton es verdadero
}
Algo similar ocurre con el resto de funciones como Update, etc.Y sobre tu situacion personal ... bueno, si realmente no tienes idea de programacion y se trata de una tesis de universidad, tienes dos opciones bajo mi punto de vista : buscarte un programador que te haga la parte de programacion, o bien entregar una chapuza a medio terminar porque un par de meses se me antoja muy poco tiempo para aprender programacion, realizar la parte de programacion (despues de este bache vendra otro) y al mismo tiempo sacar adelante la otra mitad de la tesis.Hubiera habido otra tercera posibilidad, pero imagino que ya estara fuera de plazo ... y es haber escogido una tesis que encajara con los conocimientos que tenias, aunque cualquier tesis siempre tiene mucho trabajo; por ejemplo una tesis de investigacion (que es lo que se suele hacer)

te estás enredando demasiado, el tutorial que te di hace lo que has dicho que necesitas y mejor pq no usa OnGUI que es muy dificil de personalizar visualmente, sino el nuevo canvas de unity

Gracias Braltor por tu respuesta, estuve mirando el tutorial que me pasastes y mi chatbot es diferente pero algo de allí saqué así que agradezco el envío. En ese código las preguntas posibles del jugador ya están pre definidas, solo pueden ser las que están en el diccionario. En mi caso el jugador debe poder tipear en algún cuadro de texto o donde fuere la pregunta que desee hacer. El modelo de chatbot que deseo hacer es del tipo "Eliza" o "Alice" donde se usa técnicas de IA para encontrar la respuesta adecuada. Cuál es mi problema? Descripción del algoritmo: El algoritmo tiene un flujo y un sistema de IA 1) El jugador colisiona con el Collider, activa el script del chatbot. 2) El NPC saluda. 3) 3) se abre un cuadro de texto (o lo que fuese ) donde el usuario ingresa su pregunta tipeando en el teclado, cuando aprieta la tecla return se carga el texto en una variable string. 4) El sistema de IA encuentra la respuesta 5) El NPC abre otro cuadro de texto con su respuesta. 6) Los pasos 3,4 y 5 se repiten (un loop) hasta que ..... 7) El jugador egresa del Collider. Los pasos 1,4 y 7 ya los tengo resueltos, aclaro que el paso 4 está resuelto en forma provisoria así que quizá en el futuro aparezca algún problemita allí pero mi NPC responde de una forma muy metafórica, elíptica, es como un oráculo por lo tanto no es necesario un fuerte algoritmo de IA ya que en mi caso la coherencia entre pregunta y respuesta es irrelevante. EL problema que tengo es el flujo de los pasos 2,3 y 5. Estoy intentando resolver esto, adjunto el código pero aparece un problema adicional que público aquí mismo con este título: "variable no asignada (pero la variable no existe [[creo]])" lo que no me deja probar si mi solición de fondo funciona.
http://unityspain.com/applications/core/interface/file/attachment.php?id=9212">conversacion3.cs

Etiquetas: