Plugin para Android UnitySendMessage Never Called
Esto funcionaba hace unas semanas, pero ahora he notado que mi mensaje OnReward
ya no se llama desde mi plugin personalizado.
En mi clase rewardcenter.cs llamo a la clase plugin para establecer el listener al objeto gameObject al que se adjunta este script (en este caso de ejemplo es GameObject
):
- Doloroso Unity proyecto de exportación a Android cada construcción (estoy haciendo algo mal)
- Unity3D - Reproducción de audio que se silencia después de recibir cualquier llamada / notificación en Android
- Guardar en Google Play Cloud Guardar automáticamente
- Determinación de la altura real de un SmartBanner de Admob en Unity para Android
- ¿Cómo recuperar la ID de juegos de google con la nueva actualización de juegos de Google ID de jugador?
public class rewardcenter : MonoBehaviour { int counter = 0; void Start () { OnReward("85"); } // Update is called once per frame void Update () { if (counter == 20) { #if UNITY_ANDROID PluginClass.SetRewardListener(gameObject.name); Debug.Log("Adding Android Reward Listener: " + gameObject.name); #endif } counter++; } void OnReward(string quantity) { Debug.Log("OnReward: " + quantity); } }
En el archivo PluginClass.cs puede ver cómo llamo a la llamada setUnityObjectName
en la clase de complemento java para establecer el objeto de unidad en el pasado en la cadena de nombre de GameObject
:
private static AndroidJavaObject pluginClassInstance = null; private static AndroidJavaObject activityContext = null; // pass in the GameObject that implements the OnReward method public static void SetRewardListener(string gameObjName) { if (activityContext == null) { using (AndroidJavaClass activityClass = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { activityContext = activityClass.GetStatic<AndroidJavaObject> ("currentActivity"); } } using (AndroidJavaClass pluginClass = new AndroidJavaClass ("pluginclass.com.PluginClass")) { if (pluginClass != null) { pluginClassInstance = pluginClass.CallStatic<AndroidJavaObject> ("getInstance"); activityContext.Call ("runOnUiThread", new AndroidJavaRunnable (() => { pluginClassInstance.Call("setUnityObjectName", gameObjName); })); } } }
En el java PluginClass mismo más adelante intentamos llamar a OnReward
usando UnitySendMessage
en nuestro objeto de juego:
public void unityEarnedReward(String quantity) { Log.d(TAG, "unityEarnedReward: " + quantity); if (PluginClass.getInstance()._unityObjectName != null) { Log.d(TAG, "calling OnReward(" + quantity + ") on unityObject with name: " + PluginClass.getInstance()._unityObjectName); com.unity3d.player.UnityPlayer.UnitySendMessage(PluginClass.getInstance()._unityObjectName, "OnReward", quantity); } }
Termino con una salida de registro en Android Studio de:
calling OnReward(202) on unityObject with name: GameObject
Pero nunca parece que en realidad se llame OnReward
dentro del juego.
Sólo por las patadas He intentado llamar a OnReward
cuando se inicia el guión, termina con una salida de:
OnReward: 85
Así que sé que funciona e imprime a la consola cuando se ejecuta.
¿Alguna idea de dónde me equivoco? Lo extraño es que esto funcionó hace unas semanas, pero ahora el método OnReward
no se ejecuta.
EDITAR:
También traté de ejecutarlo sin la declaración de clase específica como esta sin suerte:
UnityPlayer.UnitySendMessage(PluginClass.getInstance()._unityObjectName, "OnReward", quantity);
También cambié el nombre de mi gameObject para ser MyCustomPlugin
pero mientras que el código androide activado no parece que el método OnReward
fue desencadenado en el script vinculado a MyCustomPlugin
.
Captura de pantalla de script:
Cuando ejecuto este código:
void Update () { var unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); unityPlayer.CallStatic ("UnitySendMessage", gameObject.name, "OnReward", "185"); OnReward ("86"); }
Termino con dos mensajes de Log:
04-14 10:47:47.085 10341-10354/? I/Unity: OnReward: 86 (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51) 04-14 10:47:47.095 10341-10354/? I/Unity: OnReward: 185 (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
- ¿Requisitos mínimos para Unity para Android?
- La aplicación de Unity detiene la música de fondo
- Unity frente a Android frente a la cámara WTF bug
- Android 2d motor de juegos por qué libgdx en lugar de otro
- Invocación del servicio de facturación en la aplicación sin establecer un paquete de destino para la intención
- Error al volver a compilar el archivo de recursos de Android
- Integración de Unity con Eclipse - ¿Cómo seguir las instrucciones del tutorial "oficial"?
- Unity 4.2 Android en la aplicación de facturación: la firma de verificación ha fallado
Parece que el problema fundamental es que porque tengo una actividad separada, hace una pausa a la UnityActivity que a su vez hace una pausa a la Unidad.
Por lo tanto, Unity no puede recibir el UnitySendMessage cuando estaba tratando de enviarlo.
Para evitar esto implementé una forma de llamarla en mi método onStop
de mi Actividad. En este momento, Unity ya no está pausado y puede recibir el mensaje.
- Cómo obtener los colores predeterminados en Android
- ¿Cómo funciona la aplicación "SHAREit" Android funciona técnicamente?