【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4148|回复: 3

[第三方平台插件] unity中android多个插件共存 – unity3d游戏开发

[复制链接]
发表于 2015-1-28 10:41:03 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 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就可以其他任何插件了。。。

发表于 2015-1-30 13:26:11 | 显示全部楼层
{:soso_e192:}
发表于 2015-1-30 22:03:29 | 显示全部楼层
简直不能再好啦!
发表于 2015-2-2 22:51:11 | 显示全部楼层
专业灌水!!!品质保证!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 15:52

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表