perilaku Cache di WebGL
Pertimbangan kinerja WebGL

Interaksi dengan scripting browser

Ketika membangun konten untuk web, Anda mungkin perlu berkomunikasi dengan elemen lain di halaman web Anda. Atau Anda mungkin ingin menerapkan fungsi menggunakan Web API yang Unity tidak saat ini diekspos secara default. Dalam kedua kasus, Anda perlu langsung antarmuka dengan mesin JavaScript browser. Unity WebGLLogin API yang membuat grafis 2D dan 3D di browser web. Opsi build Unity WebGL memungkinkan Unity untuk mempublikasikan konten sebagai program JavaScript yang menggunakan teknologi HTML5 dan WebGL rendering API untuk menjalankan konten Unity di browser web. More info
Lihat di Glossary
menyediakan metode yang berbeda untuk melakukan ini.

Memanggil fungsi JavaScript dari skrip Unity

Cara yang disarankan untuk menggunakan JavaScript browser di proyek Anda adalah untuk menambahkan sumber JavaScript Anda ke proyek Anda, dan kemudian sebutkan fungsi tersebut langsung dari kode skrip Anda. Untuk melakukannya, tempatkan file dengan kode JavaScript menggunakan ekstensi .jslib di bawah subfolder "Plugins" di folder Aset Anda. File plugin perlu memiliki sintaks seperti ini:

mergeInto(LibraryManager.library, {

  Hello: function () {
    window.alert("Hello, world!");
  },

  HelloString: function (str) {
    window.alert(UTF8ToString(str));
  },

  PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    console.log(HEAPF32[(array >> 2) + i]);
  },

  AddNumbers: function (x, y) {
    return x + y;
  },

  StringReturnValueFunction: function () {
    var returnStr = "bla";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);
    return buffer;
  },

  BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },

});

Kemudian Anda dapat memanggil fungsi ini dari Anda C# scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
seperti ini:

using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    [DllImport("__Internal")]
    private static extern void HelloString(string str);

    [DllImport("__Internal")]
    private static extern void PrintFloatArray(float[] array, int size);

    [DllImport("__Internal")]
    private static extern int AddNumbers(int x, int y);

    [DllImport("__Internal")]
    private static extern string StringReturnValueFunction();

    [DllImport("__Internal")]
    private static extern void BindWebGLTexture(int texture);

    void Start() {
        Hello();
        
        HelloString("This is a string.");
        
        float[] myArray = new float[10];
        PrintFloatArray(myArray, myArray.Length);
        
        int result = AddNumbers(5, 7);
        Debug.Log(result);
        
        Debug.Log(StringReturnValueFunction());
        
        var texture = new Texture2D(0, 0, TextureFormat.ARGB32, false);
        BindWebGLTexture(texture.GetNativeTexturePtr());
    }
}

Jenis numerik sederhana dapat dilewatkan ke JavaScript dalam parameter fungsi tanpa memerlukan konversi. Jenis data lain dilewatkan sebagai pointer di landai emscripten (yang hanya array besar dalam JavaScript). Untuk string, Anda dapat menggunakan fungsi bantuan UTF8ToString untuk mengkonversi ke string JavaScript. Untuk mengembalikan nilai string yang Anda butuhkan untuk memanggil _malloc untuk mengalokasikan beberapa memori dan fungsi bantuan stringToUTF8 untuk menulis string JavaScript ke dalamnya. Jika string adalah nilai pengembalian, maka runtime il2cppBack-end scripting bersatu yang dapat Anda gunakan sebagai alternatif untuk Mono ketika proyek bangunan untuk beberapa platform. More info
Lihat di Glossary
akan mengurus membebaskan memori untuk Anda. Untuk array dari jenis primitif, emscripten menyediakan ArrayBufferViews yang berbeda menjadi heap untuk berbagai ukuran integer, bilangan bulat atau representasi titik mengambang memori: HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64. Untuk mengakses tekstur di WebGL, emscripten menyediakan array GL.textures yang memetakan ID tekstur asli dari Unity ke objek tekstur WebGL. Fungsi WebGL dapat disebut pada konteks WebGL emscripten, GLctx.

Untuk informasi lebih lanjut tentang cara berinteraksi dengan JavaScript, merujuk ke Dokumentasi emscripten.

Selain itu, perhatikan bahwa di folder instalasi Unity ada beberapa plugin yang dapat Anda gunakan sebagai referensi, di PlaybackEngines/WebGLSupport/BuildTools/lib dan PlaybackEngines/WebGLSupport/BuildTools/Emscripten/src/library*.

Code visibility

Mulai dari Unity 5.6 semua kode build dieksekusi dalam lingkupnya sendiri. Pendekatan ini memungkinkan untuk menanam konten Anda di halaman arbitrase tanpa menyebabkan konflik dengan kode halaman yang timbul, dan memungkinkan untuk menanam lebih dari satu membangun di halaman yang sama.

Jika Anda memiliki semua kode JavaScript Anda dalam bentuk plugin .jslib di dalam proyek Anda, maka kode JavaScript ini akan berjalan di dalam lingkup yang sama sebagai build yang disusun dan kode Anda harus bekerja sama seperti versi Unity sebelumnya. Misalnya, objek dan fungsi berikut harus langsung terlihat dari kode plugin JavaScript: Modul, SendMesssage, HEAP8, ccall dll..

Namun, jika Anda berencana untuk memanggil fungsi JavaScript internal dari lingkup global halaman embedding, Anda harus menggunakan variabel unityInstance di indeks Template WebGL Anda.html. Apakah ini setelah mesin Unity instaniasi berhasil, misalnya:

  var myGameInstance = null;
  script.onload = () => {
    createUnityInstance(canvas, config, (progress) => {...}).then((unityInstance) => {
      myGameInstance = unityInstance;
      …

Kemudian Anda dapat mengirim pesan ke build menggunakan myGameInstance.SendMessage(), atau mengakses objek modul build menggunakan myGameInstance.Module.

Memanggil fungsi skrip Unity dari JavaScript

Kadang-kadang Anda perlu mengirim beberapa data atau pemberitahuan ke script Unity dari JavaScript browser. Cara yang disarankan untuk melakukannya adalah untuk memanggil metode pada GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
dalam konten Anda. Jika Anda membuat panggilan dari plugin JavaScript, tertanam dalam proyek Anda, Anda dapat menggunakan kode berikut:

MyGameInstance.SendMessage(objectName, methodName, value);

Di mana objectName is nama objek di tempat kejadian Anda; methodName is nama metode di skrip, saat ini melekat pada objek itu; value can menjadi string, angka, atau bisa kosong. Contoh:

MyGameInstance.SendMessage('MyGameObject', 'MyFunction');
MyGameInstance.SendMessage('MyGameObject', 'MyFunction', 5);

MyGameInstance.SendMessage('MyGameObject', 'MyFunction', 'MyString');

Jika Anda ingin membuat panggilan dari lingkup global halaman yang timbul, lihat bagian Code Visibility di bawah ini.

Memanggil fungsi C dari skrip Unity

Unity mengkompilasi sumber Anda ke JavaScript dari C / C++ kode menggunakan emscripten, sehingga Anda juga dapat menulis plugin dalam kode C / C++, dan memanggil fungsi ini dari C #. Jadi, bukan file jslib dalam contoh di atas, Anda bisa memiliki C / C++ file dalam proyek Anda - akan secara otomatis dikompilasi dengan skrip Anda, dan Anda dapat memanggil fungsi dari itu, seperti dalam contoh JavaScript di atas.

Jika Anda menggunakan C++ (.cpp) untuk mengimplementasikan plugin maka Anda harus memastikan fungsi yang diumumkan dengan tautan C untuk menghindari masalah nama mangling:

#include <stdio.h>

extern "C" void Hello ()
{
    printf("Hello, world!\n");
}

extern "C" int AddNumbers (int x, int y)
{
    return x + y;
}

Sitemap Unity menggunakan emscripten versi 2.0.19 toolchain.Note: Unity is using the Emscripten version 2.0.19 toolchain.


  • diganti Pointer__stringify() dengan UTF8ToString di 2021.2 seterusnya

  • Sitemap Instance diganti dengan membuat UnityInstance pada 2020.1

  • Kesalahan tetap dalam contoh kode.

  • Contoh WebGL berganti nama dari gameInstance to unityInstance di 2019. 1 Artikel

perilaku Cache di WebGL
Pertimbangan kinerja WebGL