标签:
用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里面的反射机制。
标签:
原文地址:http://www.cnblogs.com/spring87/p/4525394.html