2015-10-05 11 views
12

Tôi có một dự án thư viện android và đã nhập dự án thư viện vào dự án Unity. Bây giờ, tôi muốn thực hiện một cuộc gọi lại trong dự án Unity, mà sẽ thực hiện theo phản ứng được đưa ra bởi dự án thư viện android. Tôi có nghĩa là để nói, Call Script File phương pháp từ UnityPlayerActivity (Android dự án).Trình nghe gọi lại trong Unity - Cách gọi phương thức tệp kịch bản từ UnityPlayerActivity trong Android

Hiện nay tôi đang sử dụng bên dưới dòng mã nhưng không có gì xảy ra:

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

Main Camera là trò chơi đối tượng của tôi. showMessage là tên thông báo trong Tệp Tập lệnh. Message là thông báo sẽ được hiển thị trong Unity thông qua Hoạt động Android.

Vui lòng kiểm tra mã dưới đây của tôi Tệp Unity Script và Hoạt động Android.

Unity Script File:

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

tệp của 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"); 
    } 
} 

bất cứ ai có thể giúp tôi để thoát khỏi vấn đề này?

+0

Hãy chắc chắn rằng kịch bản của bạn gắn liền với camera chính (Gameobject được gọi). xem ref http://answers.unity3d.com/questions/366452/call-a-unity-script-function-from-android-java-cod.html – Vivek

+0

vivek có, đã được đính kèm chính xác. – user1986760

+0

Cá nhân tôi không thích hệ thống nhắn tin Unity, tại sao không sử dụng giao diện để gọi lại? –

Trả lời

3

Tôi tin rằng bạn chỉ được phép gọi UnitySendMessage() từ chủ đề chính - ít nhất trong một kịch bản ở trên bạn đang gọi nó từ chuỗi công nhân UI Android.

Làm bài kiểm tra sự tỉnh táo nhanh, hãy thử gọi nó trước khi bạn ở ngay trên đầu chức năng shareText() của bạn.

7

Tùy chọn khác sẽ là triển khai gọi lại giao diện bằng cách sử dụng AndroidJavaProxy. Thay vì sử dụng UnitySendMessage, bạn có thể chỉ cần gọi lại giao diện trong mã java của bạn và sau đó triển khai giao diện này trong C# bằng cách sử dụng AndroidJavaProxy và chuyển nó sang phương thức Java để nhận lại các thông báo.

Tạo giao diện Java của bạn:

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

Gọi người nghe thông qua/callback để trở lại thông điệp

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

Thực hiện giao diện trong 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); 
     } 
    } 

Vượt qua giao diện C# với phương pháp Java

AndroidJavaObject pluginClass = new  AndroidJavObject("com.example.android.MyPlugin"); 
pluginClass.Call("myPluginMethod", new AndroidPluginCallback()); 
Các vấn đề liên quan