2015-10-05 89 views
12

我有一個android庫項目並在Unity項目中導入了庫項目。現在,我想在Unity項目中實現一個回調,它將根據android庫項目給出的響應執行。我的意思是說,從UnityPlayerActivity(Android項目)調用腳本文件方法。Unity中的回調監聽器 - 如何從Android中的UnityPlayerActivity調用腳本文件方法

目前我使用下面的代碼,但沒有發生行:

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

Main Camera是我的遊戲對象。 showMessage是腳本文件中的消息名稱。 Message是將通過Android活動在Unity中顯示的消息。

請檢查我的下面的代碼Unity腳本文件和Android活動。

統一腳本文件:

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文件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"); 
    } 
} 

誰能幫助我擺脫這個問題的?

+0

確保連接與主要的相機腳本(遊戲物體被稱爲)。見ref http://answers.unity3d.com/questions/366452/call-a-unity-script-function-from-android-java-cod.html – Vivek

+0

是的vivek,它已經正確連接。 – user1986760

+0

我個人不喜歡Unity消息系統,爲什麼不使用接口進行回調? –

回答

3

我相信你只能從主線程調用UnitySendMessage() - 至少在你從Android UI工作線程調用它的上面的一個場景中。

作爲一種快速完整性測試,請嘗試在您的shareText()函數頂部之前調用它。

7

另一種選擇是使用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()); 
相關問題