2015-10-05 13 views
12

Bir android kütüphane projem var ve Unity projesinde kütüphane projesini içe aktardım. Şimdi, android kütüphane projesi tarafından verilen cevaba göre yürütülecek Birlik projesinde bir geri arama uygulamak istiyorum. UnityPlayerActivity'den (Android Project) Call Script File yöntemini söylemek istiyorum. Şu kod ama hiçbir şey sınırının altında kullanıyorum Unity içinde Callback Dinleyicisi - Android'de UnityPlayerActivity'den komut dosyası yöntemi nasıl çağrılır?

olur:

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

Main Camera benim Oyun Nesne olduğunu. showMessage, Komut Dosyası dosyasında mesaj adıdır. Message, Android Etkinliği aracılığıyla Unity'de görüntülenecek mesajdır.

Lütfen aşağıdaki kodumu Unity Script Dosyası ve Android Etkinliği'ne bakın.

Birlik Script Dosyası:

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

Herkes bana yardımcı olabilir bu konuda kurtulmak için?

+0

emin komut Ana Kamera ile ekli Make Java yöntemine (denir GameObject) C# arabirimini geçirin. ref http://answers.unity3d.com/questions/366452/call-a-unity-script-function-from-android-java-cod.html – Vivek

+0

evet vivek, halihazırda doğru şekilde eklenmiş. – user1986760

+0

Kişisel olarak Unity mesajlaşma sistemini beğenmedim, neden geri arama için bir arayüz kullanmıyorsunuz? –

cevap

3

Yalnızca ana iş parçacığından UnitySendMessage() numaralı telefonu aramanıza izin verildiğini unutmayın - en az bir senaryoda Android UI çalışanı iş parçacığından diyorsunuz.

Hızlı bir akıl testi olarak, shareText() işlevinin üst kısmında sağda aramadan önce deneyin.

7

Başka bir seçenek, AndroidJavaProxy kullanarak bir arabirim geri çağrısı uygulamak olacaktır. UnitySendMessage kullanmak yerine, java kodunuzda bir Arayüz geri çağırma işlemine sahip olabilirsiniz ve daha sonra bu arabirimi C# AndroidJavaProxy kullanarak gerçekleştirebilir ve geri iletileri almak için Java yöntemine iletebilirsiniz.

Java arayüzünü oluşturun:

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

Çağrı geçti dinleyici/geri arama iletileri

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

C# arabirimini uygular dönmek için

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); 
     } 
    } 

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