C# Android插件UnitySendMessage从未调用
这在几周前还有效,但现在我注意到我的自定义插件不再调用我的C# Android插件UnitySendMessage从未调用,c#,android,unity3d,C#,Android,Unity3d,这在几周前还有效,但现在我注意到我的自定义插件不再调用我的OnReward消息 在我的rewardcenter.cs类中,我调用plugin类将侦听器设置为该脚本所连接的游戏对象(在本例中为gameObject): 在PluginClass.cs文件中,您可以看到我如何调用java插件类上的setUnityObjectName调用,将unity对象设置为传入的GameObject的名称字符串GameObject: public class rewardcenter : MonoBehaviour
OnReward
消息
在我的rewardcenter.cs类中,我调用plugin类将侦听器设置为该脚本所连接的游戏对象(在本例中为gameObject
):
在PluginClass.cs文件中,您可以看到我如何调用java插件类上的setUnityObjectName
调用,将unity对象设置为传入的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);
}
}
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);
}));
}
}
}
我最终在Android Studio中获得了以下日志输出:
calling OnReward(202) on unityObject with name: GameObject
但它似乎从未在游戏中真正调用奖励
为了好玩,我试着在脚本启动时调用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)
看起来根本的问题是,因为我有一个单独的活动,它暂停了UnityActivity,而UnityActivity反过来又暂停了Unity 因此,当我试图发送UnitySendMessage时,Unity无法接收它
为了解决这个问题,我在活动的
onStop
方法中实现了一种调用它的方法。此时Unity不再暂停,可以接收消息。GameOjbect是否存在?也许你把它改名了。。。。您可以使用TheoremReach.getInstance()。\u unityObjectName
上的Log.d
进行验证。在Unity端,使用GameObject.Find
来验证您发送的事件是否确实存在。是的,它们都存在。当我在Unity端执行此操作时,我会得到GameObject
作为名称,当我在Android中执行Log.d
时,我会得到相同的字符串。好的支票!游戏中是否有多个同名的“GameObject”对象?我觉得你的名字太普通了,你有没有试过把你的对象重命名为“MyCustomPlugin”之类的名字?好主意。我将其重命名为MyCustomPlugin,并在名为MyCustomPlugin的unityObject上调用了OnReward(101),但实际的OnReward
调用没有进行。我还验证了它在Unity端是正确的游戏对象:(当您登录时,您使用的是PluginClass.getInstance()。_unityObjectName,当您实际调用函数时,您使用的是TheoremReach.getInstance()).以上示例中的unityObjectName。可能是一个输入错误,但以防万一?Unity跳转到另一个活动可能不是什么好事,我会尽量避免跳转活动,可能会扩展UnityPlayerPractivity并在里面做事情。
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)