【问题标题】:Android Plugin UnitySendMessage Never CalledAndroid 插件 UnitySendMessage 从未调用过
【发布时间】:2017-04-09 23:48:46
【问题描述】:

这在几周前还有效,但现在我注意到我的 OnReward 消息不再从我的自定义插件中调用。

在我的rewardcenter.cs 类中,我调用插件类将侦听器设置为该脚本附加到的游戏对象(在本例中为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 文件中,您可以看到我如何调用 java 插件类上的 setUnityObjectName 调用以将统一对象设置为传入的 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 本身中,我们尝试在我们的游戏对象上使用 UnitySendMessage 调用 OnReward

   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,结果输出如下:

OnReward: 85

所以我知道它可以工作并在执行时打印到控制台。

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

编辑:

我也尝试在没有像这样的特定类声明的情况下运行它,但没有运气:

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

我还将我的游戏对象重命名为 MyCustomPlugin,但是当 android 代码触发时,似乎没有在链接到 MyCustomPlugin 的脚本上触发 OnReward 方法。

脚本截图:

当我运行这段代码时:

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)

【问题讨论】:

  • GameOjbect 是否存在?也许你重命名了它......你可以通过在TheoremReach.getInstance()._unityObjectName 上使用Log.d 来验证。在 Unity 端,使用 GameObject.Find 验证您发送的这个 GameOjbect 事件是否确实存在。
  • 是的,它们都存在。当我在 Unity 端执行此操作时,我得到 GameObject 作为名称,而当我在 Android 中使用 Log.d 时,我得到相同的字符串。好检查!
  • 您在游戏中是否拥有超过 1 个同名的“GameObject”对象?我觉得你的名字太常见了,你有没有试过把你的对象重命名为“MyCustomPlugin”之类的东西
  • 好主意。我将它重命名为 MyCustomPlugin 并得到了 calling OnReward(101) on unityObject with name: MyCustomPlugin 但实际的 OnReward 调用没有进行。我还验证了它是 Unity 端的正确游戏对象 :(
  • 在记录时,您使用的是 PluginClass.getInstance()._unityObjectName,当您实际调用该函数时,您使用的是上述示例中的 TheoremReach.getInstance()._unityObjectName。可能是一个错字,但只是以防万一?

标签: c# android unity3d


【解决方案1】:

似乎根本问题在于,因为我有一个单独的活动,它暂停了 UnityActivity,这反过来又暂停了 Unity。

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

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

【讨论】:

  • Unity跳转到另一个activity可能不是什么东西,我会尽量避免跳转activity,也许扩展unityplayeractivity并在里面做事。
  • unityplayer暂停后AndroidJavaProxy还能工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2012-08-30
相关资源
最近更新 更多