gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:52:21 28 4
gpt4 key购买 nike

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

目前我正在使用以下代码行,但没有任何反应:

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

Main Camera 是我的游戏对象。 showMessage 是脚本文件中的消息名称。Message 是通过 Android Activity 显示在 Unity 中的消息。

请检查我下面的代码 Unity 脚本文件和 Android Activity。

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

谁能帮我解决这个问题?

最佳答案

另一种选择是使用 AndroidJavaProxy 实现接口(interface)回调。除了使用 UnitySendMessage,你可以简单地在你的 java 代码中有一个接口(interface)回调,然后在 C# 中使用 AndroidJavaProxy 实现这个接口(interface)。并将其传递给 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#实现接口(interface)

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# 接口(interface)传递给 Java 方法

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

关于java - Unity 中的回调监听器 - 如何从 Android 中的 UnityPlayerActivity 调用脚本文件方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944478/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com