本帖最后由 夜行的猫仔 于 2015-1-28 10:46 编辑
unity在开发android项目过程中,通常会用到一些第三方的库来实现特殊的功能,但是如果你的项目中有多个别人写好的android插件,这时候该如何很好的处理各个插件之间的调用关系? 请往下看 下面我们来模拟一下这个场景 上图eclipse有两个工程plugins1和piugins2,都可以作为unity的插件来调用(具体单个插件制作请访问:),现在要把这两个插件合并在plugins1工程中,主要步骤如下: 1.先把对应的java类放在一起 2.合并res中资源文件,如果有重名的要改一下资源名 3.把plugins2中AndroidManifest.xml文件中定义的activity全部迁移到plugins的配置文件中,一定要记得把plugins2中的标记为主启动的activity标签去掉,如下: 上面步骤完成以后,下面就来写一个全局控制的类,NativeUtils.java [mw_shl_code=java,true]package com.example.utils;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.widget.Toast;
import com.dillon.plugins2.DownloadActivity;
import com.example.plugins1.LoginActivity;
import com.example.plugins1.RegisterActivity;
import com.unity3d.player.UnityPlayer;
public class NativeUtils {
public static void showDialog(){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(UnityPlayer.currentActivity);
builder.setTitle("title");
builder.setMessage("这个是弹出框");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(UnityPlayer.currentActivity, "show dialog", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
});
}
public static void goLogin(){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(UnityPlayer.currentActivity, LoginActivity.class);
UnityPlayer.currentActivity.startActivity(intent);
}
});
}
public static void goRegister(){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(UnityPlayer.currentActivity, RegisterActivity.class);
UnityPlayer.currentActivity.startActivity(intent);
}
});
}
public static void goPlugins2(){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(UnityPlayer.currentActivity, DownloadActivity.class);
UnityPlayer.currentActivity.startActivity(intent);
}
});
}
}[/mw_shl_code]
上面代码每一次执行都需要通过UnityPlayer.currentActivity来获取当前在最上层活跃的activity,用这个activity的runOnUiThread方法运行ui线程,执行对应的方法。 把java文件打包、资源文件和配置文件打包丢进unity中就可以调用执行了,具体调用方法如下: [mw_shl_code=csharp,true]using UnityEngine;
using System.Collections;
public class test : MonoBehaviour {
AndroidJavaClass jc;
void Start ()
{
jc = new AndroidJavaClass("com.example.utils.NativeUtils");
}
void OnGUI(){
if(GUILayout.Button("plugins 1",GUILayout.Width(200),GUILayout.Height(100))){
jc.CallStatic("showDialog");
}
if(GUILayout.Button("login",GUILayout.Width(200),GUILayout.Height(100))){
jc.CallStatic("goLogin");
}
if(GUILayout.Button("register",GUILayout.Width(200),GUILayout.Height(100))){
jc.CallStatic("goRegister");
}
if(GUILayout.Button("call plugins2",GUILayout.Width(200),GUILayout.Height(100))){
jc.CallStatic("goPlugins2");
}
}
}[/mw_shl_code]
在这里只需要得到工具类对象NativeUtils就可以其他任何插件了。。。
|