首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一中的回调监听器-如何在Android中从UnityPlayerActivity调用脚本文件方法

问统一中的回调监听器-如何在Android中从UnityPlayerActivity调用脚本文件方法
EN

Stack Overflow用户
提问于 2015-10-05 08:47:02
回答 2查看 16.1K关注 0票数 28

我有一个android库项目,并在Unity中导入了这个库项目。现在,我想在Unity中实现一个回调,它将根据android库项目的响应执行。我的意思是,从UnityPlayerActivity (Android )调用脚本文件方法。

目前,我正在使用下面的代码行,但是什么也没有发生:

代码语言:javascript
复制
UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage);

Main Camera是我的游戏对象。showMessage是脚本文件中的消息名。Message是消息,它将通过Android活动在团结中显示。

请检查我下面的代码统一脚本文件和Android活动。

统一脚本文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
/**
 * 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");
    }
}

有人能帮我解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-12-07 12:53:53

另一种选择是使用AndroidJavaProxy.实现接口回调。与使用UnitySendMessage不同,您可以简单地在java代码中使用接口回调,然后在C#中使用AndroidJavaProxy实现这个接口,并将其传递给Java方法,以便接收回消息。

创建Java接口:

代码语言:javascript
复制
package com.example.android;
public interface PluginCallback {
    public void onSuccess(String videoPath);
    public void onError(String errorMessage);
}

调用传递的侦听器/回调以返回消息

代码语言:javascript
复制
public void myPluginMethod(PluginCallback callback) {
    // Do something
    callback.onSuccess("onSuccess");
    // Do something horrible
    callback.onError("onError");
}

在C#中实现接口

代码语言:javascript
复制
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#接口传递给方法

代码语言:javascript
复制
AndroidJavaObject pluginClass = new     AndroidJavaObject("com.example.android.MyPlugin");
pluginClass.Call("myPluginMethod", new AndroidPluginCallback());
票数 48
EN

Stack Overflow用户

发布于 2015-10-12 06:25:33

我相信您只能从主线程调用UnitySendMessage() --至少在上面的一个场景中,您是从Android工作线程调用它的。

作为一个快速的正常测试,尝试在shareText()函数顶部之前调用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32944478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档