用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接口,源码如下:

package com.lee.unityandroid;

import android.os.Bundle;
import android.widget.RelativeLayout; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.parent_layout);
layout.addView(mUnityPlayer.getView());
} }

  

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

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <RelativeLayout
android:id="@+id/parent_layout"
android:layout_width="300dp"
android:layout_height="500dp"
android:layout_centerInParent="true" >
</RelativeLayout> </RelativeLayout>

  

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lee.unityandroid"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="14" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.lee.unityandroid.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </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。

using UnityEngine;
using System.Collections; public class Test : MonoBehaviour
{ // Update is called once per frame
void Update ()
{
//当用户按下手机的返回键或home键退出游戏
if (Input.GetKeyDown(KeyCode.Escape) ¦¦ Input.GetKeyDown(KeyCode.Home) )
{
Application.Quit();
}
} void OnGUI()
{
if(GUILayout.Button("OPEN Activity01",GUILayout.Height(100)))
{
//注释1
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("Method01","第一个方法");
}
if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100)))
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("Method02","第二个方法");
}
} }

  

以上代码就是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. java.lang.NoClassDefFoundError: Could not initialize class net.sf.json.util.JSONUtils

    页面报错: root: java.lang.NoClassDefFoundError: Could not initialize class net.sf.json.util.JSONUtils 出错 ...

  2. C#:读取配置文件

    以下代码演示如何读取配置文件---------------------Factory.cs----------------------------using System;using System.C ...

  3. C#:判断一个String是否为数字

    方案一:Try...Catch(执行效率不高)private bool IsNumberic(string oText){          try         {                 ...

  4. ajax防止重复提交请求1

    ajax防止重复提交请求 A. 独占型提交 只允许同时存在一次提交操作,并且直到本次提交完成才能进行下一次提交. module.submit = function() {   if (this.pro ...

  5. Eclipse --Type /com.xx.app/gen already exists but is not a source folde解决方案

    两种解决方案: Two actions, first: 1.Right click on the project and go to "Properties" 2.Select & ...

  6. spoj TSUM - Triple Sums fft+容斥

    题目链接 首先忽略 i < j < k这个条件.那么我们构造多项式$$A(x) = \sum_{1现在我们考虑容斥:1. $ (\sum_{}x)^3 = \sum_{}x^3 + 3\s ...

  7. Glib程序使用Valgrind查找内存泄露

    G_DEBUG=gc-friendly G_SLICE=always-malloc     //glib有缓存  故需使用 上述两条设置环境变量 G_SLICE和G_DEBUG排除由内存分配机制带来的 ...

  8. IE WebDriver 因保护模式无法启动的解决 (转载)

    现在Win7 已经应用很多了,即使是最原始的Win7 也是IE8,最新的patch后,都升到了IE11 Win7下预装高版本IE的情况下,启动IE WebDriver可能会出现: org.openqa ...

  9. Oracle EBS-SQL (GL-3):从总帐追溯到发票

    SELECT je_header_id, je_line_num, trx_class_name, trx_type_name, trx_number_displayed, trx_date,comm ...

  10. JAVA中的break[标签]continue[标签]用法

    原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...