用Unity3D开发需要把动画效果移植到现有的APP上面。Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序。而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的。试想下,人家既然能打包成APK安装包肯定是走了android-sdk的打包流程,有这流程我们自然能拿到源码(即便是反编译)。研究了一会儿,发现其实很简单,写了一个小DEMO放上来。所有操作如下

首先创建一个android工程,这个很简单就不详细说明了。然后打开Unity的安装目录,找到需要用的class.jar文件,就是封装调用unity引擎的java源码,位置在Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar(安装目录),然后复制这个文件到android工程的libs目录,系统会自动引用,adt22以下不记得会不会,如果不会的话需要自己设置一下,右键工程

添加这个文件即可。

然后把MainAtivity稍微改一下,就是把继承父类改成UnityPlayerActivity,这样就对接上了unity接口,源码如下:

  1. package com.lee.unityandroid;
  2.  
  3. import android.os.Bundle;
  4. import android.widget.RelativeLayout;
  5.  
  6. import com.unity3d.player.UnityPlayerActivity;
  7.  
  8. public class MainActivity extends UnityPlayerActivity {
  9.  
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. RelativeLayout layout = (RelativeLayout) findViewById(R.id.parent_layout);
  15. layout.addView(mUnityPlayer.getView());
  16. }
  17.  
  18. }

  

为了显明观察显示,布局稍微改动了一下。把这个显示在我们的视图上。

activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity" >
  6.  
  7. <RelativeLayout
  8. android:id="@+id/parent_layout"
  9. android:layout_width="300dp"
  10. android:layout_height="500dp"
  11. android:layout_centerInParent="true" >
  12. </RelativeLayout>
  13.  
  14. </RelativeLayout>

  

配置清单文件,这个里面的包名要用到后面Unity的

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.lee.unityandroid"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="10"
  9. android:targetSdkVersion="14" />
  10.  
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name="com.lee.unityandroid.MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21.  
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25. </application>
  26.  
  27. </manifest>

  

android基本上就完成了。现在创建一个Unity工程,名字啥的随便取,然后在菜单File->Build Settings->Android->Player Settings

最后生成的APK文件我们直接解压,把里面的assets目录下面的data目录复制到我们工程的assets目录下,然后把lib目录下的armeabi-v7a或armeabi一起复制(如果都有的话,只有其中一个就复制一个即可),最后编译我们的程序,运行效果如下:

白色是我们的布局容器,蓝色就是unity视图内容了。

下面继续说下在Unity中调用Andriod的函数,在Unity工程中创建一个C#脚本,直接将它绑定在摄像机中,它用来通知界面打开Activity。如下图所示,利用GUI在屏幕中创建两个按钮,点击按钮打开不同的Activity。

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class Test : MonoBehaviour
  5. {
  6.  
  7. // Update is called once per frame
  8. void Update ()
  9. {
  10. //当用户按下手机的返回键或home键退出游戏
  11. if (Input.GetKeyDown(KeyCode.Escape) ¦¦ Input.GetKeyDown(KeyCode.Home) )
  12. {
  13. Application.Quit();
  14. }
  15. }
  16.  
  17. void OnGUI()
  18. {
  19. if(GUILayout.Button("OPEN Activity01",GUILayout.Height(100)))
  20. {
  21. //注释1
  22. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  23. AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  24. jo.Call("Method01","第一个方法");
  25. }
  26. if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100)))
  27. {
  28. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  29. AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  30. jo.Call("Method02","第二个方法");
  31. }
  32. }
  33.  
  34. }

  

以上代码就是Java里面的反射机制。

Unity3D移植到自己的Android程序的更多相关文章

  1. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)

    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...

  2. unity3d发布Android程序

    unity3d是一个跨平台的游戏开发引擎,可以使用c#开发各种平台上的游戏,如windows,Mac,Android,windows phone,IOS,Flash等.下面说下如何将开发好的unity ...

  3. Android程序的安全系统【转】

    最近在移植Android过程中遇到了Android程序(apk)权限的问题.最近也对这方面进行了一些了解,在此和大家分享. Android框架是基于Linux内核构建,所以Android安全系统也是基 ...

  4. 用C++语言开发Android程序 配置开发环境

    转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境   如果你是一个C++语言的死忠,你喜欢C++语言到 ...

  5. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  6. Android程序分析环境(搭建步骤略)

    1:安装JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).没有JDK的话,无法编译Java程序. 2:安装Android  SDK Androi ...

  7. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  8. 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法

    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...

  9. 怎么让我们自己开发的Android程序设为默认启动

    怎么让我们自己开发的Android程序设为默认启动呢?其实很简单,只要在AndroidManifest.xml文件中配置一下首次启动的那个Activity即要. <activity        ...

随机推荐

  1. SQL函数:字符串中提取数字,英文,中文,过滤重复字符(转)

    --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NUMBER2 GO )) ) AS BEGIN BE ...

  2. mvc+ef5+easyui实例(1)

    mvc+ef5+easyui 组织机构和员工管理实例 环境:vs2010+sql2008 框架搭建 1,新建mvc4 web应用 2. 3. 系统自动生成的的controllers,和views文件中 ...

  3. unity3d实现Socket

    首先创建一个服务器 using UnityEngine; using System.Collections; using System.Net.Sockets; using System.Net; u ...

  4. spring 源码之IOC 类图

    Spring IoC容器是spring框架的核心和基础,IoC容器负责spring Bean的生命周期,是spring框架实现其他扩展功能的基础.容器的继承结构比较复杂,这里画出了spring IoC ...

  5. Zend Studio错误总结

    1.在升级了wampserver之后,用zendstudio发现很多地方都出错了,这时候一般先要project-clean一下,然后到run 和 debug的configuration里面把除了stu ...

  6. cookie程序设计举例

    编写Cookie应用程序,一般流程是:首先尝试获取某个Cookie变量,如果有,则表明是老客户,读取其cookie信息,为其提供服务. 如果没有,则表明是第一次来访的客户,通过表单提交获取其身份信息, ...

  7. Arduino当avr开发板

    原理并不复杂,因为arduino本来就是avr+一堆的库,找个能编译出hex的工具下载到板子就行. 但实际做起来还是碰到很多问题. 先是尝试eclipse+avr plugin 编译时出现make: ...

  8. UDP聊天实现(简单版)

    两者代码基本一致 关于套接字: 甲方: #include <stdio.h> #include <string.h> #include <netinet/in.h> ...

  9. Umbraco安装权限问题

    当安装或升级,甚至是使用Umbraco时,如果出现一些莫名其妙的问题. 估计都是权限出了问题,用心参考下文: https://our.umbraco.org/documentation/Getting ...

  10. 用Ultraiso刻录U盘装系统

    一.准备工作: 1.一个U盘,也可以是手机或数码相机内存卡通过读卡器与电脑连接: 2.一个系统ISO镜像: 3.刻录软件UltraISO,用单文件绿色版就可以了. 二.开始刻录U盘: 1.启动Ultr ...