Android插件UnitySendMessage从未调用过

Tom*_*ond 12 c# android unity-game-engine

这是几个星期前的工作,但现在我注意到我的OnReward消息不再从我的自定义插件调用.

在我的rewardcenter.cs类中,我调用插件类将侦听器设置为此脚本附加到的gameObject(在此示例中为它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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在PluginClass.cs文件中,您可以看到我如何调用setUnityObjectNamejava插件类上的调用来将unity对象设置为传入的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);
            }));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Java插件类本身后来我们尝试调用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我最终得到Android Studio中的日志输出:

calling OnReward(202) on unityObject with name: GameObject
Run Code Online (Sandbox Code Playgroud)

但它似乎永远不会OnReward在游戏中实际调用.

只是为了踢,我尝试OnReward在脚本启动时调用,最终输出为:

OnReward: 85
Run Code Online (Sandbox Code Playgroud)

所以我知道它的工作原理并在执行时打印到控制台.

知道我哪里错了吗?奇怪的是,几周前这种OnReward方法有效,但现在方法没有执行.

编辑:

我也试过没有像这样的特定类声明运行它没有运气:

UnityPlayer.UnitySendMessage(PluginClass.getInstance()._unityObjectName, "OnReward", quantity);
Run Code Online (Sandbox Code Playgroud)

我也将我的gameObject重命名为MyCustomPlugin但是当android代码触发它时,似乎OnReward没有触发链接到的脚本的方法MyCustomPlugin.

脚本截图: 在此输入图像描述

当我运行此代码时:

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

        OnReward ("86"); 
    }
Run Code Online (Sandbox Code Playgroud)

我最终得到两条日志消息:

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)
Run Code Online (Sandbox Code Playgroud)

Tom*_*ond 2

看来根本问题在于,因为我有一个单独的活动,所以它暂停了 UnityActivity,而 UnityActivity 又暂停了 Unity。

因此,当我尝试发送 UnitySendMessage 时,Unity 无法接收它。

onStop为了解决这个问题,我实现了一种在Activity 的方法中调用它的方法。此时Unity不再暂停,可以接收消息。