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)
Ответы
Ответ 1
Похоже, основная проблема состоит в том, что, поскольку у меня есть отдельная деятельность, она приостанавливает UnityActivity, которая, в свою очередь, приостанавливает Unity.
Таким образом, Unity не может получить UnitySendMessage, когда я пытался его отправить.
Чтобы обойти это, я реализовал способ вызвать его в моем методе onStop
моей активности. В этот момент Unity больше не приостанавливается и может получать сообщение.