2015-10-05 24 views
12

私はアンドロイドライブラリプロジェクトを持っており、Unityプロジェクトにライブラリプロジェクトをインポートしました。今、私はUnityプロジェクトでアンドロイドライブラリプロジェクトによって与えられた応答に従って実行されるコールバックを実装したいと思います。私は、UnityPlayerActivity(Android Project)のScript File Methodを呼び出していると言っています。Unityのコールバックリスナー - AndroidのUnityPlayerActivityからスクリプトファイルメソッドを呼び出す方法

現在、私はコードの行の下に使用していますが、何も起こりません:

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

Main Cameraは私のゲームオブジェクトです。 showMessageは、スクリプトファイルのメッセージ名です。 Messageは、Androidアクティビティを通じてUnityに表示されるメッセージです。

私の下のコードUnity Script Fileと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

をC#のインターフェイスを渡します。 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()をメインスレッドから呼び出すことが許可されていると信じています。上記の少なくとも1つのシナリオでは、Android UIワーカースレッドから呼び出しています。

クイックサニティテストでは、shareText()機能の先頭に移動する前に、電話をかけてみてください。

7

もう1つの方法は、AndroidJavaProxyを使用してインターフェイスコールバックを実装することです。 UnitySendMessageを使用する代わりに、JavaコードにInterfaceコールバックを設定してから、このインターフェイスを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); 
     } 
    } 

スクリプトは、メインカメラ(と呼ばれるゲームオブジェクト)を添付していることを確認したJavaメソッドに

AndroidJavaObject pluginClass = new  AndroidJavObject("com.example.android.MyPlugin"); 
pluginClass.Call("myPluginMethod", new AndroidPluginCallback()); 
関連する問題