πŸš€ Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more β†’
Socket
DemoInstallSign in
Socket

unity-webgl

Package Overview
Dependencies
Maintainers
1
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

unity-webgl

Unity-WebGL provides an easy solution for embedding Unity WebGL builds in your web projects, with two-way communication between your webApp and Unity application with advanced API's.

4.4.2
latest
Source
npm
Version published
Weekly downloads
969
16.33%
Maintainers
1
Weekly downloads
Β 
Created
Source

unity-webgl

version codecov release downloads size license

[ English | δΈ­ζ–‡ ]

unity-webgl provides an easy solution for embedding Unity WebGL builds in your web applications, with two-way communication and interaction between your webApp and Unity application with advanced API's.

🚨 Reminder

v4.x has been updated significantly and the API is not compatible with v3.x and earlier versions. For upgrades, please refer to Changelogs

Based on react-unity-webgl

Features

  • πŸ“¦ Easy integration, framework-agnostic
  • πŸ“© Bidirectional communication between WebApp and Unity
  • ⏰ Comprehensive event handling mechanism
  • 🧲 Built-in Vue components (vue2/3)

Installation

npm

npm install unity-webgl

Browser

<script src="https://cdn.jsdelivr.net/npm/unity-webgl/dist/index.min.js"></script>

Quick Start

[!IMPORTANT]

Communication and interaction with the web application are only possible after the Unity instance is successfully rendered (when the mounted event is triggered).
Recommended to include a loading progress bar when opening the page.

import UnityWebgl from 'unity-webgl'

const unityContext = new UnityWebgl('#canvas', {
	loaderUrl: 'path/to/unity.loader.js',
	dataUrl: 'path/to/unity.data',
	frameworkUrl: 'path/to/unity.framework.js',
	codeUrl: 'path/to/unity.code',
})

unityContext
	.on('progress', (progress) => console.log('Loaded: ', progress))
	.on('mounted', () => {
		// ⚠️ UnityInstance rendered, ready for communication
		unityContext.sendMessage('GameObject', 'ReceiveRole', 'Tanya')
	})

// For Unity to call
unityContext.addUnityListener('gameStart', (msg) => {
	console.log('from Unity : ', msg)
})
// window.dispatchUnityEvent('gameStart', '{score: 0}')
Vue Demo
<script setup>
	import UnityWebgl from 'unity-webgl'
	import VueUnity from 'unity-webgl/vue'

	const unityContext = new UnityWebgl({
		loaderUrl: 'path/to/unity.loader.js',
		dataUrl: 'path/to/unity.data',
		frameworkUrl: 'path/to/unity.framework.js',
		codeUrl: 'path/to/unity.code',
	})

	unityContext.addUnityListener('gameStart', (msg) => {
		console.log('from Unity : ', msg)
	})
</script>

<template>
	<VueUnity :unity="unityContext" width="800" height="600" />
</template>

API

Constructor

new UnityWebgl(canvas: HTMLCanvasElement | string, config?:UnityConfig)

// or

const unityContext = new UnityWebgl(config: UnityConfig)
unityContext.render(canvas: HTMLCanvasElement | string)
  • canvas : Render Unity canvas elements or selectors.
  • config : Initializes the Unity application's configuration items.

config

Initializes the Unity application's configuration items.

PropertyTypeDescriptionRequired
loaderUrlstringUnity resource loader fileβœ…
dataUrlstringFile containing resource data and scenesβœ…
frameworkUrlstringFile with runtime and plugin codeβœ…
codeUrlstringWebAssembly binary file with native codeβœ…
streamingAssetsUrlstringURL for streaming resourcesOptional
memoryUrlstringURL for generated framework filesOptional
symbolsUrlstringURL for generated Unity code filesOptional
workerUrlstringURL for generated Unity web worker filesOptional
companyNamestringMetadata: Company nameOptional
productNamestringMetadata: Product nameOptional
productVersionstringMetadata: Product versionOptional
webglContextAttributesobjectWebGL rendering context options. @seeWebGLRenderingContextOptional
devicePixelRationumberCanvas device pixel ratio. @seedevicePixelRatioOptional
matchWebGLToCanvasSizebooleanDisable automatic WebGL canvas size sync. @seematchWebGLToCanvasSizeOptional
autoSyncPersistentDataPathbooleanEnables or disables auto synchronization of the persistent data path.Optional
disabledCanvasEventsstring[]Overwrites the default disabled canvas events.Optional
cacheControl(url) => stringThe Cache Control APIOptional

Methods

Instance methods :

⭐️ render(canvas: HTMLCanvasElement | string): void;

Renders UnityInstance into target html canvas element.

  • canvas : canvas element
await unityContext.render('#canvas')

⭐️ unload(): Promise<void>;

Unload the Unity WebGL instance.

await unityContext.unload()

⭐️ sendMessage(objectName: string, methodName: string, value?: any): this;

Send a message to invoke a public method in the Unity scene.

  • objectName: Object Name in Unity Scene
  • methodName: Unity script method name
  • value: Passed value
unityContext.sendMessage('GameObject', 'gameStart', { role: 'Tanya' })

requestPointerLock(): void;

Request pointer lock on the Unity canvas.

takeScreenshot(dataType?: string, quality?: any): string | undefined;

Capture a screenshot of the Unity canvas.

  • dataType: Type of image data
  • quality: Image quality
const screenshot = unityContext.takeScreenshot('image/jpeg', 0.92)

setFullscreen(enabled: boolean): void;

Toggle fullscreen mode.

unityContext.setFullscreen(true)

Event methods :

on(name: string, listener: EventListener, options?: { once?: boolean }): this;

Register for listening events.

unityContext.on('progress', (progress) => {
	console.log('Progress:', progress)
})

off(name: string, listener?: EventListener): this;

Remove event listener.

unityContext.off('progress', listener)

Unity Communication methods :

⭐️ addUnityListener(name: string, listener: EventListener, options?: { once?: boolean }): this;

Register a specific listener for Unity to call.

unityContext.addUnityListener('GameStarted', (level) => {
	console.log('Game started at level:', level)
})

// then call it in Unity
window.dispatchUnityEvent('GameStarted', 3)

removeUnityListener(name: string, listener?: EventListener): this;

Remove registered listeners.

unityContext.removeUnityListener('GameStarted', listener)

⭐️ window.dispatchUnityEvent(name: string, ...args: any[])

The way to dispatch a registered listener on the Unity side. (Calling JS methods in unity)

window.dispatchUnityEvent('GameStarted', 3)

Events

Event NameDescription
beforeMountBefore rendering UnityInstance to Canvas Element.
mountedAfter rendering UnityInstance to Canvas Element.
beforeUnmountBefore UnityInstance unload
unmountedAfter UnityInstance unload
progressUnity resource loading progress
errorError events
debugDebug messages from Unity

Unity-JavaScript Communication

1. Call Unity script functions from JavaScript

const unityContext = new UnityWebgl()

/**
 * @param {string} objectName Name of an object in your scene.
 * @param {string} methodName Public method name.
 * @param {any} value Passed value.
 */
unityContext.sendMessage('GameObject', 'StartGame', { role: 'Tanya' })

2. Call JavaScript functions from Unity scripts

  • First register the listener for Unity to call via addUnityListener on the web side.
unityContext.addUnityListener('gameStart', (level) => {
	console.log('Game started at level:', level)
})
  • Add the registered gameStart method to your Unity project.
// javascript_extend.jslib
mergeInto(LibraryManager.library, {
	Hello: function () {
		window.alert('Hello, world!')
	},

	GameStart: function (level) {
		//window.alert(UTF8ToString(str));
		window.dispatchUnityEvent('gameStart', UTF8ToString(level))
	},
})
  • Call these functions in unity's C# scripts:
using UnityEngine;
using System.Runtime.InteropServices;

public class WebGLPluginJS : MonoBehaviour
{
    [DllImport("__Internal")]
    public static extern void Hello();

    [DllImport("__Internal")]
    public static extern void GameStart(string level);

    void Start()
    {
        Hello();
        GameStart("2");
    }
}

Issues

Contributing

Contributions are welcome! Please submit a Pull Request.

License

Apache-2.0 License

Support

For issues or questions, please file an issue on the GitHub repository.

Keywords

unity

FAQs

Package last updated on 22 Apr 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts