use*_*760 20 c# java java-native-interface android unity-game-engine
我有一个android库项目并在Unity项目中导入了库项目.现在,我想在Unity项目中实现一个回调,它将根据android库项目给出的响应执行.我的意思是说,来自UnityPlayerActivity(Android Project)的Call Script File方法.
目前我使用下面的代码行但没有任何反应:
UnityPlayer.UnitySendMessage("Main Camera","showMessage",errorMessage);
Run Code Online (Sandbox Code Playgroud)
Main Camera
是我的游戏对象.showMessage
是脚本文件中的消息名称.
Message
是通过Android Activity在Unity中显示的消息.
请检查我的下面代码Unity Script File和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");
}
}
Run Code Online (Sandbox Code Playgroud)
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");
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我摆脱这个问题吗?
vel*_*val 26
另一个选择是使用AndroidJavaProxy实现接口回调.您可以在Java代码中简单地使用Unity回调,然后在C#中使用AndroidJavaProxy实现此接口,并将其传递给Java方法以便接收消息,而不是使用UnitySendMessage.
创建Java接口:
package com.example.android;
public interface PluginCallback {
public void onSuccess(String videoPath);
public void onError(String errorMessage);
}
Run Code Online (Sandbox Code Playgroud)
调用传递的侦听器/回调以返回消息
public void myPluginMethod(PluginCallback callback) {
// Do something
callback.onSuccess("onSuccess");
// Do something horrible
callback.onError("onError");
}
Run Code Online (Sandbox Code Playgroud)
在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);
}
}
Run Code Online (Sandbox Code Playgroud)
将C#接口传递给Java方法
AndroidJavaObject pluginClass = new AndroidJavaObject("com.example.android.MyPlugin");
pluginClass.Call("myPluginMethod", new AndroidPluginCallback());
Run Code Online (Sandbox Code Playgroud)
我相信您只能从主线程调用UnitySendMessage() - 至少在上面的一种情况下您是从 Android UI 工作线程调用它。
作为一个快速的健全性测试,请尝试在shareText()函数的顶部之前调用它。
归档时间: |
|
查看次数: |
9182 次 |
最近记录: |