Intereting Posts
Активность Android Бинарная строка XML-файла: вы должны указать атрибут layout_width Сервер разработки вернул код ошибки ответа: 500 в ответном нативном Ошибка NewFromFD в nativeDecodeFileDescriptor – Android 4.4 Есть ли способ обнаружить слово, нажатое в EditText Как выполнить резервное копирование Realm DB в Android перед удалением файла Realm. Есть ли способ восстановить файл резервной копии? Голо быстрый просмотр прокрутки на старых устройствах Как мы можем удалить динамически добавленные фрагменты из макета Внедрение вкладок ActionBar с API-интерфейсов v4 При запуске не выводится команда: 'am start -n Будет ли TIME_TICK транслироваться в глубоком сне? Неявное «Отправить» после нажатия «Готово» на клавиатуре в последнем EditText Загрузите простой текстовый файл в Android Studio Как решить StringIndexOutOfBoundsException в android Остановить EditText от получения фокуса при запуске Activity Android Geofence работает только с открытым приложением

Callback Listener в Unity – как вызвать метод файла скриптов из UnityPlayerActivity в Android

У меня есть проект библиотеки андроидов и импортирован проект библиотеки в проект Unity. Теперь я хочу реализовать обратный вызов в проекте Unity, который будет выполняться в соответствии с ответом, данным проектом библиотеки Android. Я хочу сказать, что метод Call Script File из UnityPlayerActivity (Android Project).

В настоящее время я использую строку ниже кода, но ничего не происходит:

UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); 

Main Camera – это мой игровой объект. showMessage – это имя сообщения в файле сценария. Message – это сообщение, которое будет отображаться в Unity через Android Activity.

Пожалуйста, проверьте мой ниже код Unity Script File и Android Activity.

Файл сценария Unity:

 using UnityEngine; using System.Collections; public class scriptfile : MonoBehaviour { // Use this for initialization void Start () { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); jo.Call("shareText","236","236"); } void showMessage(string message){ print ("hello"); Debug.Log ("hello"); } } 

Android File UnityPlayerActivity:

 /** * Created by CH-E01073 on 28-09-2015. */ public class MainAct extends UnityPlayerActivity implements RegistrationListener,BOffersListener { Context context; SharedPreferences prefs ; String AppIds=""; String PublisherIDs=""; public void shareText(String AppId,String PublisherID) { context=MainAct.this; prefs = PreferenceManager .getDefaultSharedPreferences(context); Log.e("AppID", AppId); Log.e("PublisherID",PublisherID); AppIds=AppId; PublisherIDs=PublisherID; runOnUiThread(new Runnable() { @Override public void run() { UnityPlayer.UnitySendMessage("Main Camera","showMessage","Start UI Thread"); if (prefs.getString(FreeBConstants.ID, null) == null || prefs.getString(FreeBConstants.ID, null).equals("") || !Build.VERSION.RELEASE.equals(prefs.getString( FreeBConstants.VERSION, null)) || !FreeBCommonUtility.getDeviceId(context).equals( (prefs.getString(FreeBConstants.DEVICE_ID, null)))) { BSDKLogger.enableLogging(true); SDKRegistration.initialize(MainAct.this, getApplicationContext(), AppIds,PublisherIDs); }else{ Offers Offers = new Offers(MainAct.this); Offers.setOnFreeBOffersListener(MainAct.this); Offers.setTitle( "Pick Any Offer to unlock your premium features", "#FFFFFF", "#FF6D00"); } } }); } @Override public void onOffersLoaded(String code,String freeBOffers) { CommonUtility.showToast(getApplicationContext(), code); UnityPlayer.UnitySendMessage("Main Camera","showMessage",freeBOffers); } @Override public void onShowOffers() { UnityPlayer.UnitySendMessage("Main Camera","showMessage","Show Offers"); } @Override public void noOfferInstalled(String s, String s2) { } @Override public void onLeaveApplication(String s, String s2) { } @Override public void onDialogDismiss(String s) { } @Override public void onOffersFailed(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); } @Override public void onOffersInstallSuccess(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); } @Override public void onOffersInstallFailure(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); } @Override public void onRegistrationFailed(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); } @Override public void onRegistrationSuccess(String code, String errorMessage) { // FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); Log.e("SUCCESS", errorMessage); // TODO Auto-generated method stub UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); Offers Offers = new Offers(MainAct.this); Offers.setOnFreeBOffersListener(MainAct.this); Offers.setTitle( "Pick Any Offer to unlock your premium features", "#FFFFFF", "#FF6D00"); } } этот /** * Created by CH-E01073 on 28-09-2015. */ public class MainAct extends UnityPlayerActivity implements RegistrationListener,BOffersListener { Context context; SharedPreferences prefs ; String AppIds=""; String PublisherIDs=""; public void shareText(String AppId,String PublisherID) { context=MainAct.this; prefs = PreferenceManager .getDefaultSharedPreferences(context); Log.e("AppID", AppId); Log.e("PublisherID",PublisherID); AppIds=AppId; PublisherIDs=PublisherID; runOnUiThread(new Runnable() { @Override public void run() { UnityPlayer.UnitySendMessage("Main Camera","showMessage","Start UI Thread"); if (prefs.getString(FreeBConstants.ID, null) == null || prefs.getString(FreeBConstants.ID, null).equals("") || !Build.VERSION.RELEASE.equals(prefs.getString( FreeBConstants.VERSION, null)) || !FreeBCommonUtility.getDeviceId(context).equals( (prefs.getString(FreeBConstants.DEVICE_ID, null)))) { BSDKLogger.enableLogging(true); SDKRegistration.initialize(MainAct.this, getApplicationContext(), AppIds,PublisherIDs); }else{ Offers Offers = new Offers(MainAct.this); Offers.setOnFreeBOffersListener(MainAct.this); Offers.setTitle( "Pick Any Offer to unlock your premium features", "#FFFFFF", "#FF6D00"); } } }); } @Override public void onOffersLoaded(String code,String freeBOffers) { CommonUtility.showToast(getApplicationContext(), code); UnityPlayer.UnitySendMessage("Main Camera","showMessage",freeBOffers); } @Override public void onShowOffers() { UnityPlayer.UnitySendMessage("Main Camera","showMessage","Show Offers"); } @Override public void noOfferInstalled(String s, String s2) { } @Override public void onLeaveApplication(String s, String s2) { } @Override public void onDialogDismiss(String s) { } @Override public void onOffersFailed(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); } @Override public void onOffersInstallSuccess(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); } @Override public void onOffersInstallFailure(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); } @Override public void onRegistrationFailed(String code, String errorMessage) { FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); } @Override public void onRegistrationSuccess(String code, String errorMessage) { // FreeBCommonUtility.showToast(getApplicationContext(), errorMessage); Log.e("SUCCESS", errorMessage); // TODO Auto-generated method stub UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage); Offers Offers = new Offers(MainAct.this); Offers.setOnFreeBOffersListener(MainAct.this); Offers.setTitle( "Pick Any Offer to unlock your premium features", "#FFFFFF", "#FF6D00"); } } 

Может ли кто-нибудь помочь мне избавиться от этой проблемы?

Solutions Collecting From Web of "Callback Listener в Unity – как вызвать метод файла скриптов из UnityPlayerActivity в Android"

Другим вариантом будет реализация обратного вызова интерфейса с помощью AndroidJavaProxy . Вместо использования UnitySendMessage вы можете просто получить обратный вызов интерфейса в своем Java-коде, а затем реализовать этот интерфейс на C # с помощью AndroidJavaProxy и передать его методу Java для получения сообщений.

Создайте свой интерфейс Java:

 package com.example.android; public interface PluginCallback { public void onSuccess(String videoPath); public void onError(String errorMessage); } 

Вызовите переданный прослушиватель / обратный вызов для возврата сообщений

 public void myPluginMethod(PluginCallback callback) { // Do something callback.onSuccess("onSuccess"); // Do something horrible callback.onError("onError"); } 

Внедрить интерфейс в C #

 class AndroidPluginCallback : AndroidJavaProxy { public AndroidPluginCallback() : base("com.example.android.PluginCallback") { } public void onSuccess(string videoPath) { Debug.Log("ENTER callback onSuccess: " + videoPath); } public void onError(string errorMessage) { Debug.Log("ENTER callback onError: " + errorMessage); } } 

Передайте интерфейс C # методу Java

 AndroidJavaObject pluginClass = new AndroidJavObject("com.example.android.MyPlugin"); pluginClass.Call("myPluginMethod", new AndroidPluginCallback()); 

Я считаю, что вам разрешено вызывать UnitySendMessage () из основного потока – по крайней мере, в одном сценарии выше вы вызываете его из рабочего потока пользовательского интерфейса Android.

В качестве теста быстрого здравомыслия попробуйте вызвать его перед тем, как вы вернетесь в свою функцию shareText () .