Chiamare un Metodo di una Applicazione Unity WebGL da Javascript

marcosecchi Tutorials, Unity3D 0 Comments

In questi giorni sto lavorando su una applicazione WebGL in Unity3D ed una delle richieste del cliente è quella di avere un file di configurazione caricato durante la fase di inizializzazione.

Come spesso succede, non è chiarissimo dove questo file vada posizionato e quindi è risultato necessario poter passare il suo indirizzo tramite la pagina HTML che conterrà l’applicazione.

Chiamare metodi Unity da Javascript

La soluzione più semplice è quella di comunicare tramite Javascript il parametro: Unity fornisce il metodo SendMessage() (per il WebPlayer era disponibile u.getUnity().SendMessage()), che permette di chiamare una funzione su un GameObject all’interno della scena.

La chiamata è la seguente (i parametri sono tutti stringhe):

SendMessage ("aGameObject", "aMethod", "aParameter");

Il parametro aGameObject non è altro che il nome del GameObject che contiene il metodo all’interno di uno dei suoi componenti. Nel caso l’elemento sia contenuto all’interno di un altro GameObject, sarà necessario passare il percorso intero della struttura, ad esempio:

"aParentGameObject/aGameObject"

Il parametro aParameter non è altro che un singolo parametro, di tipo stringa, del metodo aMethod.

  Nel caso non siano previsti parametri, è comunque necessario passare una stringa vuota.

Attendere che l’Applicazione sia Caricata Completamente

Esiste però un piccolo problema… se l’applicazione non è ancora stata caricata completamente, la chiamata non verrà effettuata e verrà lanciato un errore: nel caso della mia applicazione, questo risultato è garantito, visto che il parametro passato serve praticamente subito.

La cosa migliore è quindi effettuare la richiesta direttamente da Unity (ad esempio sullo Start() di un GameObject): per questo, ci viene in aiuto il metodo Application.ExternalEval(), che permette di eseguire un metodo Javascript all’interno della pagina ospite.

Per intenderci, il giro effettuato dall’applicazione sarebbe:

  1. L’applicazione Unity viene lanciata e chiama un metodo Javascript all’interno della pagina HTML
  2. All’interno della funzione Javascript si recupera il parametro necessario
  3. Viene effettuata la chiamata esterna nella applicazione Unity, passando il parametro richiesto

Esempio

Nel file HTML della mia applicazione, ho inserito il seguente codice Javascript:

Oltre ad effettuare un log nella console, chiama anche un metodo SetAppInitUrl (con la url come parametro) ad un gameobject dal nome AppController.

Il gameobject di riferimento avrà uno script di questo genere:

dove, come è possibile vedere, si effettua la chiamata e si espone il metodo SetAppInitUrl() per la callback da Javascript.

Rendersi la vita più facile

Le chiamate qui sopra, dipendono ovviamente dai nomi dei metodi, che difficilmente cambieranno, ma anche dal nome del gameobject.
Se siete come me, è possibile che quel gameobject venga rinominato una dozzina di volte durante lo sviluppo!

Una buona soluzione è quella di passare questo valore direttamente da Unity a Javascript. Il nostro codice diventerà quindi:

e

  Per sicurezza poi, al posto del nome del gameobject, è possibile inserire il percorso completo all’interno della gerarchia nella scena.