Integración de SDK de AppsFlyer - Unity

  • Los anunciantes
  • Desarrolladores

Official_unity_logo.png

Versión actual del SDK de Unity: v4.20.3
Compatible con SDK de Android v4.10.2 y el SDK de iOS v4.10.3

1. Resumen

El SDK de Unity de AppsFlyer proporciona funcionalidad de instalación y registro de eventos de aplicaciones móviles para proyectos de Unity en Android y iOS. Puedes registrar instalaciones, actualizaciones y sesiones y también registrar eventos post-instalación (como compras in-app, niveles de juegos, etc.) para evaluar el ROI y los niveles de captación (engagement) de usuarios.

Las aplicaciones móviles, que se desarrollan en la plataforma Unity, pueden integrar el SDK de AppsFlyer una vez y atribuir las instalaciones de aplicaciones generadas para Android y iOS. En la siguiente guía, se detalla cómo integrar el SDK de AppsFlyer en tu código de Unity para tus aplicaciones de iOS y Android.

 Nota

AppsFlyer admite la integración con Unity versión 5 y superiores.

 ¡Importante!

La API de referencia de instalación de Google Play es compatible a partir del plugin de Unity versión 4.16.0. Si deseas usar la nueva API de referencia, actualiza el plugin a la versión 4.16.0 o superior.

 Consejo

  • Los capítulos 2 y 3 son OBLIGATORIOS para implementar la integración básica del SDK; es decir, solo atribución de instalaciones
  • La implementación del capítulo "Registro de eventos in-app" es ALTAMENTE RECOMENDABLE
  • La aplicación del resto de las características descriptas es OPCIONAL, aunque algunas pueden ser necesarias para usted, dependiendo de la lógica de negocios de tu aplicación. Por ejemplo, el registro de ingresos o la obtención de datos de conversión en la primera ejecución puede ser vital para el flujo de tu aplicación.

2. Inicio Rápido

2.1 Descarga el plugin de Unity de AppsFlyer

Puedes encontrar el plugin sobre Github aquí: https://github.com/AppsFlyerSDK/Unity

A continuación se detallan las instrucciones de integración para usar el plugin de Unity de AppsFlyer.

Instalar el plugin

A continuación se detallan las instrucciones de instalación para usar el plugin de AppsFlyer.

  1. Importa AppsFlyerUnityPlugin.unitypackage a tu proyecto de Unity.
  2. Ve al Assets >> Import Package >> Custom Package
  3. Selecciona el archivo AppsFlyerUnityPlugin.unitypackage.

2.3 Configuración obligatoria para Android y iOS

Configuración de Android


Configuración del receptor AF y permisos en AndroidManifest.xml:

<!-- receiver should be inside the <application> tag -->
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>
<!-- Mandatory permission: -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />


Configuración de los permisos requeridos

El AndroidManifest.xml incluye el siguiente permiso:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional : -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />


Configuración del BroadcastReceiver en AndroidManifest.xml

Las siguientes dos opciones están disponibles para implementar el receptor de transmisión de referencia de instalación:

Uso de un Solo Receptor de Transmisión Uso de un Receptor de Transmisión Múltiple

Si no tienes un receptor escuchando en el INSTALL_REFERRER, en el AndroidManifest.xml, agrega el siguiente receptor dentro de la etiqueta de la aplicación:

<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
  <intent-filter>
     <action android:name="com.android.vending.INSTALL_REFERRER" />
   </intent-filter>
</receiver>

Configuración de iOS


Marcos y librerías enlazados


Tras crear el proyecto en Unity para xCode, deberás agregar Security.Framework a los Marcos y librerías enlazados de xCode si antes no se agregó ya el marco.


Apple Search Ads de iOS

Agrega lo siguiente:

AdSupport.framework
AppsFlyer recopila el IDFA solo si incluyes este marco. Si no agregas este marco, no podrás atribuir instalaciones a Facebook, Twitter ni la mayoría de las demás redes de publicidad.
iAd.framework

Se recomienda encarecidamente agregar este marco a tu proyecto de aplicación, ya que es obligatorio para la atribución de anuncios de búsqueda de Apple.

3. Inicialización del SDK

En tus métodos de Start / Init, debes configurar la clave de desarrollador (dev key) de AppsFlyer y los ID de aplicación únicos usados por iTunes y Google Play.  Ten en cuenta que aquí debes configurar el ID de aplicación de iOS únicamente con dígitos, sin el prefijo "id".

Agrega el siguiente código:

Plugin de Unity 4.15.1 y superior Plugin de Unity 4.14.3 e inferior
void Start () {
/* Mandatory - set your AppsFlyer’s Developer key. */
AppsFlyer.setAppsFlyerKey ("YOUR_APPSFLYER_DEV_KEY");
/* For detailed logging */
/* AppsFlyer.setIsDebug (true); */
#if UNITY_IOS
  /* Mandatory - set your apple app ID
   NOTE: You should enter the number only and not the "ID" prefix */
  AppsFlyer.setAppID ("YOUR_APP_ID_HERE");
  AppsFlyer.trackAppLaunch ();
#elif UNITY_ANDROID
  /* Mandatory - set your Android package name */
  AppsFlyer.setAppID ("YOUR_ANDROID_PACKAGE_NAME_HERE");
  /* For getting the conversion data in Android, you need to add the "AppsFlyerTrackerCallbacks" listener.*/
  AppsFlyer.init ("YOUR_APPSFLYER_DEV_KEY","AppsFlyerTrackerCallbacks");
#endif
}

 ¡Importante!

  • Para Android, AppsFlyer.init incluye llamar a trackAppLaunch. Por lo tanto, no llames a trackAppLaunch en la versión para Android del plugin de Unity.
  • En iOS, la respuesta de los datos de conversion se activa en la clase AppsFlyerTrackerCallbacks.cs.

4. Registrar eventos in-app

Los eventos in-app brindan conocimientos sobre lo que está sucediendo en tu aplicación. Se recomienda tomarse el tiempo y definir los eventos que deseas medir para que puedas medir el ROI (Retorno de la Inversión) y el LTV (Valor del Tiempo de Vida).

El registro de eventos in-app se realiza invocando a trackRichEvent con el nombre del evento y los parámetros de valor. Consulta la documentación sobre eventos in-app para conocer más detalles.

 Nota

El nombre para el evento in-app no debe tener más de 45 caracteres. Los nombres de eventos con más de 45 caracteres no aparecerán en el panel de control, sino solo en las API de pull y push y de raw data.


Ejemplo de registro de evento:

System.Collections.Generic.Dictionary<string, string> purchaseEvent = new  
System.Collections.Generic.Dictionary<string, string> ();
purchaseEvent.Add ("af_currency", "USD");
purchaseEvent.Add ("af_revenue", "0.99");
purchaseEvent.Add ("af_quantity", "1");
AppsFlyer.trackRichEvent ("af_purchase", purchaseEvent);

 Nota

AppsFlyer admite caracteres no ingleses con eventos in-app o con cualquier otra API de SDK a partir de la versión 4.15.1 del SDK de Unity.

5. Realización de conexiones profundas

Para enlaces profundos, sigue las instrucciones de acuerdo con tu sistema operativo.

AndroidiOS
Agrega lo siguiente a tu archivo de manifiesto:

<activity android:name="com.appsflyer.GetDeepLinkingActivity" android:exported="true">
 <intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="your_scheme" />
 </intent-filter>
</activity>

Para recibir tus datos de conexiones profundas, deberás implementar primero el callback onAppOpenAttribution (que aparece en la clase AppsFlyerTrackerCallbacks) invocado por el SDK de AppsFlyer. Este devuelve los parámetros de enlace de atribución/Onelink utilizados para abrir la aplicación. Luego podrá analizar los valores y aplicar la lógica para abrir la página de la aplicación relevante.

public void onAppOpenAttribution(string validateResult) {
	print ("AppsFlyerTrackerCallbacks:: got onAppOpenAttribution = " + validateResult);
}

6. Registrar los ingresos

Utiliza el parámetro de evento AFInAppEvents.REVENUE para contar los ingresos como parte de un evento in-app. Puedes llenarlo con cualquier valor numérico, positivo o negativo.

 Nota

AFInAppEvents.REVENUE(equivalente a usar af_revenue) es el ÚNICO parámetro de evento que se contabiliza en AppsFlyer como ingreso actual en los raw data y en el panel de control. Para obtener más detalles, haz clic aquí.

 Ejemplo

evento in-app de ingresos
AppsFlyer.trackRichEvent(AFInAppEvents.LEVEL_ACHIEVED, new Dictionary<string, string>(){
	{AFInAppEvents.CONTENT_ID, "1234567"},
	{AFInAppEvents.CONTENT_TYPE, "category_a"},
	{AFInAppEvents.REVENUE, "1.99"},
	{AFInAppEvents.CURRENCY, "USD"}
});

 ¡Importante!

No altere el valor de los ingresos bajo ningún concepto. No debe contener comas separadoras, signos de divisas ni texto. Un valor de ingresos podría ser, por ejemplo, 1234.56.

Registro de ingresos negativos

Si necesitas registrar ingresos negativos, por ejemplo cuando un usuario cancela una compra o recibe un reembolso, puedes enviar ingresos negativos.

AppsFlyer.trackRichEvent(AFInAppEvents.PURCHASE, new Dictionary<string, string>(){
	{AFInAppEvents.CONTENT_ID, "1234567"},
	{AFInAppEvents.CONTENT_TYPE, "category_a"},
	{AFInAppEvents.REVENUE, "-1.99"},
	{AFInAppEvents.CURRENCY, "USD"}
});

 Nota

Observe lo siguiente en el código anterior:

  1. El valor de ingresos está precedido por un signo de menos
  2. El nombre del evento tiene un valor único de "cancel_purchase" para permitirle identificar los eventos con ingresos negativos en el panel de control y en los informes de datos sin procesar.

7. Obtener datos de conversión

AppsFlyer te permite acceder a los datos de conversión del usuario en tiempo actual directamente a nivel del SDK. Te permite personalizar la página de destino de las vistas de un usuario en la primera aplicación abierta después de una nueva instalación de la aplicación.

Para cargar los datos de conversión de AppsFlyer desde sus servidores:

  1. Agregar un GameObject vacío
  2. Adjunta el AppsFlyerTrackerCallbacks.cs que se incluye en el proyecto (debes darle nombre a este gameobject AppsFlyerTrackerCallbacks).
Plugin de Unity para Android > 4.15.1 Plugin de Unity para Android < 4.14.3 iOS
/*Para obtener los datos de conversión en Android, necesitas agregar este Agente de escucha al método init()*/
AppsFlyer.init ("YOUR_DEV_KEY","AppsFlyerTrackerCallbacks");


En Android puedes mover los métodos de AppsFlyerTrackerCallbacks.cs a otra clase y llamar a esa clase en tu oyente.

Debes usar exactamente los mismos espacios de nombres de métodos que aparecen en AppsFlyerTrackerCallbacks.

8. Identificadores de Usuario

Obtener el ID del dispositivo de AppsFlyer

El ID de dispositivo único de AppsFlyer se crea por cada nueva instalación de una aplicación. Usa el siguiente API para obtener el ID único de AppsFlyer:

public String getAppsFlyerId();


Ejemplo de uso:

string AppsFlyerUID = AppsFlyer.getAppsFlyerId();

Establece el ID de usuario de cliente

Establece el ID del usuario tal como lo usa la aplicación. 

Para configurar el ID del usuario, llama al siguiente método:

AppsFlyer.setCustomerUserID("someId");

 Nota

El customerUserID DEBERÍA establecerse antes de trackAppLaunch/init. Se recomienda establecer tu ID de Usuario de Cliente lo antes posible, ya que solo está asociado con los eventos reportados después de su configuración. El ID de usuario de cliente también se puede usar para completar integraciones con plataformas de analíticas como Mixpanel y Swrve.

 ¡Importante!

Para iOS: Asegúrese de configurar el ID de usuario del cliente cada vez que se inicia la aplicación, antes de llamar a trackAppLaunch

Para obtener más información sobre el ID de usuario de cliente, haz clic aquí.

ID de publicidad de Google

Desde la versión 4.15.1 del SDK, AppsFlyer recopila automáticamente el google_advertising_id. El requisito de recopilar el ID de Publicidad de Google solo es relevante para SDK versiones inferiores de 4.15.1.

IMEI y ID de Android

De manera predeterminada, el SDK no recopila el IMEI ni el ID de Android si la versión del sistema operativo es superior a KitKat (4.4) y el dispositivo contiene Google Play Services (en versiones del SDK de Unity 4.16.4 o anteriores, la aplicación específica requería GPS). 

Para enviar explícitamente estos ID a AppsFlyer, los desarrolladores pueden usar las siguientes API:

AppsFlyer.setAndroidIdData(string)
AppsFlyer.setImeiData(string)

Si la aplicación NO contiene Google Play Services, el SDK recopila el IMEI y el ID de Android. Sin embargo, las aplicaciones con Google Play Services deberían evitar la recopilación del IMEI, ya que esto viola la política de Google Play.

Los desarrolladores pueden optar por no recopilar el IMEI y el ID de Android mediante el uso de estas API:

AppsFlyer.setCollectAndroidID(bool) 
AppsFlyer.setCollectIMEI(bool)

 Advertencia

Al menos un identificador de dispositivo, ya sea GAID, ID de Android o IMEI, DEBE recopilarse para permitir la atribución adecuada.

IDFA y IDFV

AppsFlyer recopila automáticamente el IDFA (ID para los Anunciantes) y el IDFV (ID para los Vendedores) si se incluye AdSupport.framework en la aplicación.

9. Funciones opcionales

Medición de desinstalaciones

Para medir las desinstalaciones, siga las instrucciones según su sistema operativo.

Android - FirebaseAndroid - GCMiOS
1.  Descarga la SDK de Firebase de Unity desde: https://firebase.google.com/docs/unity/setup
2.  Importa FirebaseMessaging.unitypackage al proyecto.
3.  Importa google-services.json al proyecto (obtenido en la consola Firebase)

 Nota

Los receptores de manifiesto se deberían agregar automáticamente mediante el SDK de Firebase para Unity.


4.  En la clase de Unity que maneja el código de AppsFlyer, agrega lo siguiente:
utilizando Firebase.Messaging;
usando Firebase.Unity;

5.  Agrega al método Start():
Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;

6.  Agrega el siguiente método:
public void OnTokenReceived
  (object sender, Firebase.Messaging.TokenReceivedEventArgs token) { 
    AppsFlyer.updateServerUninstallToken (token.Token);
}

 

 Advertencia

Los usuarios que implementen el SDK de Firebase de Unity no deberían agregar la siguiente llamada a método para enableUninstallTracking(“SenderID”), ya que el SDK de Firebase obtendrá el ID del remitente del archivo google-services.json que hemos agregado antes. Agregar este método podría provocar una advertencia de depuración de Android.

Registro de notificaciones Push

AppsFlyer te permite medir notificaciones push como parte de una campaña de retargeting.

handlePushNotification(Dictionary<string, string> payload)

La carga de datos debería incluir un objeto: af con la cadena clave-valor relevante:

Ejemplo:

{ 
  "data":{ 
   "score":"5x1",
   "time":"15:10",
   "af":{ 
     "c":"test_campaign",
     "is_retargeting":"true",
     "pid":"push_provider_int"
   }
  }
}

// with deep-linking
{
  "data":{
   "score":"5x1",
   "time":"15:10",
   "click_action":"com.example.someAction",
   "af":{
     "c":"test_campaign",
     "is_retargeting":"true",
     "pid":"push_provider_int"
   }
  }
}

 Nota

Para obtener más información sobre la medición de notificaciones push, lee aquí.

Atribución de la promoción cruzada

AppsFlyer te permite registrar y atribuir instalaciones originadas en una promoción cruzada de una de tus aplicaciones dentro de la aplicación actual que tiene el usuario. Las aplicaciones de promoción cruzada pueden ser un importante factor de crecimiento para impulsar instalaciones adicionales para tus aplicaciones.

Para obtener detalles, consulta el artículo de atribución de promoción cruzada, aquí.

Atribución de invitaciones de usuarios

AppsFlyer te permite atribuir y registrar instalaciones originadas en las invitaciones de los usuarios dentro de tu aplicación. Permitir que tus usuarios actuales inviten a sus amigos y contactos como nuevos usuarios a tu aplicación puede ser un factor de crecimiento clave para tu aplicación.

Para conocer más detalles, lee el artículo sobre atribución de invitaciones de usuarios aquí.

Definición de código de moneda

Puedes usar la siguiente API para establecer un código de moneda global, además de códigos de moneda específicos que se pueden usar como parte de cada evento in-app enviado a AppsFlyer. El código de moneda global se usa cuando af_currency

AFInAppEvents.CURRENCY

no es enviado como parte de un evento in-app

USD es el valor predeterminado. Puedes encontrar códigos de moneda ISO aceptables aquí .

Usa la siguiente API para configurar el código de moneda:

public void setCurrencyCode(String currencyCode);

Ejemplo de Uso:

setCurrencyCode(string currencyCode)

Validación de compras in-app

Para la validación de recibo de compra in-app, sigue las instrucciones de acuerdo con tu sistema operativo.

Llamada de Android Llamar al oyente (Android únicamente) iOS
//Para obtener los callbacks
//AppsFlyer.createValidateInAppListener ("AppsFlyerTrackerCallbacks", 
"onInAppBillingSuccess", "onInAppBillingFailure"); AppsFlyer.validateReceipt(string publicKey, string purchaseData,
string signature, string price, string currency, Dictionary additionalParametes);

 Notas

  • Calling validateAndTrackInAppPurchase automatically generates an af_purchase in-app event, so you don't need to send this event yourself. 
  • La respuesta de validación de compra se activa en la clase AppsFlyerTrackerCallbacks.cs.

Anonimizar Datos de Usuarios

AppsFlyer te ofrece un método para anonimizar identificadores de usuarios específicos en las analíticas de AppsFlyer. Este método cumple con los últimos requisitos de privacidad y con las políticas de datos y privacidad de Facebook. El valor predeterminado es NO, lo que significa que no se efectuará la anonimización de forma predeterminada.

Usa esta API durante la Inicialización del SDK para anonimizar explícitamente las instalaciones, los eventos y las sesiones de un usuario:

public void setDeviceTrackingDisabled(boolean isDisabled);

Ejemplo de Uso:

AppsFlyer.setDeviceTrackingDisabled(true);
El registro de eventos y atribuciones se puede reiniciar llamando a deviceTrackingDisabled nuevamente configurado como falso.

 Advertencia

Optar por la exclusión de usuarios afecta SEVERAMENTE su información de atribución.
Utilice esta opción SOLO para regiones en las que esté legalmente prohibido recolectar información de usuarios.

Tiempo Personalizado Entre Sesiones

De manera predeterminada, deben pasar por lo menos 5 segundos entre 2 inicios de aplicaciones para que cuenten como 2 sesiones separadas (más información acerca del recuento de sesiones).
Sin embargo, puedes usar la siguiente API para establecer tu valor personalizado para el tiempo mínimo requerido entre sesiones:
setMinTimeBetweenSessions(int seconds)


Ejemplo de uso:

AppsFlyer.setMinTimeBetweenSessions(10);

Ten en cuenta que si estableces un valor alto para el tiempo personalizado entre inicios, esto puede afectar mucho a las API que dependen de los datos de sesión, como los enlaces profundos.

Sesiones de segundo plano para aplicaciones de utilidad

Actualmente no disponible en Unity.

Atribuir aplicaciones fuera de la tienda

 Nota

Google Play es la tienda predeterminada. Si publicas tu aplicación solo en Google Play, omite esta sección.

Para registrar las instalaciones fuera de Google Play, configura el canal/tienda en AndroidManifest.xml de la aplicación con un canal único o cualquier nombre de tienda para cada APK. El valor CANAL distingue entre mayúsculas y minúsculas.

Ejemplos:

<meta-data android:name="CHANNEL" android:value="Amazon" />
<meta-data android:name="CHANNEL" android:value="Standalone"/>
<meta-data android:name="CHANNEL" android:value="Verizon" />

 Nota

Debes configurar el valor CANAL en el panel de control de AppsFlyer al configurar la aplicación.

Coloca la etiqueta de metadatos antes de la etiqueta</application>.

Para obtener más detalles sobre cómo registrar las instalaciones para aplicaciones fuera de la tienda, lee aquí.

Optar por la exclusión

En algunos casos extremos, tal vez quiera desactivar el rastreo del SDK para cumplimiento con disposiciones reglamentarias o asociadas a la privacidad. Puede hacerlo con la API isStopTracking. Una vez invocada esta API, nuestro SDK ya no se comunicará con nuestros servidores y dejará de funcionar.

AppsFlyer.stopTracking(true);

En cualquier evento, se puede reactivar el SDK llamando a la misma API y pasando un valor falso.

Existen varios casos para que un usuario opte por la exclusión. Es muy recomendable que sigas las instrucciones exactas para la situación correspondiente a tu aplicación.

 Advertencia

Utiliza esta API solo en casos en los que quieras ignorar por completo a este usuario y eliminarlo de cualquier atribución y registro de eventos. La utilización de esta API afecta GRAVEMENTE tus mecanismos de atribución, recopilación de datos y establecimiento de enlaces profundos.

Configuración de datos personalizados adicionales

La API setAdditionalData es necesaria para la integración a nivel del SDK con varias plataformas de partners externos, incluidas Segment, Adobe y Urban Airship. Usa esta API solo si el artículo de integración de la plataforma indica específicamente que es necesaria la API setAdditionalData.
A continuación se muestra un ejemplo de código para implementar setAdditionalData en Unity:

Dictionary<string, string> CustomDataMap = new Dictionary<string, string>();
CustomDataMap.Add("custom_param_1", "value_of_param_1");
AppsFlyer.setAdditionalData(CustomDataMap);

Atribución de aplicaciones preinstaladas

Solo para Android

Puedes establecer de manera programática una fuente de medios preinstalada, desde Unity, empleando la siguiente API:

setPreinstallAttribution(string MediaSource, string Campaign, string Site_Id);

Para conocer detalles sobre las implementaciones nativas, haz clic aquí.

 ¡Importante!

Cuando uses el SDK de Unity con AppsFlyer, evita lo siguiente:

PlayerPrefs.DeleteAll()

10. Probando tu integración

Para obtener instrucciones sobre cómo probar tus integraciones de acuerdo con tu sistema operativo, haz clic en Pruebas de Android o enPruebas de iOS .

Ahora puedes comenzar a medir las fuentes de medios con las que trabajas.

11. Problemas conocidos

ProGuard

Si estás usando ProGuard para Android y encuentras una advertencia sobre nuestra clase AFKeystoreWrapper, agrega el siguiente código a tu archivo de reglas de ProGuard:

-keep class com.appsflyer.** { *; }

IL2CPP

Para excluir nuestro SDK desde la eliminación de códigos de bytes gestionados con IL2CPP, agregue lo siguiente al link.xml:

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.AndroidJavaRunnableProxy" preserve="all" />
  </assembly>
</linker>

IMPL_APP_CONTROLLER_SUBCLASS

Si utilizas plugins adicionales que deban anular AppControllerClassName, deberás modificar AppsFlyerAppController tal como se muestra a continuación (objective-C):

+(void)load
{
  [AppsFlyerAppController plugin];
}

// Singleton accessor.
+ (AppsFlyerAppController *)plugin
{
  static AppsFlyerAppController *sharedInstance = nil;
  static dispatch_once_t onceToken;
  
  dispatch_once(&onceToken, ^{
    
    sharedInstance = [[AppsFlyerAppController alloc] init];
  });
  
  return sharedInstance;
}

//IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController)

12. Proyecto de muestra de Unity

Para ver un proyecto de muestra de Unity, haz clic aquí.

¿Fue útil este artículo?
Usuarios a los que les pareció útil: 4 de 10

Comentarios

0 comentarios

Inicie sesión para dejar un comentario.

Artículos en esta sección