Saltar al contenido principal

U - Librería (iOS y Android) y comunicación intra-app (iOS, Android y WebGL)

Descripción General

Pasos a seguir para generar un proyecto como librería tanto de Android como de iOS así como los segmentos de código a utilizar para la comunicación entre modulo nativo y modulo de Unity

Guía de trabajo

iOS

Como base se puede usar el ejemplo publicado por Unity-Technologies que contiene un proyecto nativo de xcode así como un proyecto de unity para realizar las pruebas:

El proyecto de Unity se compila de manera normal para iOS generando así un proyecto de XCode llamado Unity-iPhone

Desde nuestro proyecto nativo de iOS se debe generar un nuevo workspace (File / New / Workspace)

Abrimos este nuevo workspace y agregamos los dos proyectos el nativo de xcode y el de unity ( File / Add Files to “both” )

Seleccionamos la aplicación nativa y agregamos Unity-iPhone/UnityFramework.framework

  • En "Build Phases", abre "Link Binary With Libraries"

  • Elimina UnityFramework.framework de la lista

  • En el navegador del proyecto, encuentra Unity-iPhone / Libraries / Plugins / iOS / NativeCallProxy.h

  • Habilita UnityFramework en Target Membership y cambia la visibilidad de la cabecera de project a public

  • En el folder Data de Unity-iPhone cambia Target Membership a UnityFramework

  • selecciona NativeiOSApp scheme para correr la aplicación nativa con el proyecto de unity integrado

  • COMUNICACIÓN INTRA APP

  • Para enviar un mensaje desde la aplicación nativa al modulo de unity debemos utilizar sendMessage como se muestra en el script "MainViewController.mm" de la aplicación nativa:

    • (void)sendMsgToUnity

    {

        [[self ufw] sendMessageToGOWithName: "Cube" functionName: "ChangeColor" message: "yellow"];

    }

    Donde "Cube" es el nombre de la clase a la que accederemos dentro de unity (debe ser una clase asignada a un GameObject instanciado en la escena), "ChangeColor" es el nombre del método o función a ejecutar y "yellow" es el parametro que dicha función recibe, en forma de string.

    Código de c# en unity: public class Cube : MonoBehaviour {

    void ChangeColor(string newColor) {

    if (newColor == "red") GetComponent<Renderer>().material.color = Color.red; else if (newColor == "blue") GetComponent<Renderer>().material.color = Color.blue; else if (newColor == "yellow") GetComponent<Renderer>().material.color = Color.yellow; else GetComponent<Renderer>().material.color = Color.black; }

    }

    Android

    Como base se puede usar el ejemplo publicado por Unity-Technologies que contiene un proyecto nativo de android así como un proyecto de unity para realizar las pruebas:

Genera un proyecto gradle de android desde los Player Settings de unity

  • Selecciona como plataforma: Android
  • Selecciona la opción “Export Project”
    • Abre tu proyecto nativo en Android Studio
    • Abrir el archivo settings.gradle
      • agrega un nuevo proyecto apuntando al modulo unityLibrary al final del archivo:
    include ':unityLibrary'
project(':unityLibrary').projectDir=new File('..\\UnityProject\\androidBuild\\unityLibrary') La ruta debe ser exactamente la del proyecto generado por Unity

  • Abre el archivo build.gradle(Module: app)
    • Agrega lo siguiente en dependencies{ block
    implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])

  • Abre el archivo build.gradle(Project: NativeAndroidApp)
    • Agrega lo siguiente en allprojects{repositories{ block
    flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}

  • Da clic en Sync Now para que el proyecto se sincronice con lo cambios realizados 

  • Ahora el proyecto generado por unity debe haberse agregado como librería a tu proyecto nativo 

    COMUNICACIÓN INTRA APP

    • Para enviar un mensaje desde la aplicación nativa al modulo de unity debemos utilizar UnitysendMessage como se muestra en el script "MainUnityActivity.java" de la aplicación nativa:
    {
Button myButton = new Button(this);
myButton.setText("Send Msg");
myButton.setX(320);
myButton.setY(500);
myButton.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
mUnityPlayer.UnitySendMessage("Cube", "ChangeColor", "yellow");
}
});
layout.addView(myButton, 300, 200);
}

Código de c# en unity:public class Cube : MonoBehaviour {

void ChangeColor(string newColor) {

if (newColor == "red") GetComponent<Renderer>().material.color = Color.red; else if (newColor == "blue") GetComponent<Renderer>().material.color = Color.blue; else if (newColor == "yellow") GetComponent<Renderer>().material.color = Color.yellow; else GetComponent<Renderer>().material.color = Color.black; }

}

WebGL

COMUNICACIÓN INTRA APP

Código javascript fuera de Unity

onclick="unityInstance.SendMessage('Cube', 'ChangeColor', 'yellow')"

  • Código de c# en unity:public class Cube : MonoBehaviour {

void ChangeColor(string newColor) {

if (newColor == "red") GetComponent<Renderer>().material.color = Color.red; else if (newColor == "blue") GetComponent<Renderer>().material.color = Color.blue; else if (newColor == "yellow") GetComponent<Renderer>().material.color = Color.yellow; else GetComponent<Renderer>().material.color = Color.black; }

}

Consideraciones

Requerimientos:

Android

  • Android Studio 3.4.2+
  • Unity version 2019.3.0b4+

iOS

  • Xcode 9.4+
  • Unity version 2019.3.0b11+, 2020.1.0a13

Enlaces de descarga

https://github.com/Unity-Technologies/uaal-example

Archivos Adjuntos

Comentarios

Los expertos en android y iOS que sean encargados de hacer la integración pueden revisar el proyecto ejemplo para revisar referencias en el código que se pudieran haber omitido.

Ventajas

Poder integrar un proyecto de unity en aplicaciones nativas que requieran funciones mas fácilmente desarrollables en Unity como RA, manipulación de objetos 3D, física, videojuegos en general.

Desventajas

Limitations

While tested many scenarios for Unity as a library hosted by a native app, Unity does not control anymore the lifecycle of the runtime, so we cannot guarantee it'll work in all possible use cases. For example:

  • Unity as a Library supports rendering only full screen, rendering on a part of the screen isn’t supported.
  • Loading more than one instance of the Unity runtime isn’t supported.
  • You may need to adapt 3rd party Plug-ins (native or managed) to work properly
  • Overhead of having Unity in unloaded state is: 90Mb for Android and 110Mb for iOS

Elaboró

Erik Marmolejo Ensastegui