gpt4 book ai didi

c# - Android 插件 UnitySendMessage 从未被调用

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:03 26 4
gpt4 key购买 nike

这在几周前是有效的,但现在我注意到我的 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);
}
}

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

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

脚本截图: enter image description here

当我运行这段代码时:

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)

最佳答案

看来根本问题是因为我有一个单独的 Activity ,它暂停了 UnityActivity,而 UnityActivity 又暂停了 Unity。

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

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

关于c# - Android 插件 UnitySendMessage 从未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43313111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com