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"
-
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




