Unity puede construir juegos para ejecutarse en un navegador web utilizando herramientas como Emscripten, Web Assembly y WebGL. Proporciona integración con el navegador, utilizando las APIs del navegador para simular APIs nativas. A veces es útil interactuar con el navegador de formas que Unity no proporciona soporte de forma nativa. En esta charla, discutiré cómo Unity construye juegos para la web y cómo ampliar Unity utilizando Javascript para habilitar el soporte de características que de otra manera no se proporcionan.
This talk has been presented at JS GameDev Summit 2022, check out the latest edition of this JavaScript Conference.
FAQ
Todo el código fuente para este proyecto de WebXR se encuentra disponible en el proyecto de GitHub mencionado en el texto, y puede utilizarse para cualquier propósito.
Se puede interactuar con WebXR desde C sharp llamando a las funciones declaradas como funciones estáticas externas en C sharp, las cuales están etiquetadas para ser codificadas desde la DLL interna en Unity.
Si Unity crea el contexto WebGL sin el atributo compatible con XR, se puede interceptar la función de contexto de WebGL de Emscripten con una función personalizada que inyecte el atributo necesario para que WebXR funcione correctamente.
La memoria asignada en el lado de C sharp es visible desde JavaScript, lo que permite leer y escribir en esta memoria desde JavaScript usando las variables del montón de la inscripción.
Unity necesita interceptar cuando intenta dibujar en el búfer de cuadros del lienzo y reemplazarlo con el búfer de cuadros de WebXR, asegurándose de que Unity dibuje sobre la vista de la cámara incluida en el búfer de cuadros de WebXR.
Sí, existe una hoja de ruta pública de Unity donde se pueden agregar votos y sugerencias para la integración de WebXR y otras funcionalidades, evidenciando el interés y la planificación hacia una integración más completa de WebXR.
El soporte móvil para la exportación web en Unity ha mejorado significativamente desde la versión 2021.2, con características adicionales y compatibilidad mejorada implementadas en las versiones subsiguientes.
Unity se enfoca en más de 25 plataformas y tecnologías, incluyendo escritorio, móvil y realidad virtual. Utilizan Emscripten para compilar el motor y la lógica del juego en WebAssembly para el desarrollo web. Unity se puede ampliar con complementos para acceder a características del navegador como el modo de realidad aumentada de WebXR. El orador demuestra cómo interceptar las llamadas de Unity al navegador para modificar su comportamiento. Unity está trabajando activamente en el soporte móvil para la exportación web y en mejorar la documentación para ampliar Unity con complementos web.
We target over 25 different platforms and technologies, including desktop, mobile, and virtual reality. When building for the Web, we use Emscripten to compile the engine and game logic into WebAssembly. Unity supports different graphics patterns and can be extended with plugins to access browser features. One example is integrating WebXR's augmented reality mode into Unity, which is not supported by Unity's built-in APIs.
One of the things that we do to support this idea is target over 25 different platforms and technologies from desktop, PC, Mac, Linux, to mobile, iPhone, Android, PlayStation, Xbox, Virtual Reality, Augmented Reality and one my favorites, the Web. When we build for the Web, we build like for any other platform where we compile the engine and the game logic together into a final executable. In this case, the final executable is WebAssembly and we use different tools to achieve this.
We use this Emscripten which is a C++ compiler that can generate WebAssembly in JavaScript. All the libraries for the engine and the built-in libraries are written in C++ and all the user code and public APIs are written in .NET C Sharp. We have to compile the .NET C Sharp code into C++ in order for it to be compiled with Emscripten. So we use another tool called iotcp to do this. It takes the .NET assemblies and does some stripping and massaging of those assemblies to reduce the code size and then generates C++ code from there. The C++ code can then be compiled with Emscripten to WebAssembly.
For the graphics side of things, Unity has different graphics patterns that it supports from DirectX, Vulkan, Metal, and OpenGL. On the web, graphics are defined by WebGL, which is a variant of OpenGL. So when we build for the web we tell Unity to use the OpenGL graphics device. And when it does this, Emscripten and the compilation processes will generate WebGL calls for all the OpenGL calls that Unity are making. And for shaders, they're typically written in a shading language, a DirectX shading language in Unity, but those aren't directly supported by WebGL so we have to convert those into GLSL to be used by WebGL. To do this, we have shader compilers that will translate HLSL into GLSL.
We can extend Unity with plugins that provide new APIs to Unity written either in C++ or in this case we'll use JavaScript. With the JavaScript plugins for WebGL, we can extend Unity to access browser features that aren't available in the regular Unity API. We can call these JavaScript functions directly from C-sharp and vice versa you can call C-sharp functions from JavaScript. When you define a JavaScript plugin, you put it into the Assets Plugins folder for WebGL and there's two different types of files from the JavaScript function. The main type of file is a JSLib file. This is where your public APIs from JavaScript will be and define the functions that will be callable from C-sharp. A JSPri file is just arbitrary JavaScript that you can include with your plugin. This will get compiled before the JSLib files so that it can provide JavaScript objects and functions that can be used and shared between your JSLib files. This is just a way to keep your projects clean so that your JSLib files can be your public APIs and you put all the rest of your code in JSPri. There's no requirement to do this. You could just use a single JSLib file. I like to keep things separate. The example of plugin I'll be talking about today is integrating WebXR's augmented reality mode into Unity. Unity currently does not support WebXR with its built-in APIs, but we can extend Unity using plugins to do this. This is not an official plugin.
2. Implementando WebXR y Compartiendo Datos
Short description:
Esta es una implementación mínima de WebXR, que demuestra cómo usarlo. El código fuente está disponible en GitHub. El archivo JSLib declara la API pública para el complemento, permitiendo llamadas directas desde C sharp. La función merge into expone las funciones declaradas a C++ o C sharp. El archivo JSPRE contiene los objetos principales y los métodos para interactuar con WebXR. También se puede llamar a C sharp desde JavaScript utilizando tipos de delegado y funciones de devolución de llamada. Los datos se pueden compartir entre C sharp y JavaScript asignando memoria en el montón de scripting final.
Esto es solo para fines de demostración, y es una implementación muy mínima de WebXR. No estoy implementando todas las características divertidas de WebXR. Solo te estoy mostrando cómo hacer esto. Todo el código fuente para este proyecto se puede encontrar en el proyecto de GitHub aquí, y puedes usarlo para cualquier propósito. El archivo JSLib es donde declaramos la API pública para nuestro complemento. Y aquí proporcionaremos funciones que podemos llamar desde C sharp para inicializar WebXR y obtener su información en su estado actual. Estas funciones se pueden llamar directamente desde C sharp, y esta es la API pública que estamos proporcionando. Y la función merge into aquí es parte de el script, y lo que hace es tomar todas las funciones que estamos declarando en el sujeto y exponerlas a C++ o C sharp. Para llamar a JavaScript desde C sharp, declaramos las funciones como funciones estáticas externas en C sharp, y también las etiquetamos para que se codifiquen desde la DLL interna en Unity. Lo que esto hace es decirle a C sharp que estas funciones no están definidas en el lugar, sino que provienen de una fuente externa, y debido a que WebGL no proporciona soporte para DLL externas, todo se empaqueta junto y el nombre de la DLL interna define que provienen de la DLL incorporada.
Aquí también implemento versiones MTEW de las funciones para plataformas no-WebGL, porque las plataformas no-WebGL no admiten JavaScript. Queremos llamar a versiones ficticias de estas funciones para mantener contento a C sharp y evitar que el editor se queje de que no tienes implementaciones para estas funciones. El archivo JSPRE es donde pongo la mayor parte del código para mantener el archivo JSO simple, y aquí es donde defino todos los objetos principales y métodos para interactuar con WebXR, y aquí puedes poner todas las funciones que se pueden llamar desde tu JSO y gestionar el estado de tu complemento. Nuevamente, no es obligatorio usar un archivo JSPRE. Lo encuentro conveniente. A veces quieres llamar a C sharp desde JavaScript. En algunos casos, tienes una función asíncrona en JavaScript que se llamará en algún momento posterior y quieres llamar a una función de C sharp cuando ese proceso asíncrono haya terminado. Puedes hacer esto declarando un tipo de delegado en C sharp que luego se puede activar desde JavaScript. Puede pasar ese puntero de función de ese tipo de delegado a la función de JavaScript, que puede retenerlo como un puntero, y luego puede llamar a esa función de C sharp cuando haya terminado. Y luego definimos la función de devolución de llamada en C sharp como una función estática. JavaScript no tiene noción de objetos de C sharp, por lo que lo declaramos como una función estática, y desde allí puedes usar variables globales o acceso a singleton para cualquier estado de C sharp que desees. Y desde el lado de JavaScript, podemos usar la función dyne call de la inscripción para llamar la devolución de llamada de C sharp. Esto también puede ser una devolución de llamada de C++. Por lo tanto, el argumento vi para dyne call define el tipo de retorno como void y toma un solo argumento entero y esto puede definir la declaración de función que tienes. Y la devolución de llamada de cambio de estado es la función de puntero que pasé desde C sharp, y estos son los argumentos que estoy pasando a la función de devolución de llamada de C sharp, que es un estado entero. También puedes compartir data entre C sharp y JavaScript. Si asignamos memoria en el lado de C sharp, se asigna en el montón de scripting final y ese montón de scripting final es visible desde JavaScript. Podemos leer y escribir en ese montón de scripting desde JavaScript. Aquí estoy asignando 16 flotantes que se utilizan para almacenar la matriz de vista de WebXR para que pueda actualizar la matriz de vista de la cámara en Unity. Puedo pasar ese data a JavaScript como un simple puntero de función data y luego ahora JavaScript tendrá acceso a ese data.
3. Interceptando Interacciones Unity-Navegador
Short description:
Puedo interceptar las llamadas de Unity al navegador para cambiar el comportamiento de cómo Unity interactúa con el navegador. En algunos casos, la forma en que Unity interactúa con el navegador no funciona con lo que queremos hacer en nuestro complemento. Por ejemplo, WebXR requiere que se agregue el atributo compatible con XR al contexto webGL. Este es un ejemplo de uso de API privadas y de trabajar alrededor de las cosas que Unity hace mediante la interceptación de llamadas de función entre Unity y el navegador utilizando la naturaleza dinámica de JavaScript.
Y luego, desde el lado de JavaScript, puedo escribir en esa función en el puntero de data usando las variables del montón de la inscripción. En este caso, el montón 32 es una vista de float 32 del montón data.
Ahora estoy copiando la matriz de vista de WebXR en el puntero de data que le paso. Divido el índice del puntero entre dos porque el montón está alineado por cuatro y, por lo tanto, el índice del montón es la dirección del puntero dividida por cuatro.
Puedo interceptar las llamadas de Unity al navegador para cambiar el comportamiento de cómo Unity interactúa con el navegador. En algunos casos, la forma en que Unity interactúa con el navegador no funciona con lo que queremos hacer en nuestro complemento. Por ejemplo, WebXR requiere que se agregue el atributo compatible con XR al contexto webGL. Cuando Unity crea el contexto webGL, no tiene este atributo porque no conoce WebXR. Entonces, lo que podemos hacer es reemplazar la función de contexto webGL de Emscripten con nuestra propia función personalizada. Ahora, cuando Unity llama al contexto webGL, está llamando a nuestra función personalizada en lugar de la incorporada. Luego podemos inyectar el atributo compatible con XR que webXR desea en los atributos para ese contexto webGL y luego llamar a la función original para crear el contexto ahora con ese atributo personalizado agregado. Este es un ejemplo de uso de API privadas y de trabajar alrededor de las cosas que Unity hace mediante la interceptación de llamadas de función entre Unity y el navegador utilizando la naturaleza dinámica de JavaScript. Debido a que estamos utilizando API privadas aquí, no hay garantía de que esto funcione en futuras versiones de Unity. Pero a veces tienes que hacer cosas como esta para trabajar alrededor de limitaciones.
4. Interceptando el Renderizado del Canvas de Unity
Short description:
Interceptamos las llamadas de Unity al búfer de cuadros y a la función de borrado para que funcione con WebXR. Al reemplazar el búfer de cuadros nulo con el búfer de cuadros de WebXR, Unity puede renderizar sobre la vista de la cámara. Sobrescribimos la función requestAnimationFrame de Unity para utilizar la versión de WebXR. Esto permite que Unity actualice su vista de cámara con datos compartidos de WebXR.
Otra función que queremos interceptar para que WebXR funcione con Unity es que WebXR tiene su propio búfer de cuadros en el que desea que se renderice. Esto tiene, en el caso de la realidad aumentada, la alimentación de la cámara ya incluida, y desea que se renderice encima de eso. Unity está tratando de renderizar sobre el lienzo que está en tu pantalla, y no sabe nada acerca de el búfer de cuadros de WebXR. Entonces, lo que queremos hacer es interceptar la llamada que Unity hace cuando encuentra el búfer de cuadros actual, y detectar cuando Unity intenta dibujar en el búfer de cuadros del lienzo. Podemos saber eso porque el búfer de cuadros nulo es lo que WebGL usa para dibujar en el lienzo, y cuando Unity hace eso, podemos interceptar la función bind frame buffer, detectar que está intentando enlazar el búfer de cuadros nulo en el lienzo, y reemplazar el búfer de cuadros nulo con el búfer de cuadros de WebXR, y luego llamar a la función original bind frame buffer. Ahora, cuando Unity enlaza el lienzo, interceptamos y enlazamos el búfer de cuadros de WebXR, y Unity luego dibujará en el búfer de cuadros de WebXR. Otra función que queremos reemplazar es la función clear de WebGL porque Unity intentará borrar el búfer de cuadros del lienzo cuando dibuje en él. No queremos que se borre el búfer de cuadros de WebXR porque ya tiene la vista de la cámara en él. Queremos que Unity dibuje encima de eso, así que podemos interceptar la función clear de WebGL. Si sabemos que el búfer posterior, el lienzo, está actualmente enlazado, o en este caso, el contexto de WebXR, simplemente omitimos la función clear. De lo contrario, la llamamos normalmente. Y ahora, cuando se enlaza el búfer de cuadros de WebXR, Unity intenta borrarlo cuando se mezcla, el borrado se bloqueará y Unity simplemente dibujará encima de lo que ya está allí, que es la vista de la cámara. Otra función que queremos interceptar es requestAnimationFrame. Unity utiliza esto para controlar la velocidad de fotogramas, y esto es lo que WebGL utiliza para su renderizado, pero WebXR tiene su propia versión de requestAnimationFrame en la que desea que se renderice. Entonces, queremos usar eso en su lugar. Pero como Unity está utilizando la función requestAnimation incorporada, podemos sobrescribir la función requestAnimation incorporada con la nuestra, y dirigirla a la versión de WebXR de la función. Ahora, cuando Unity llama a requestAnimationFunction, está llamando a nuestra función, que luego llama a WebXR requestAnimationFrame, que llamará al callback, y luego le dirá a Unity que haga su renderizado desde allí. Ahora, ese callback tiene toda la información de WebXR en él, y podemos usar esa información para actualizar la vista de la cámara de Unity con esos datos compartidos y luego llamar al callback para que Unity haga su renderizado.
Entonces, si juntamos todo esto, podemos ver a Unity renderizando en la página web. Comenzamos con el contexto de WebXR, y Unity ahora está renderizando en la vista de cuadros de WebXR. No borra el búfer posterior, por lo que está renderizando encima de la vista de la cámara, y todo se integra. La matriz de vista de WebXR se pasa a Unity para que pueda actualizar su vista de cámara, y todo se integra. Ahora, como dije, esta es una implementación muy mínima de WebXR. Para una implementación más completa, otros desarrolladores han hecho un gran trabajo con eso. DeepAnthro tiene un excelente paquete de WebXR disponible en su GitHub que puedes usar para renderizar con modos de realidad virtual y realidad aumentada de WebXR, con muchas más funciones. Lo recomiendo encarecidamente. Y eso es todo lo que tengo para compartir hoy. No dudes en hacer preguntas si tienes alguna. Estoy encantado de responder, y muchas gracias por tomarte el tiempo.
5. Resultados de la Encuesta y Compresión de Basis
Short description:
Preguntamos a la audiencia qué tecnología web les gustaría que Unity admitiera, y la mayoría abrumadora eligió web GPU. Agregar soporte para la compresión de basis sería beneficioso para la web, ya que reduce el tamaño de descarga, el tiempo de carga y el uso de memoria. Unity ya admite formatos de compresión de texturas móviles, pero el uso de basis simplificaría el proceso al permitir a los desarrolladores utilizar un formato para múltiples plataformas. Al publicar sin basis, los desarrolladores pueden crear diferentes paquetes de recursos para diferentes dispositivos y elegir el paquete adecuado en tiempo de ejecución.
Genial. Echemos un vistazo a los resultados de la pregunta de la encuesta que hicimos antes de la charla. Preguntamos qué tecnología web les gustaría que Unity admitiera. Parece que web GPU es la mayoría abrumadora. Sí, me sorprende un poco, pero no realmente, porque es lo último en tendencia. De hecho, me sorprendió que no hubiera más solicitudes para basis, porque sé que eso ayuda mucho, especialmente en la web. Y sé que algunos otros ponentes, ya sea hoy o ayer, lo mencionaron. Porque ayuda tanto en términos de tamaño de descarga como de tiempo de carga, pero también en términos de uso de memoria. Y eso es importante para muchos dispositivos móviles, ¿verdad? Sí, estoy de acuerdo. Agregamos soporte para dispositivos móviles. Hemos tenido compresión de texturas para escritorio desde hace mucho tiempo. Y luego, en 2021, agregamos soporte para formatos de compresión de texturas móviles. Pero tienes que tomar una design decisión y utilizar diferentes paquetes de recursos para el formato que deseas. Y si tuvieras basis, eso pondría menos carga técnica en el desarrollador y te permitiría utilizar un solo formato para otros lugares. Sí. Y esto es algo con lo que no estoy familiarizado personalmente porque la mayoría de las cosas que publico están en la web. Pero me pregunto, si estuvieras publicando sin basis en escritorio o en otros lugares, ¿lo harías... porque tienes todos estos diferentes formatos de texturas comprimidas en diferentes GPUs, etc. ¿Simplemente tienes estos diferentes paquetes y los envías dependiendo de qué dispositivo tenga soporte? Sí, tienes diferentes paquetes y luego, en runtime, puedes elegir, dependiendo de tu entorno, el paquete móvil o el paquete de escritorio. Puedes tener paquetes para activos de alta fidelidad y activos de baja calidad. Puedes tomar esas decisiones. Tiene cierta carga técnica o lo que sea hacer esas elecciones en runtime, pero las herramientas están ahí para hacerlo. Tiene sentido. Genial. Creo que podemos echar un vistazo a algunas de las preguntas que la audiencia ha estado enviando aquí. La primera pregunta que veo aquí, Rick pregunta, ¿hay una hoja de ruta para admitir WebXR nativamente en el futuro? Tenemos la hoja de ruta. Puse el enlace en la pregunta de la encuesta, donde puedes agregar votos a cosas o agregar tus propias sugerencias. Y definitivamente es algo de lo que todos somos conscientes y emocionados al respecto. Aunque ha estado presente durante mucho tiempo, todavía es importante.
6. WebKit's Engagement and Unity's Public Roadmap
Short description:
WebKit está activamente comprometido en implementar esta función, aunque aún no está disponible. Aunque no ha sido una prioridad principal debido a recursos limitados, somos conscientes de sus beneficios y estamos emocionados de incluirlo. Unity tiene una hoja de ruta pública donde las personas pueden votar por características, aunque su descubribilidad ha sido un problema. Compartir la hoja de ruta en Discord y en redes sociales ayudará a priorizar las características según la opinión de la comunidad.
la tecnología que no es compatible en todas partes. WebKit está comprometido en implementarla ahora y la traerá pero aún no está disponible y otros lugares como ese. Por lo tanto, no ha sido una prioridad principal para el desarrollo porque solo tenemos a tantas personas trabajando en cosas y muchas más cosas en las que trabajar de las que tenemos tiempo, pero definitivamente es algo que sabemos y estamos emocionados y realmente queremos incluirlo porque tiene muchos beneficios para muchos casos de uso diferentes. Es un honor trabajar contigo. Y creo que esta es la primera vez que supe que Unity tenía una hoja de ruta pública donde las personas pueden votar. ¿Cuánto tiempo llevas con eso? No estoy completamente seguro. Bueno, pero no es algo nuevo como este mes o algo así. Ha estado allí por un poco más de tiempo. Sí, ha estado disponible durante un tiempo. Como muchas cosas, la descubribilidad siempre es un problema, ponerla haciéndola no muy obvia de dónde encontrarla. Las cosas son... Sí, definitivamente deberíamos compartir eso en Discord y tal vez tuitear al respecto también, para que otras personas, todos puedan asegurarse de verlo. Genial. Creo que eso es realmente importante para la priorización y cosas así. Sí, absolutamente. Es genial que la community pueda expresarse de esta manera tan directa.
QnA
Soporte móvil y llamadas internas de Emscripten
Short description:
Comenzamos a trabajar en el soporte móvil para la exportación web en la versión 2021.2 de Unity. El desarrollo web móvil es desafiante debido a los sistemas operativos en constante cambio, pero tomamos en serio los problemas relacionados con los dispositivos móviles. Trabajamos en estrecha colaboración con Apple, Google y desarrolladores web para asegurarnos de que la web sea una excelente plataforma para todos. La documentación de las llamadas internas de Emscripten necesita mejoras y estamos trabajando en hacer de la web una plataforma de primer nivel con una mejor documentación y herramientas. La función de envío de mensajes de la instancia de Unity también se encuentra en el manual de Unity y se pueden discutir casos de uso específicos en el canal de Discord.
Así que creo que eso es genial. Tenemos otra pregunta aquí de Daniel. ¿Cuál es el progreso actual del soporte móvil para la exportación web? Comenzamos a trabajar en el desarrollo web móvil en serio en la versión 2021.2 de Unity, y teníamos un banner en la página que decía que el móvil no era compatible, en 2022 eliminamos ese banner y creo que en 2023 habremos completado todas las piezas, en 2022 agregué el soporte para el teclado móvil. Y hay muchas cosas diferentes que se deben tener en cuenta en el desarrollo web móvil, cosas con las que el escritorio no tiene que lidiar , así que siempre hemos, ya sabes, cualquier problema relacionado con dispositivos móviles que surgiera, siempre lo tomamos muy en serio y seguimos haciéndolo, y ahora le damos más énfasis y siempre hemos tenido esta noción de que el móvil no era compatible porque faltaban muchas cosas, pero siempre se ha tomado en serio y ahora tenemos soporte de compresión de texturas para móviles y todas estas otras características que se están implementando y que tendrán la lista de navegadores compatibles para móviles en la próxima versión. Eso es bastante genial. Suena muy optimista, creo. Sí. Desarrollar para la web ciertamente, estoy muy emocionado, es definitivamente un desafío porque estás trabajando en un sistema operativo en constante cambio debajo de ti. Así que tuvimos muchos problemas con iOS 15.4 que se lanzó recientemente. Rompieron todo lo relacionado con la web, relacionado con webGL y relacionado con WebAssembly para nosotros. Trabajamos muy de cerca con, ya sabes, Apple y Google y todos los desarrolladores web para asegurarnos de que no solo para nosotros, la web sea una gran plataforma, sino para todos, porque, ya sabes, hacer que la web funcione para nosotros, ya sabes, y hacer que la web funcione para todos los demás, ya sabes, es igualmente beneficioso. Eso es increíble. Y encuentro esto realmente inspirador, porque siento que, como mencionaste, estás trabajando en esta arena cambiante, pero también parte de ello es que la, como, la plataforma está cambiando, pero también tu, el motor de Unity está evolucionando y cambiando tan rápidamente. Y así, parece insuperable lograr que algo así, ya sabes, funcione bien en la web, pero creo que en el proceso de hacerlo, no sé, todos salen beneficiados. Como, es como dicen, la marea que levanta todos los barcos. Así es como veo esto. Sí, estoy totalmente de acuerdo con eso. Es increíble. Tenemos otra pregunta aquí. Dice, mencionaste algunas llamadas internas de Emscripten, como DIN call, una llamada DIN en el montón. ¿Dónde podemos ver la equivalencia de las variables como V, I, y los otros tipos básicos en esas llamadas? Y luego encontrar más información sobre esas llamadas internas.
Mejorando la documentación para los complementos web
Short description:
Necesitamos mejorar nuestra documentación para extender Unity con complementos web. Actualmente, la documentación está sesgada hacia otras plataformas, pero estamos haciendo esfuerzos para cambiar y priorizar la web como una plataforma de primer nivel.
Estas son cosas que provienen de Emscripten. Creo que debemos hacer un mejor trabajo documentando desde nuestra perspectiva. Puedes encontrar esta información en la documentación de Emscripten, pero todo, ya sabes, es como un problema de descubrimiento, ¿cómo encuentras la información? Entonces definitivamente es algo en lo que debemos trabajar en cuanto a la documentación, ya sabes, para extender Unity, ya sabes, con arquitecturas de complementos y cosas así desde la perspectiva web, porque tenemos mucha documentación, pero la web siempre ha sido una plataforma de nicho, y por lo tanto la documentación se ha sesgado hacia otras plataformas, pero creo que, ya sabes, se está haciendo el cambio y hemos estado presionando mucho para hacer de la web una plataforma de primer nivel y para que esa documentación y las herramientas sean adecuadas.
Unity Instance Send Message and Project Tiny
Short description:
La función de enviar mensajes de instancia de Unity se puede utilizar en varios casos, y se puede continuar la discusión en Discord. Puedes integrar diferentes API web en Unity utilizando un complemento de JavaScript, como transporte web y RTC web. Al publicar con Unity WebGL, tienes la flexibilidad de alojarlo en tu propio servidor o utilizar servicios como play.unity.com. Unity Project Tiny es un derivado de la tecnología Data Oriented Technology Stack (DOTS) que permite el desarrollo modular de juegos.
mucho mejor para la plataforma web. Eso es increíble. Nuestra próxima pregunta es de George, la función de enviar mensajes de instancia de Unity también está en el manual de Unity, ¿en qué casos recomendarías usarla? Una pregunta muy específica que está desviando mi atención. También podemos volver a ella ahora mismo para que pueda responder en un par de segundos.
Sí, tal vez en Discord puedas publicar eso.
Sí, exactamente. Y en un momento en el que pueda pensar con más claridad. Claro, no te preocupes. ¿Qué hay de... esta es una pregunta para mí. ¿Qué otras funcionalidades web ejemplos crees que se podrían integrar en Unity con un complemento de JavaScript? Bueno, hay muchas API web diferentes que tienen diferentes niveles de soporte para los navegadores, como transporte web, RTC web y cosas así que que no tenemos API directas en la capa de C Sharp de Unity, pero definitivamente podrías hacer esto de manera similar para exponerlo a Unity y agregarlo a tu juego. Entonces, podrías hacer RTC web. Uno de nuestros desarrolladores hizo un prototipo utilizando transporte web que fue bastante exitoso. Entonces, hay mucho, cualquier cosa que puedas hacer con una API web, y, ya sabes, realmente abre eso. Tiene mucho sentido. Y me preguntaba, si estuviera haciendo, si estuviera publicando algo con Unity WebGL, ¿dónde crees que la mayoría de las personas alojarían sus esquemas de exportación de Unity WebGL o contenido interactivo? Entonces, quiero decir, como cualquier proyecto web, puedes alojarlo en tu propio servidor o Unity tiene, ya sabes, servicios como play.unity.com que pueden alojar cosas para ti. Y, ya sabes, cuando alojas tu, ya sabes, lo haces en tu propio servidor, puedes ser mucho más especializado para tu juego y utilizar, ya sabes, compresión Brotli o gzip, y configurar tu servidor para que sea correcto para eso. Pero sí, no hay limitaciones en cómo puedes alojarlo. Nosotros, cuando construyes tu juego, puedes especificar la plantilla HTML y el andamiaje que lo rodea. Y así puedes personalizarlo para lo que sea que vaya a ser tu objetivo y cualesquiera necesidades técnicas que tengas. Eso es genial. Entonces parece que podrías publicarlo en cualquier lugar, podrías publicar cualquier juego HTML5, juego JavaScript, como Newgrounds o Itch o realmente cualquiera de esos juegos, cualquier plataforma así. Sí, exactamente. Y muchas plataformas y servidores diferentes alojan juegos de Unity, así que realmente no hay una limitación técnica para eso. Muy bien. En algunos casos, requiere más conocimientos técnicos para configurar las cosas correctamente, pero se trata de mejorar las herramientas y la documentación para simplificar esas cosas. Y todas esas son cosas en las que estamos trabajando activamente. Increíble. Y ¿qué hay de, recuerdo vagamente un proyecto llamado Unity Project Tiny. ¿Puedes hablar un poco sobre eso y qué es? Claro. Project Tiny, tenemos una tecnología llamada DOTS, Data Oriented Technology Stack, y Project Tiny fue un derivado de eso, que te permite construir juegos de manera mucho más modular.
Unity's Inversiones y Desarrollo de WebGPU
Short description:
Unity está invirtiendo en la creación de juegos pequeños seleccionando piezas específicas del motor, mejorando el tamaño del juego, el tamaño del paquete y los tiempos de carga. El desarrollo de WebGPU está en marcha, sin una línea de tiempo pública aún. El orador está activamente involucrado en el Comité de Estándares para asegurar que WebGPU cumpla con las necesidades de Unity y beneficie a otros. Se están abordando los desafíos con los proyectos de Unity que utilizan WebGPU y se está impulsando mejoras en la compilación de shaders. La participación de personas como el orador en el Comité de Estándares asegura que la plataforma web evolucione en beneficio de todos.
Y así no tienes el motor monolítico gigante, sino que seleccionas las piezas que deseas, para que puedas crear juegos muy pequeños. Y eso se suspendió temporalmente mientras los desarrolladores se centran en el lado de renderizado de la tecnología DOTS. Pero es algo en lo que invertiremos más en un futuro cercano. Y eso mejorará drásticamente cosas como el tamaño del juego, el tamaño del paquete, los tiempos de carga y todas estas otras cosas.
¿Qué hay de una pregunta final? ¿Hay alguna característica de Unity en la que estés trabajando o que te emocione y puedas compartir con nosotros? Bueno, lo que todos están interesados, aparentemente, es WebGPU. Y eso es algo en lo que estoy trabajando activamente y tenemos una implementación de eso. No se hará pública. No hay una línea de tiempo para eso, pero está en proceso.
Eso es increíble. ¿Has encontrado dificultades? Porque sé que la especificación de WebGPU ha estado cambiando en los últimos meses más o menos. ¿Ha sido un factor? Es como desarrollar sobre arena movediza. Pero he estado muy involucrado con el Comité de Estándares para ayudar a asegurar que WebGPU tenga lo que Unity necesita y también pueda beneficiar a otras personas y tratar de asegurarme de que la especificación tenga las API que necesitamos y que otras personas necesiten también. Eso es increíble. Y también, activamente, el tamaño de los proyectos de Unity que se están construyendo con WebGPU es mucho más grande que un pequeño concurso de JavaScript codificado a mano. Así que estamos trabajando en cosas como la compilación de shaders y cosas así. Y encontrando lugares donde todavía necesita trabajo y ayudando a descubrir errores y cosas así. Sí, me encanta eso. Eso me da mucha esperanza para el futuro de la web. Creo que tener personas como tú involucradas en el Comité de Estándares asegura que, una vez más, esta marea creciente eleva a todos los barcos, la plataforma evoluciona en beneficio de todos. Esto fue realmente genial. Muchas gracias por estar aquí, Brandon, y gracias por responder todas nuestras preguntas. Muchas gracias a ti también.
PlayCanvas is an open-source game engine used by game developers worldwide. Optimization is crucial for HTML5 games, focusing on load times and frame rate. Texture and mesh optimization can significantly reduce download sizes. GLTF and GLB formats offer smaller file sizes and faster parsing times. Compressing game resources and using efficient file formats can improve load times. Framerate optimization and resolution scaling are important for better performance. Managing draw calls and using batching techniques can optimize performance. Browser DevTools, such as Chrome and Firefox, are useful for debugging and profiling. Detecting device performance and optimizing based on specific devices can improve game performance. Apple is making progress with WebGPU implementation. HTML5 games can be shipped to the App Store using Cordova.
This Talk explores the use of Babylon.js and WebXR to create immersive VR and AR experiences on the web. It showcases various demos, including transforming a 2D game into a 3D and VR experience, VR music composition, AR demos, and exploring a virtual museum. The speaker emphasizes the potential of web development in the metaverse and mentions the use of WebXR in Microsoft products. The limitations of WebXR on Safari iOS are discussed, along with the simplicity and features of Babylon.js. Contact information is provided for further inquiries.
Little.js is a super lightweight and fast JavaScript game engine that has everything included to start making games right away. It has a tiny footprint and no dependencies, making it perfect for size-coding competitions like JS13K. Little.js is built with an object-oriented structure and comes with several classes. It provides a fast rendering system, a comprehensive audio system, and various starter projects for different game types. Little.js is designed to be simple and easy to understand, allowing you to look at and modify the code.
The Talk discusses ways to boost the performance of WebGL Unity games, including issues with bundle size, memory usage, and runtime performance. It suggests using Brotli for compression and non-exception support for better performance. Choosing the appropriate texture compression format and experimenting with separate builds can also help. The Talk also covers optimizing textures, models, audio, and assets by reducing build size, using compression, disabling unnecessary models, and optimizing audio quality. Unity's optimization tools and profilers are recommended for analyzing performance and memory issues.
The Talk showcases the development of a video game called Athena Crisis using web technologies like JavaScript, React, and CSS. The game is built from scratch and includes features like multiple game states, AI opponents, and map editing. It demonstrates the benefits of using CSS for game development, such as instant load times and smooth transitions. The Talk also discusses optimizing performance, supporting dark mode, and publishing the game to other platforms.
The 3JS project has evolved into a community-driven effort with numerous contributors over the past 14 years. It started with 3D engine work in Flash and transitioned to using SVGs for rendering in HTML5 before adopting WebGL. The project showcases various projects and frameworks, including a no-code tool powered by 3.js. The team is working on a new render using WebGPU and developing a new shader language called TSL. The hope is that WebGPU will eventually replace WebGL, offering better control and performance.
En esta masterclass, construiremos un juego utilizando el motor WebGL de PlayCanvas desde el principio hasta el final. Desde el desarrollo hasta la publicación, cubriremos las características más cruciales como la escritura de scripts, la creación de UI y mucho más. Tabla de contenido:- Introducción- Introducción a PlayCanvas- Lo que vamos a construir- Agregando un modelo de personaje y animación- Haciendo que el personaje se mueva con scripts- 'Falsa' carrera- Agregando obstáculos- Detectando colisiones- Agregando un contador de puntuación- Fin del juego y reinicio- ¡Resumen!- Preguntas Nivel de la masterclassSe recomienda familiaridad con los motores de juegos y los aspectos del desarrollo de juegos, pero no es obligatorio.
En lugar de dibujar manualmente cada imagen como en el arte tradicional, los artistas generativos escriben programas que son capaces de producir una variedad de resultados. En esta masterclass aprenderás cómo crear arte generativo increíble usando solo un navegador web y un editor de texto. Comenzando con conceptos básicos y avanzando hacia la teoría avanzada, cubriremos todo lo que necesitas saber.
En esta masterclass, construiremos un juego completo utilizando el motor PlayCanvas mientras aprendemos las mejores prácticas para la gestión de proyectos. Desde el desarrollo hasta la publicación, cubriremos las características más cruciales como la gestión de activos, scripting, audio, depuración, y mucho más.
En este masterclass, te presentaremos los conceptos básicos de la construcción de experiencias de Realidad Mixta con WebXR y Babylon.js. Aprenderás lo siguiente:- Cómo agregar objetos de malla 3D y botones a una escena- Cómo utilizar texturas procedurales- Cómo agregar acciones a objetos- Cómo aprovechar la experiencia predeterminada de Realidad Cruzada (XR)- Cómo agregar física a una escena Para el primer proyecto en este masterclass, crearás una experiencia interactiva de Realidad Mixta que mostrará estadísticas de jugadores de baloncesto a fanáticos y entrenadores. Para el segundo proyecto en este masterclass, crearás una aplicación WebXR activada por voz utilizando Babylon.js y Azure Speech-to-Text. Luego, desplegarás la aplicación web utilizando el alojamiento de sitios web estáticos proporcionado por Azure Blob Storage.
Sumérgete en el cautivador mundo del desarrollo de microjuegos con Frank Force en este interactivo masterclass de codificación en vivo. Diseñado tanto para desarrolladores experimentados como para curiosos principiantes, esta sesión explora los desafíos únicos y las alegrías de crear juegos y demos con restricciones extremas de tamaño.
Walt te mostrará 2 formas de crear rápidamente un servidor de juegos en Vultr: una con nuestra instalación de Minecraft con un solo clic en el Marketplace de Vultr, y otra a través de la Terminal después de implementar un servidor de Vultr.
Comments