Подтвердить что ты не робот

Android Plugin UnitySendMessage никогда не вызывается

Это работало несколько недель назад, но теперь я заметил, что мое сообщение OnReward больше не вызывается из моего настраиваемого плагина.

В моем классе rewardcenter.cs я вызываю класс плагина, чтобы установить слушателя в объект gameObject, к которому привязан этот script (в данном примере это GameObject):

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);
    }
}

В файле PluginClass.cs вы можете увидеть, как я вызываю вызов setUnityObjectName в классе плагина java, чтобы установить объект единства в переданную в строке имени GameObject строку 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);
            }));
        }
    }
}

В самой java-среде PluginClass мы пытаемся вызвать OnReward с помощью UnitySendMessage на нашем игровом объекте:

   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);
        }
    }

В итоге я получаю вывод журнала в Android Studio:

calling OnReward(202) on unityObject with name: GameObject

Но на самом деле он никогда не вызывает OnReward в игре.

Просто для ударов Я пробовал звонить OnReward, когда запускается script, он заканчивает вывод:

OnReward: 85

Итак, я знаю, что он работает и печатает на консоли, когда он выполняется.

Любая идея, где я ошибаюсь? Странно, что это сработало несколько недель назад, но теперь метод OnReward не выполняется.

EDIT:

Я также попытался запустить его без специального объявления класса, подобного этому, без везения:

UnityPlayer.UnitySendMessage(PluginClass.getInstance()._unityObjectName, "OnReward", quantity);

Я также переименовал свой объект gameObject в MyCustomPlugin, но при запуске кода андроида он не казался, что метод OnReward когда-либо срабатывал на script, связанном с MyCustomPlugin.

Снимок экрана с script: введите описание изображения здесь

Когда я запускаю этот код:

void Update ()
    {
        var unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        unityPlayer.CallStatic ("UnitySendMessage", gameObject.name, "OnReward", "185");

        OnReward ("86"); 
    }

Я получаю два сообщения журнала:

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)
4b9b3361

Ответ 1

Похоже, основная проблема состоит в том, что, поскольку у меня есть отдельная деятельность, она приостанавливает UnityActivity, которая, в свою очередь, приостанавливает Unity.

Таким образом, Unity не может получить UnitySendMessage, когда я пытался его отправить.

Чтобы обойти это, я реализовал способ вызвать его в моем методе onStop моей активности. В этот момент Unity больше не приостанавливается и может получать сообщение.