简体   繁体   English

Unity中的回调监听器 - 如何从Android中的UnityPlayerActivity调用脚本文件方法

[英]Callback Listener in Unity - How to call script file method from UnityPlayerActivity in Android

I have an android library project and imported the library project in the Unity project. 我有一个android库项目并在Unity项目中导入了库项目。 Now, I want to implement a callback in Unity project, which will execute according to the response given by the android library project. 现在,我想在Unity项目中实现一个回调,它将根据android库项目给出的响应执行。 I mean to say, Call Script File method from UnityPlayerActivity (Android Project). 我的意思是说,来自UnityPlayerActivity(Android Project)的Call Script File方法。

Currently I am using below line of code but nothing happens: 目前我使用下面的代码行但没有任何反应:

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

Main Camera is my Game Object. Main Camera是我的游戏对象。 showMessage is message name in Script File. showMessage是脚本文件中的消息名称。 Message is message which will be displayed in Unity through Android Activity. Message是将通过Android Activity在Unity中显示的消息。

Please check my below code Unity Script File and Android Activity. 请检查我的下面代码Unity Script File和Android Activity。

Unity Script File: 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: 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");
    }
}

Can anyone help me to get rid of this issue? 任何人都可以帮我摆脱这个问题吗?

Another option will be to implement an interface callback using AndroidJavaProxy . 另一个选择是使用AndroidJavaProxy实现接口回调。 Instead of using UnitySendMessage, you can simply have an Interface callback in your java code and then implement this interface in C# using AndroidJavaProxy and pass it to the Java method in order to receive messages back. 您可以在Java代码中简单地使用Unity回调,然后在C#中使用AndroidJavaProxy实现此接口,并将其传递给Java方法以便接收消息,而不是使用UnitySendMessage

Create your Java interface: 创建Java接口:

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

Call the passed listener/callback to return messages 调用传递的侦听器/回调以返回消息

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

Implement the interface in C# 在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);
        }
    }

Pass the C# interface to the Java method 将C#接口传递给Java方法

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

I believe you are only allowed to call UnitySendMessage() from the main thread - at least in one scenario above you are calling it from the Android UI worker thread. 我相信你只能从主线程中调用UnitySendMessage() - 至少在上面的一个场景中你是从Android UI工作线程调用它。

As a quick sanity test, try calling it before you right at the top of your shareText() function. 作为一个快速的健全性测试,请尝试在您的shareText()函数顶部之前调用它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM