[Ayuda] Juego en Unity 2D a través de Spring MVC con Hibernate.

afhn

Buenas, voy a crear un hilo a parte para esta consulta porque he de explayarme para que se pueda entender mi problema.
Tengo que hacer un proyecto final de grado y el tema que teníamos para elegir era bastante extenso mientras creáramos algo que gestionase una base de datos a través de cualquier servidor de aplicaciones.
La cosa es que escogí hacer un proyecto bastante ambicioso, y aunque he conseguido hacer la mayoría me falta lo más importante y en lo que tengo nulo conocimiento y quiero conseguir hacer esto antes de semana santa para poder meterme de lleno en otras partes del proyecto que aún no he tocado, de todos modos no tiene que estar el juego completo, simplemente con que me funcione el login y que después el juego ataque a la base de datos en base a ese login me vale para entregar después.

Os explico en qué consiste el proyecto:
El framework que estoy usando es Spring y el tipo de proyecto es Spring MVC. Estoy usando también para la conexión con la base de datos Spring Data JPA con Hibernate.
La aplicación consiste en una juego web. Tengo un juego hecho en Unity 2D con lo necesario para poder gestionar la base de datos de forma sencilla, y tengo de parte del servidor web unas vistas con login, perfil y game, supuestamente cuando llegas a la vista de game llegas con 3 objetos, uno de cuenta de usuario, otro de personaje y otro de progreso y se ejecuta el juego. Hasta aquí todo perfecto, consigo que me lance el juego, consigo que el login funcione perfectamente y consigo que llegue con todos los datos que necesito para que cuando inicie el juego los tome como referencia Unity para atacar a la base de datos y hacer transacciones en base al usuario>personaje>progreso.

El juego lo inicio desde la vista Game.jsp que llama al Json que inicia el juego.

Y aquí es donde está lo más importante y es en lo que estoy atascado, porque no sé cómo hacer que en ese momento en el que se inicia el juego coja esos datos que estoy pasándolo al modelo. Me estoy saltando algún paso, me falta alguna implementación, algún método, no sé qué es lo que me falta para definir en Unity y/o en el proyecto para que cuando se inicia el juego coja esos datos y los use para hacer sus transacciones en base a la ID del usuario > ID campeón y su progreso. Alguna forma de transferirlos? Debería iniciar una transacción a través de PHP con los datos y cuando se inicie el juego que ataque a esa transacción y coja los datos para hacer lo que tenga que hacer? Pero no quiero tener que usar PHP, además que no sé si lo que estoy planteando con PHP es lo correcto y sí se podría hacer. No sé, estoy muy verde :sob: .

drakkenspain

Yo lo pondría en juegos, que seguro que en general tienen más experiencia con Unity que por aquí.

1 respuesta
JuAn4k4

No deberías necesitar JSP/PHP para nada entiendo yo.

Desde mi humidle ignorancia de Unity, no deberia la UI/UX/UnityGame (cliente) simplemente llamar a tu API (server) para todo ?

Depende de la version de Unity que uses, hasta puedes usar HttpClient directamente.

1 respuesta
afhn

#2 lo pensé, pero pienso yo que como es más tema de servidor web y desarrollo web que de juegos en sí.

#3 sí, en Unity puedes hacer una "conexión" a una base de datos a través de PHP, pero quiero hacer lo mismo pero a través de spring.

HttpClient

me has dado una idea, voy a buscar a partir de ahí, que todavía no he buscado cosas relacionadas a eso.
https://docs.unity3d.com/Manual/UnityWebRequest-RetrievingTextBinaryData.html
creo que esto me puede valer para ir empezando, cómo no pude caer en esto? iré mirando a ver si algo de esto me vale.

JuAn4k4

Pero PHP para que?

Con Spring creas una API/WebService y desde Unity llamas a esa API.

Tu API (controller) llamará a cosas que llegaran a la BD, pero no desde unity directamente.

1 respuesta
afhn

#5 no voy a usar para nada PHP xd, solo era un ejemplo.

y eso es lo que quiero buscar, una forma de pasarle a unity los datos que extrae de la BBDD el controller para pasarlo al model. Como dije, llego al modelo que carga el juego con 3 objetos con sus datos, esos datos tengo que buscar una forma de pasárselos a unity. Iré indagando en el doc de unity a ver si encuentro algo que me ayude... pfff.

B

Tú tendrás de la base de datos, un resultset de lo que sea de los datos para ello. Pues tendrás que convertirlo a lo que tu quieras que sea.

Tendrás tu modelo que serán las tablas de la DB y al recuperar los resultados conviertes estos a ese modelo para luego poder trabajar con ellos tanto desde el controlador como pasando sus valores entre estos.

-Crack-

Lo fácil es no pasarle nada a Unity y desde Unity luego atacas a tu webservice (tu backend MVC de Spring y tal) estilo http://midominio.com/getUserData?id=5000 y eso te devuelve un JSON, lo parseas en unity para construirte los objetos que necesites y au.

1 respuesta
afhn

#8 eso es lo que estoy mirando hacer. Estoy intentando hacer un script que pille todos los datos a través del get de la vista, pero pff, se me está haciendo muy complicado xd.

-Crack-

Quieres una "vista" que solo devuelva un JSON, como esto: http://www.mocky.io/v2/5a9e97073000005100234d1e (uso https://www.mocky.io/ para hacer mis pruebas si el backend todavía no lo tengo terminado, lo recomiendo). Luego en unity lo parseas con SimpleJSON o lo que quieras usar y ya está.

Si no te aclaras buscate info de como trabajar con JSON, que en todos los proyectos que comuniquen más de un sistema los vas a usar.

1 respuesta
afhn

#10 o sea, que en teoría, sólo tendría que crear un HTTP Response de parte del servidor que devuelva un JSon o algo así, no? Porque por ejemplo el primer link lo pongo en unity y me saca los datos, pongo el link de mi página y el me salta con esto

Request method 'POST' not supported.
El método HTTP especificado no está permitido para el recurso requerido.

pero bueno, es un comienzo, a partir de aquí, aunque tengo un cacao mental impresionante, puedo partir.

1 respuesta
-Crack-

#11 Eso es, tu server que te devuelva un JSON, texto plano, o lo que mejor te venga y luego ya en unity te construyes tus objetos con esa info. El error que te da igual es por usar POST en vez de GET al hacer la petición HTTP.

1 respuesta
afhn

#12 Sí, estoy mirando código en unity para hacer un request 'get' y no un 'post', que me estoy liando un huevo xd. A ver que encuentro. Anyway, gracias, creo que ya sé por dónde partir.
Una última cosilla, puedo crear directamente el texto plano en la vista? O sea, dentro de la vista que lanza el juego, crear el texto plano que invoque los objetos pero que esté oculto?

1 respuesta
-Crack-

#13 No sé si entiendo la pregunta :D Tú imagina tu servidor web como si fuese una base de datos a la que preguntar cosas, y te responde con datos, tu luego con eso en unity ya haces lo que quieras, pero el server solo te va a dar datos.

1 respuesta
afhn

#14 lo que digo que si en el @GetMapping sólo he de añadirle esto produces = "application/json", después sólo con añadir texto plano en la vista cómo <pre>{"datos":"datos"}</pre> me valdría después para cogerlo desde unity con el scrip correspondiente y después atacar a la BBDD de forma independiente en base a esos datos recogidos, no? Sí es así, con esto ya me vale para poder seguir y dejar de estar atascado xd.

1 respuesta
-Crack-

#15 La vista en Spring ya no sé cómo se hace, lo toqué pero hace mucho, pero sí, la idea es que te devuelva texto plano/json.

1 respuesta
afhn

#16 aunque, no consigo con el get que me devuelva sólo X headers, anyway

ya va tomando forma el asunto, ahora sólo me queda buscar una forma de sacar los datos de todo el texto y a modificar todo para que unity ataque a la BBDD en base a esos parámetros, o aprovecho y directamente le paso una lista con todos los parámetros de los 3 objetos diferentes y voy asignando a los objetos del proyecto cada uno con sus valores correspondientes? No sé, ya veré a ver qué hago.
Muchas gracias por toda la ayuda!!
Menos mal, ya me estaba empezando a resignar de que iba a tener que dejar el proyecto de lado y hacer otra cosa para llegar a tiempo al plazo de entrega xd.

1 respuesta
Geekalvaro

No te líes. Busca como hacer una API con Spring MVC que devuelva JSON. Una vez que tengas construida la API el juego hará petiticiones http a la API. La API y el juego en sí son dos cosas independientes. De esta forma el juego podría estar ejecutándose en un navegador, en un móvil nativamente, en una consola o como aplicación de escritorio en un PC y atacar siempre la misma API.

Cabe aclarar que utilizar una API para un juego es buena idea para cosas que no necesiten tiempo real. Como por ejemplo, logins, inventarios, estadísticas, clasificaciones o juegos por turnos incluso. Si estás haciendo un juego multijugador en tiempo real ya es otro tema. Con tiempo real me refiero un LOL, OW, CS:GO o algo así. La simulación de la partida en si debería tratarse de otro modo.

Por ejemplo, en tu controlador de Spring MVC haces un RequestMapping para el personaje.

 
@RequestMapping("/personaje/{nombre}")
public Personaje personaje(@PathVariable String nombre) {
   return personajesService.getByNombre(nombre);
}

Si detecta jackson en el classpath devolverá el resultado automáticamente en JSON.

Y luego desde Unity, no sé bien como porqué no me manejo en C#, haces una peticion GET al servidor donde tengas corriendo tu aplicación Spring. Por ejemplo:

GET http://localhost/personaje/sonic

Deserializas el resultado y creas un objeto Personaje en tu juego con el que harás lo que sea que necesites.

1 respuesta
-Crack-

#17 Como dicen por aquí, no te líes. Tienes fallos de concepto que necesitas aclarar todavía. Te has liado con html y css. Quieres que una petición te devuelva texto sin formatear para poder leerlo en unity y OLVIDARTE de tu spring mvc después de eso hasta que te haga falta consultarle algo de nuevo.

1 respuesta
afhn

#18 es un juego rpg de estos web, así que, sólo necesitaría cargar datos una vez para cargar estadísticas y progreso.

#18 #19 Ya comenté que ando algo verde con esto, y entre eso y que hoy estoy algo malo, con el cerebro en modo ahorro de energía me está costando un poco pillar los matices xd.
Más o menos lo tengo así, lo que dejé esta tarde hecho más o menos:
Este sería el método get en el controlador de dónde sacaría los datos que necesito en el juego para atacar la base de datos independientemente

spoiler

Esta es la vista que le paso a unity para que coja los datos que sería llamada únicamente por Unity a través de la uri http://localhost:8080/app/account/data una vez se iniciase el juego

spoiler

y esto es lo que me sale en unity:

Y ya a partir de aquí, después de recibir esto en Unity ya sería trabajar los scripts ahí con el texto que me llega.

Dónde está el fallo? U.U
Sé que algo debería cambiar, pero no sé, no consigo caer.

De todos modos, acabo de probar a dejar solamente en el archivo JSP el "${datos}" y me llega tal que así:

Esto más o menos me debería de valer, no? O sigo equivocado y con un mejunje en la cabeza? :S

X-Crim

pero la respuesta debe ser json puro...

afhn

Pues mañana lo miro cómo hacer un response de json "puro" xd, que sinceramente, de no tener ni puta idea de cómo mandarle datos a unity desde el servidor web a poder mandarle los datos que yo quiera a unity ha sido un gran paso, por lo menos bajo mi punto de vista, ahora sólo hay que entender todo y hacerlo de forma correcta. De verdad, gracias por toda la ayuda.

afhn

Pues nada, supongo que con esto ya está:

@GetMapping(value ="/jsonData")
@ResponseBody
public Progress generateJSONPostsingle() {
    Progress prog = progImpl.findById(idProgreso);
    return prog;
}

He hecho, creo, no estoy seguro xd, todo lo que me habéis dicho. Bueno, ahora que ya me llegan todos los datos que quiero habrá que empezar a tocar los scrips y crear sus respectivas mierdas para que ataquen a la BBDD y que todo haga lo que quiero.
En serio, gracias por todo. Ya podéis chapar el hilo si queréis xd.

Usuarios habituales