Ampliando Unity WebGL con Javascript

Rate this content
Bookmark

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.

32 min
08 Apr, 2022

Video Summary and Transcription

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.

Available in English

1. Building for Web and Extending Unity

Short description:

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.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

JS GameDev Summit 2022JS GameDev Summit 2022
33 min
Building Fun Experiments with WebXR & Babylon.js
Top Content
During this session, we’ll see a couple of demos of what you can do using WebXR, with Babylon.js. From VR audio experiments, to casual gaming in VR on an arcade machine up to more serious usage to create new ways of collaboration using either AR or VR, you should have a pretty good understanding of what you can do today.
Check the article as well to see the full content including code samples: article. 
React Summit 2023React Summit 2023
32 min
How Not to Build a Video Game
In this talk we'll delve into the art of creating something meaningful and fulfilling. Through the lens of my own journey of rediscovering my passion for coding and building a video game from the ground up with JavaScript and React, we will explore the trade-offs between easy solutions and fast performance. You will gain valuable insights into rapid prototyping, test infrastructure, and a range of CSS tricks that can be applied to both game development and your day-to-day work.

Workshops on related topic

JSNation 2023JSNation 2023
116 min
Make a Game With PlayCanvas in 2 Hours
Featured WorkshopFree
In this workshop, we’ll build a game using the PlayCanvas WebGL engine from start to finish. From development to publishing, we’ll cover the most crucial features such as scripting, UI creation and much more.
Table of the content:- Introduction- Intro to PlayCanvas- What we will be building- Adding a character model and animation- Making the character move with scripts- 'Fake' running- Adding obstacles- Detecting collisions- Adding a score counter- Game over and restarting- Wrap up!- Questions
Workshop levelFamiliarity with game engines and game development aspects is recommended, but not required.
JS GameDev Summit 2022JS GameDev Summit 2022
165 min
How to make amazing generative art with simple JavaScript code
Top Content
WorkshopFree
Instead of manually drawing each image like traditional art, generative artists write programs that are capable of producing a variety of results. In this workshop you will learn how to create incredible generative art using only a web browser and text editor. Starting with basic concepts and building towards advanced theory, we will cover everything you need to know.
JS GameDev Summit 2022JS GameDev Summit 2022
121 min
PlayCanvas End-to-End : the quick version
Top Content
WorkshopFree
In this workshop, we’ll build a complete game using the PlayCanvas engine while learning the best practices for project management. From development to publishing, we’ll cover the most crucial features such as asset management, scripting, audio, debugging, and much more.
JS GameDev Summit 2022JS GameDev Summit 2022
86 min
Introduction to WebXR with Babylon.js
Workshop
In this workshop, we'll introduce you to the core concepts of building Mixed Reality experiences with WebXR and Balon.js.
You'll learn the following:- How to add 3D mesh objects and buttons to a scene- How to use procedural textures- How to add actions to objects- How to take advantage of the default Cross Reality (XR) experience- How to add physics to a scene
For the first project in this workshop, you'll create an interactive Mixed Reality experience that'll display basketball player stats to fans and coaches. For the second project in this workshop, you'll create a voice activated WebXR app using Balon.js and Azure Speech-to-Text. You'll then deploy the web app using Static Website Hosting provided Azure Blob Storage.