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.

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.

Brendan Duncan
Brendan Duncan
32 min
08 Apr, 2022

Comments

Sign in or register to post your comment.

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.

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.

QnA

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

Optimización de juegos HTML5: 10 años de aprendizaje
JS GameDev Summit 2022JS GameDev Summit 2022
33 min
Optimización de juegos HTML5: 10 años de aprendizaje
Top Content
El motor de juegos de código abierto PlayCanvas está construido específicamente para el navegador, incorporando 10 años de aprendizaje sobre optimización. En esta charla, descubrirás la salsa secreta que permite a PlayCanvas generar juegos con tiempos de carga increíblemente rápidos y tasas de fotogramas sólidas como una roca.
Construyendo Experimentos Divertidos con WebXR & Babylon.js
JS GameDev Summit 2022JS GameDev Summit 2022
33 min
Construyendo Experimentos Divertidos con WebXR & Babylon.js
Top Content
Durante esta sesión, veremos un par de demostraciones de lo que puedes hacer usando WebXR, con Babylon.js. Desde experimentos de audio en VR, hasta juegos casuales en VR en una máquina de arcade hasta un uso más serio para crear nuevas formas de colaboración usando AR o VR, deberías tener una comprensión bastante buena de lo que puedes hacer hoy.
Consulta también el artículo para ver el contenido completo, incluyendo ejemplos de código: artículo. 
Creando juegos increíbles con LittleJS
JS GameDev Summit 2022JS GameDev Summit 2022
34 min
Creando juegos increíbles con LittleJS
LittleJS es un motor de juegos súper ligero que es fácil de usar y extremadamente rápido. El desarrollador hablará sobre por qué lo creó, qué hace y cómo puedes usarlo para crear tus propios juegos. La charla incluirá una demostración de cómo construir un pequeño juego desde cero con LittleJS.
Cómo no construir un videojuego
React Summit 2023React Summit 2023
32 min
Cómo no construir un videojuego
En esta charla profundizaremos en el arte de crear algo significativo y gratificante. A través de la mirada de mi propio viaje de redescubrir mi pasión por la programación y construir un videojuego desde cero con JavaScript y React, exploraremos los compromisos entre soluciones fáciles y rendimiento rápido. Obtendrás información valiosa sobre prototipado rápido, infraestructura de pruebas y una variedad de trucos de CSS que se pueden aplicar tanto al desarrollo de juegos como a tu trabajo diario.
¡Mejora el rendimiento de tus juegos WebGL Unity!
JS GameDev Summit 2023JS GameDev Summit 2023
7 min
¡Mejora el rendimiento de tus juegos WebGL Unity!
Unity, cuando se implementa en la web, enfrenta tres desafíos críticos: el tamaño de la compilación, el uso de memoria y el rendimiento general. Esta charla profundiza en técnicas avanzadas de optimización para ayudarte a abordar cada uno de estos problemas. Los asistentes obtendrán información sobre:
- Estrategias efectivas para optimizar texturas, audio y modelos.- Un análisis detallado de nuestra experimentación con ASTC en Unity, arrojando luz sobre los resultados inesperados a pesar de las afirmaciones de Unity.- Una guía completa de la herramienta de perfilado de memoria de Unity y sus implicaciones.- Una exploración de configuraciones de Unity menos conocidas que siguen siendo subutilizadas por muchos desarrolladores.
Además, presentaremos nuestra herramienta propietaria diseñada específicamente para la optimización de Unity. También mostraremos el panel de control para desarrolladores de CrazyGames, nuestra plataforma que permite a los desarrolladores monitorear y mejorar el rendimiento de sus juegos web de manera fluida.
Únete a nosotros para equiparte con las últimas estrategias y herramientas para elevar tus proyectos de juegos web de Unity.
Abrazando WebGPU y WebXR con Three.js
JSNation 2024JSNation 2024
27 min
Abrazando WebGPU y WebXR con Three.js
En el panorama en constante evolución de las tecnologías web, la introducción de WebGPU y WebXR representa un gran avance, prometiendo redefinir los límites de lo que es posible en las experiencias web en 3D. Esta charla se sumerge en el corazón de estas nuevas tecnologías, guiada por la biblioteca Three.js.
Comenzamos explorando WebGPU, una API de gráficos de próxima generación que ofrece un rendimiento y eficiencia mejorados para renderizar gráficos 3D directamente en el navegador. Demostraremos cómo Three.js se está adaptando para aprovechar todo su potencial, desbloqueando oportunidades sin precedentes para que los desarrolladores creen experiencias interactivas visualmente impresionantes.
En la transición al ámbito inmersivo, nos adentramos en WebXR, una tecnología que abre la puerta a experiencias de realidad virtual y realidad aumentada directamente desde la web. Mostraremos cómo Three.js permite a los creadores construir experiencias inmersivas.

Workshops on related topic

Crea un Juego Con PlayCanvas en 2 Horas
JSNation 2023JSNation 2023
116 min
Crea un Juego Con PlayCanvas en 2 Horas
Top Content
Featured WorkshopFree
Steven Yau
Steven Yau
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.
Cómo crear arte generativo increíble con código JavaScript simple
JS GameDev Summit 2022JS GameDev Summit 2022
165 min
Cómo crear arte generativo increíble con código JavaScript simple
Top Content
WorkshopFree
Frank Force
Frank Force
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.
PlayCanvas de principio a fin: la versión rápida
JS GameDev Summit 2022JS GameDev Summit 2022
121 min
PlayCanvas de principio a fin: la versión rápida
Top Content
WorkshopFree
João Ruschel
João Ruschel
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.
Introducción a WebXR con Babylon.js
JS GameDev Summit 2022JS GameDev Summit 2022
86 min
Introducción a WebXR con Babylon.js
Workshop
Gustavo Cordido
Gustavo Cordido
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.
Construyendo el Metaverso Interconectado y Traversable
JS GameDev Summit 2022JS GameDev Summit 2022
103 min
Construyendo el Metaverso Interconectado y Traversable
WorkshopFree
Avaer Kazmer
Avaer Kazmer
Basado en gran medida en Free Association en el Metaverso - Avaer @Exokit - M3, Avaer demostrará algunas de las formas en que los estándares abiertos permiten la travesía abierta y gratuita de usuarios y activos en todo el metaverso interconectado.