首先创建一个android工程,这个很简单就不详细说明了。然后打开Unity的安装目录,找到需要用的class.jar文件,就是封装调用unity引擎的java源码,位置在Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar(安装目录),然后复制这个文件到android工程的libs目录,系统会自动引用,adt22以下不记得会不会,如果不会的话需要自己设置一下,右键工程
添加这个文件即可。
然后把MainAtivity稍微改一下,就是把继承父类改成UnityPlayerActivity,这样就对接上了unity接口,源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<
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的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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"
,
"第二个方法"
)
;
}
}
}
|