Jump to content

J Montes

Registrados
  • Content Count

    145
  • Joined

  • Last visited

  • Days Won

    14

Everything posted by J Montes

  1. Yo también creo que ese código no funcionará en una build del juego. Está bien si estás haciendo una herramienta para el editor.
  2. Felicidades! 🙂 A mí me ha gustado. No necesito más de un juego, de hecho los gráficos, el estilo, también me ha gustado, y creo que funciona. Me ha gustado el detalle de que algunas gotas reboten en la cabeza del personaje. He probado las dos "rutas" (no quiero spoilear), pero ¿es el mismo final? (a mí se me queda la pantalla en negro). (Estoy usando la versión WebGL)
  3. Quizá te sirva esto: https://firebase.google.com/docs/auth/unity/play-games?hl=es
  4. Uno de los últimos videos y escenarios generados. Aún faltan muchas cosas o están rotas, pero poco a poco mejorando. Aquí vemos la construcción de edificios 3D de OpenStreetMap en la Catedral de Salamanca. ¡Apóyanos siguiéndonos en Twitter o en YouTube si te gusta!
  5. Aunque hay que recordar también que esto es una guía de mates, pero normalmente en Unity, para calcular el ángulo en ese caso, usaríamos Vector3.Angle.
  6. En este vídeo volvemos a probar el generador en otra ciudad (A Coruña). Se añade la hierba, algunos objetos más, el minimapa y algunos otros detalles. ¡También estrenamos logo!
  7. Hoy he visto esto, que creo que es lo que buscas. https://unity.com/es/products/mars Pero resulta que esto ahora es de pago :?.
  8. ¡Gracias! Son varios planos, en el vertex color llevan codificada la altura de la hierba a la que corresponden: Me lo han comentado, y creo que tenéis razón. Pero hacer un controlador de dron no es trivial, efectivamente. Lo del minimapa he visto de todo, pero necesitamos le lado izquierdo para algo más importante. A la derecha es como se suele llevar el navegador en el coche así que creo que es razonable. Para una siguiente versión nos gustaría que cada uno pudiera elegir dónde juega. Es técnicamente viable, pero necesitamos un servidor corriendo Unity y generando Assets. Además, necesitamos que de esa zona al menos hayamos introducido mapas de elevación y se tarda varios minutos en generarlo (si no está ya generado)... así que la infraestructura se complica un poco. No lo veo para una primera versión. Tenemos pensado generar una zona grande 12-20 ciudades grandes (sobre todo Europeas). Pero en el kickstarter permitiremos votar a los contribuidores, y directamente a los "gold sponsors" les permitiremos seleccionar una zona a su elección... si bien ésta no tendría casi carreras definidas, puede hacerlo el propio usuario, y luego compartirlo. También nos planteamos, a falta de una solución global, generar más packs de ciudades y ofrecerlos como DLC o gratis. No lo tenemos claro. ¿Cómo lo veis? Un saludo,
  9. Los flashes nunca llegué a saber lo que eran, estaba relacionado con el bloom, y el shader tenía errores así que creo que nunca lo sabremos... :?
  10. Pruebas con hierba volumétrica, que tenía pendiente subir aquí: He escrito el shader (la versión actual es algo más fina que la de este video que he subido), basándome en este artículo: https://www.bruteforce-games.com/post/grass-shader-devblog-04 .
  11. Yo creo que no he hablado de "herencia genética" en ningún caso. Es verdad que a veces respondemos un poco cortantes pero es que... no sé, no has hecho ninguna pregunta de ningún problema concreto que tengas. "Ejemplos de uso de clases" hay miles en Internet, y si ninguno de esos te sirve es difícil ver cómo podemos ayudarte aquí a ciegas. En general, yo si una pregunta no es sobre un caso concreto, no suelo responderla, y te he respondido porque eres tú y sé que te esfuerzas y colaboras. De todas formas, tienes razón el tono no es ni correcto ni didáctico. También creo que deberíamos cada X días hacer una reunión y que la gente pudiera hacer preguntas y respuestas porque si tienes dudas sobre cómo plantear los proyectos, necesitas mentorización o docencia y un foro es demasiado lento para que puedas progresar, en mi opinión. Tío, coge un proyecto pequeño y hazlo desde cero: Pong, Arkanoid, Tetris, Snake. Y pregúntanos cosas concretas, muestra el código que falla... Dinos con qué proyecto te has puesto, crea un único hilo para él y vamos a intentar ir siguiendo el progreso desde cero. Prepáralo para webgl, de forma que si es necesario, quienes queramos podamos probarlo rápido y sin complicaciones. Esa es mi propuesta. Sin proyectos "concretos", yo lo único que puedo hacer es recomendarte que sigas tutoriales básicos (como hemos hecho todos ¿eh? que nadie nace aprendido). ...yo lo siento pero no recomiendo que hagas un curso que usa Java como vehículo cuando necesitas aprender C#. Bastante difícil es aprender un lenguaje como para aprender dos a la vez. Y más cosas: "Llevo" es con LL y con V. "Echarais" es sin H. Yo te entiendo pero en C# si te equivocas en estas cosas el compilador da un error ;-).
  12. Vale es con V. Tuvierais también. ¿No tienes un corrector ortográfico en el navegador? haz el esfuerzo jo... Hay multitud de tutoriales de programación orientada a objetos, no creo que tenga mucho sentido soltar aquí cuatro parrafadas. El motivo de crear una clase, en POO, es para agrupar bien datos, bien código, o ambas, que se aplican de manera conjunta a algo que trataremos como una única "entidad". En el ejemplo del DialogItem, como un diálogo tiene varios parámetros (duración, personaje, texto...), creamos una clase que representa y almacena esos datos conjuntamente. Después creamos varias instancias de esa clase, una para cada línea de diálogo. Esto se puede extender a casi cualquier "entidad" con la que necesites tratar. Un jugador, un vehículo, un enemigo, un item, una bala, una pieza de un puzzle, el puzzle entero... combinamos objetos con otros objetos para componer clases más complejas que representan y gestionan cada vez una parte mayor de la información de tu aplicación. A diseñar bien se aprende con el tiempo, sobre todo leyendo y escribiendo mucho código (estudiar formalmente también ayuda a tener unas buenas bases). Recuerda que una cosa es "definir una clase" (class MiClase) y otra "crear una instancia de una clase" (new MiClase()) . Llamamos a veces "objeto" a todo pero hay que tener bien clara la distinción.
  13. Bueno pero el autor del hilo al menos sí quiere que le funcione. El que quiere aprovecha y saca nota, y el que no o no le interesa pues le darán un títulillo y acabará seguramente currando de otra cosa (de político seguramente). Eso siempre ha pasado ¿no? (de todas formas @iRobb estamos offtopicando jebimente).
  14. Estoy de acuerdo. La sugerencia es buena y razonable, la implementación yaa.... no :). Pero bueno, no cabe duda de que @nomoregames vas avanzando. (Nota, @francoe1, en España si dices "arreglo" no te entiende nadie -aunque realmente es correcto, pero no se suele enseñar-, sugiero que usemos todos "array" para evitar confusión aquí). Dejémonos de ScriptableObjects y editores de nodos, la pregunta viene de alguien que está empezando con el tema diálogos y claramente necesita un consejo menos complejo. Usar archivos estaría bien pero nos preguntan por cómo secuenciar el diálogo así que pongámonos didácticos. Te pego un ejemplo en el que el diálogo está definido estáticamente en un array/arreglo como bien decía @francoe1, y con un uso razonable de la Coroutine. Molaría que ( @nomoregames y @overbaal ) lo leáis, lo probéis, y preguntéis cualquier cosa que no entendáis. He puesto las variables y comentarios en inglés porque eso es lo que recomiendo hacer a todo el mundo, pero si no entendéis algo, preguntad también. using System.Collections; using System.Collections.Generic; using UnityEngine; public class DialogManager : MonoBehaviour { /** * This class holds the information of each dialog line. * Could also include icons, colors or other information needed. */ public class DialogItem { public float duration; public string name; public string text; public DialogItem(float duration, string name, string text) { this.duration = duration; this.name = name; this.text = text; } } // Example initialization, but we could extend this class to read this from a file // or from wherever we need to. DialogItem[] dialogItems = new DialogItem[] { new DialogItem(2.0f, "Epi", "Y por fin he encontrado el Vespino"), new DialogItem(2.0f, "Blas", "que me ha de llevar a Santiago,"), new DialogItem(3.0f, "Epi", "y esta noche me espera el amor"), new DialogItem(2.0f, "Ana", "en Betanzos...") }; void Start() { // Start a dialog here as an example. // In an actual game, dialogs would be started from elsewhere calling this function. StartDialog(dialogItems); } /** * This starts a dialog. */ public void StartDialog(DialogItem[] dialogItems) { StartCoroutine(DialogManagerCoroutine(dialogItems)); } /* * This coroutine runs a dialog sequence and ends. * There are many ways to do this, this is a simple iterator over dialog items: */ IEnumerator DialogManagerCoroutine(DialogItem[] dialogItems) { int currentItemIndex = 0; // Loop over the dialog items until we are finished: while (currentItemIndex < dialogItems.Length) { // Grab the current dialog item DialogItem currentItem = dialogItems[currentItemIndex]; // Show it (we call a different function so we can change that) ShowDialogItem(currentItem); // Use "yield return new WaitForSeconds" in the coroutine to wait. This does not waste CPU cycles. yield return new WaitForSeconds(currentItem.duration); // Finally, increment current item. currentItemIndex++; } } /** * Show a single dialog item. In this example we just write to console. */ void ShowDialogItem(DialogItem item) { Debug.Log(item.name + "> " + item.text); } } Salida: ...y por favor (@nomoregames te miro a ti) intentad formatear el código bien. Ahí arriba hay muchísimas líneas en blanco sin sentido, a veces dobles o triples, y partes donde el código está mal indentado. También es cierto que el editor de la web no ayuda (la lía un poco con tab/spaces), hay que escribirlo en el editor de código y pegarlo aquí del tirón. Ya comentaréis ¡un saludo!
  15. Bueno he sacado una lista de notas, te la mando (ojo viene sin garantía 😉): 0:11 La reflection del sol es muy fuerte y creo que no está teniendo en cuenta el edificio de enfrente (no debería verse el sol). 0:45 Me gusta el efecto del texto al dibujarse (¿cómo haces, vas reconstruyendo la cadena cambiando el <color> con rich text?). 0:47 ¿Se dice recharges o clips? (no estoy seguro si es la misma cosa y es un false-friend, o son cosas diferentes, no soy mucho de armas). 1:00 Muy chulos los rayos del sol sobre el horizonte (¿luces volumétricas o skybox?). 1:11 Ya lo había notado en otros videos, pero los puños parece que requieren estar realmente cerca, o la cámara da una sensación de más cercanía, pero yo esperaría que ese puñetazo alcanzara al NPC. Esta sensación la tengo más veces con los puños. 1:19 Creo que los enemigos necesitan una animación de "voy a atacar" (esto tiene un nombre que no me sale...). Porque sueltan unas leches de primeras que te ponen fino sin alerta ninguna. 2:30 El comienzo y el tono de la música muy bien, junto con el amanecer. ¿Está scripteado así? ¿por qué empieza en ese momento?. ¿Esta pieza era tuya o es un asset de 3rd party?. 3:31 Ahí el sol es más creíble, aunque creo que tampoco debería verse (no sé si el edificio está en sombra). En cambio perfecto en 3:38 a la izquierda. ¿Reflection probes? (aunque si no lo sabes tú... 😉 ). 4:50 Las iluminación volumétrica también le dan un aspecto estupendo. Otras cosas: Me llama mucho un FPS con motor de día/noche/clima. No se suele ver, y da un aspecto orgánico a las partidas. Aunque no veo del todo cómo encaja en un juego con una trama guionizada (lo vería más en un juego más orgánico). Reinsisto en mi sugerencia de tener un modo de juego casual de niveles de 5-10 minutos, tipo gymkana matazombis o... :? Te recomiendo encarecidamente que eches un ojo a este video sobre combat systems, creo que te puede dar ideas para "tipificar" el tuyo (todo el canal es genial): https://www.youtube.com/watch?v=8X4fx-YncqA&t=2s Felicidades, ¡estás avanzando un montón!
  16. Son tuyos todos los assets o has reutilizado alguno por ahí? Creo que, si ya has llegado a un cierto nivel, podrías intentar seguir un curso o estudiar algo de modelado 3D porque, aunque no es mi área, me da la sensación de que por "un poquito más de maña" podrías tener "mucho más resultado". No se si me explico. En cualquier caso, felicidades por el trabajo y gracias por compartir.
  17. Gracias :). Esta es la "mínima IA" de los oponentes. Intentaŕe mejorarla pero al menos es bastante competitiva. En realidad no se siguen unos a otros, los boxcast son para esquivarse o frenar tanto entre ellos, como con el jugador y con los obstáculos (peatones, otros coches, farolas...). De hecho después de unas vueltas suelen estar repartidos por el circuito. En carrera los coches siguen un trazado predefinido. Saben por donde tomar una curva y dónde deben frenar porque "se lo están diciendo". Sobre ese trazado predefinido hacen correcciones ya que puede haber obstáculos o ser golpeados. Atraviesan la glorieta porque al grabar esa vuelta yo atravesé la glorieta (aunque tienden a "atajar" de todas formas). En este caso todos están siguiendo el mismo trazado y se nota pero en el juego habrá diferentes variaciones pre-grabadas y se reajustarán los tiempos. Cuando uso diferentes trazados de referencia en cada coche el resultado es más "orgánico" y mucho menos repetitivo, pero en general van más despacio al tener que ajustarse a los cambios de régimen del tráfico que tengan delante, y eso es un problema porque no puedo llevar los tiempos al límite (serían demasiado fáciles o demasiado tramposos comparados con los jugadores buenos). Vamos, que queda curro, y supongo que probaré el ML Toolkit para esto. Sin embargo, para la IA del tráfico utilizaré una aproximación diferente: no habrá seguramente trazados predefinidos, los vehículos irán de intersección a intersección haciendo sus historias, pero de manera sencilla, sin requerir un trazado de referencia cada uno (que no sería viable hacer a mano para toda la ciudad). Son bastante brutos pero si te ven a tiempo te esquivan o frenan. Por otra parte, lamento informarte de que tu actitud no es la correcta para un verdadero street racer. Todo el mundo sabe que si hay macarras yendo a toda leche por la ciudad, la mejor manera de evitarlos es yendo siempre tú más rápido 8-).
  18. ¡Venga ya! Cómo se te nota la mano que tienes con render realista y el diseño y las luces, la ambientación se ve increíble. Hay un momento al mirar hacia arriba al recorte del edificio, que no sé si aplica algo de bloom, pero es genial, totamente horror-themed y no sé por qué no decir, nivel AAA. Hacía días que no lo veía y he flipado. Cons por decir algo: - La carretera se ve vacía, pero claro está sin enemigos. Pero aún así harán falta unos coches o algo creo yo. Supongo que ya lo sabes. - El salto me parece corto, pero sé que te mola más realista y el gameplay exige ir despacio, pero entonces ¿sirve para algo saltar?. No me hagas mucho caso, yo es que siempre fui de quake y se me hace raro no flotar varios metros al saltar.
  19. ¡Hola de nuevo! Dejo un video mostrando las pruebas con la IA de los oponentes:
  20. El log del player está en: Linux ~/.config/unity3d/CompanyName/ProductName/Player.log macOS ~/Library/Logs/Company Name/Product Name/Player.log Windows C:\Users\username\AppData\LocalLow\CompanyName\ProductName\Player.log Info de: https://docs.unity3d.com/Manual/LogFiles.html Recuerda siempre acudir a los logs cuando veas algo raro en "producción". Son el primer indicador de lo que pueda haber ido mal (no siempre, pero suelen ayiudar). Para ver el logging de Unity y el de tu aplicación echa un ojo a las settings de logging del Player, que dicen qué nivel de log se imprime (si lo crees conveniente, cámbialo para incluir más mensajes de log). Puede serte util esta respuesta: https://answers.unity.com/questions/125049/is-there-any-way-to-view-the-console-in-a-build.html De todas formas imagino que estás en Android porque hablas del emulador. Para ver qué pasa en el movil, puedes conectar el movil al PC (no a Unity, aunque eso también es otra alternativa) y utilizar LogCat (la herramienta de Android Studio) para ver los logs del sistema Android. Una vez funcione, arranca entonces tu aplicación y deberías poder ver su log (esto es el equivalente al archivo de log en Linux, macOS o Win).
  21. Una duda que siempre tuve. Los dos primeros modos, entiendo que no hay que multiplicarlos por Time.fixedDeltaTime,y que los dos últimos habría de considerar el fixedDeltaTime si quiero operar con ellos no? En otras palabras: los dos primeros ya tienen en cuenta el fixedUpdate y están pensados para ser aplicados "continuamente", mientras que los dos últimos nos valen para aplicar cambios en un sólo frame? Yo siempre hago las cuentas con el primer modo (Force) y luego me veo ajustando un poco las físicas "al gusto" con los diferentes parámetros, pero debo confesar que nunca he tenido esto claro.
  22. De todas formas, el último error no indica ya problemas de codificación. Parece que hay un problema con las opciones de red al abrir el socket... esto podría ser por falta de permisos en Android (quizá te falte algún permiso en el manifest). ¿No dice nada más el log?. Si la conexión que estás haciendo es segura (SSL), aunque no lo parece por la cadena de conexión), podría tratarse de un problema de certificados. El cliente necesita aceptar el certificado del servidor (o de su autoridad certificadora). Creo que veríamos otro error diferente en ese caso. El permiso que necesitas en Android para abrir sockets al exterior es: <uses-permission android:name="android.permission.INTERNET" /> Esto tienes que añadirlo a tu manifest, pero como Unity combina los manifests al generar el proyecto, el sitio donde tienes que ponerlo es uno específico. La documentacion aquí: https://docs.unity3d.com/Manual/android-manifest.html Por otra parte, estaba dando por hecho que lo habrás contemplado pero como dice @francoe1 nunca debes permitir que usuarios ajenos se conecten a tus bases de datos directamente. Si es una aplicación personal, o para una pequeña organización, los usuarios/permisos de MySQL pueden ser suficientes. Pero en términos generales, siempre deberías tener un servicio intermedio que autentique a los usuarios y haga las operaciones en la base de datos.
  23. El último error que pones es diferente (¿sabes leer esas trazas, o "stack dumps"? - es importante). Este error ¿ha cambiado después de añadir las DLLS? sería bueno saber si las DLLs solucionaron el error anterior y ahora estamos viendo otro. El error ahora aparece al llamar a Socket.GetSocketOption, y es una excepción de tipo "Invalid Arguments". Esto sugiere que quizá estabas sin conexión de red, la base de datos estaba caída, o el hostname / ip / puerto están incorrectamente definidos. Como todo esto está dentro del constructor de la conexión, al igual que antes, ahora me surge la duda ahora de si la codificación se establece antes o se negocia con el servidor. Lo último que se me ocurre es que mires también la configuración del servidor MySQL, ya que cada base de datos (o incluso cada tabla y columna) puede tener una codificación diferente. Asegúrate de que tu base de datos es UTF8: select default_character_set_name, schema_name from information_schema.schemata
  24. A ver... pero entonces no necesitas una WebCamTexture yo creo. Primero, no traduzcas cosas como "privado xmgMagicFaceBridge" porque el código no se traduce. Es "private". Y yo preferiría las fuentes en inglés y el enlace, pero ya lo he buscado por ahí. Lo que te están diciendo es que no uses la captura nativa de esta biblioteca (que soporta móviles y/o WebCamTexture en el escritorio). De esta forma, el componente XZIMG deja de gestionar la entrada de video y tendrás que alimentarla tú con imágenes de tu video. Así que tenemos varias partes: 1) sacar imágenes de tu video 2) ponerlas en un formato que XZIMG pueda entender 3) dárselas a XZIMG. 1) No nos has dicho qué formato de video tienes ni cómo lo estás leyendo. Nunca he usado video en Unity pero por lo que veo hay una cosa llamada VideoPlayer que nos permite acceder a las imágenes de cada frame (https://docs.unity3d.com/ScriptReference/Video.VideoPlayer-texture.html), en formato Texture. Al parecer esto en realidad es una RenderTexture y puedes obtener la imagen de ahí así como su dirección de memoria. Observa que tendrás que suscribirte a una serie de eventos para saber cuándo la texture presenta datos nuevos, etc. Hay información imprescindible en: https://stackoverflow.com/questions/42747285/get-current-frame-texture-from-videoplayer . Observa que es costoso hacer esto y que quizá más adelante necesites considerar procesar el video de otra manera y no cada frame con este mecanismo, depende mucho de tu caso de uso. 2) Vamos a suponer que el formato no es un problema por ahora. 3) Te dicen que prepares una imagen para contener los datos que la biblioteca procesará. A mí me surge la duda de si esta biblioteca necesita que se le actualice la imagen cada vez que cambia o hay que pasarle la dirección de memoria y ya "ella se apaña". Como lo segundo sería raro, vamos a suponer lo primero para ir probando. Primero, declara una variable para la imagen que la bibiloteca procesará: private xmgMagicFaceBridge.xmgImage m_image; Después comienza el reconocimiento. xmgMagicFaceBridge.xzimgMagicFaceTrackNonRigidFaces(ref m_image,...) Cada vez que tengas un frame nuevo en el video (lo sabrás por los eventos del VideoPlayer), tendrás que preparar la imagen nueva y dársela a la biblioteca (o quizá cada 2, 3 ó N frames si quieres diezmar la tasa de entrada). En cualquier caso, cada nueva imagen a despachar debes dársela a a XZIMG usando: xmgMagicFaceBridge.PrepareImage(ref m_image, captureWidth, captureHeight, 4, m_myWebCamEngine.m_PixelsHandle.AddrOfPinnedObject()); Aquí, el primer parámetro es la imagen que has creado y es siempre la misma. El ancho y el alto son los del video y te dicen que deben coincidir con los que hayas usado al inicializar la biblioteca (xmgInitParams.m_processingWidth, and xmgInitParams.m_processingHeight). No sé qué significa el 4 y no encuentro la documentación de este método (que sería bastante útil tener). El último parámetro es el quid de la cuestión: entiendo que es la dirección de memoria de los bytes de la imagen y que (por el nombre "pinned") nos sugiere que no deben cambiar durante un rato o incluso hasta que vuelvas a llamar a PrepareImage. Esto creo que descartaría usar directamente la dirección de memoria del RenderTexture, si bien no estoy seguro... Aquí me surgen dudas también. Tendrás que probar a coger los pixels de la RenderTexture y usar la dirección de memoria aquí (que sería el RenderTexture.colorBuffer.GetNativeRenderBufferPtr() ) (https://docs.unity3d.com/ScriptReference/RenderBuffer.GetNativeRenderBufferPtr.html), pero insisto que este buffer quizá cambie concurrentemente. Así que si esto no funcionase bien, supongo que tendrías que copiar la imagen de ese buffer a otra textura y utilizar la dirección de memoria de esa copia en este parámetro. Hay un ejemplo de como copiar efectivamente los pixeles de la RenderTexture en la pregunta de StackOverflow que enlacé más arriba. De todas formas nunca he hecho esto. Ya contarás, ¡ánimo!.
  25. Me ha gustao mucho. La primera fáse me pareció muy difícil perdí mil veces. La segunda tardé un ratin en darme cuenta de la mecánica y tenía un montón de bichos encima (fueron muriendo en cuanto encontŕe a mini y lo sacrifiqué unas pocas veces). La historia y la ambientación geniales. Sonido un poco repetitivo, eso sí, faltaŕia algo de música y más variedad de efectos. Muy bien la historia, me encantó la madre, estaría bien ver a dónde iba eso a parar. Y que el gameplay cambie un poco reaprovechando la mecánica de la linterna, muy bien también.
UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...