unity和android来回调用的方法一般有2种,第一种,把安卓项目导出成jar放到unity的plugins的文件夹中,第二种,把unity项目导出android项目,再在eclipse中修改完成使用。
网上很多讲解第一种的,比如雨松的等等, 没什么问题,讲解得也很详细,这里就不多说了。主要描述下第二种方法。
创建一个unity项目,最简单的中间显示一个cube,转成安卓平台,BuildSetting 右侧选中Google Android Project ,这里如果想读取安卓手机里的IO文件,在Inspector窗口把WriteAccess改成External(SDCard)-当然在安卓工程中的AndroidManifest.xml修改也可以。好了这就是我们要在安卓中显示的unity窗口的内容项目了,设置一个包名 com.xxxxx.xxxx,把它放到一边。
创建或打开一个安卓 eclipse项目,这个项目就是我们想嵌入unity的工程。这个工程的包名也要和刚才设置的一致。打开 AndroidManifest.xml,我们增加一个activity 就像这样
<activity
android:name="com.xxxxxx.xxxxx.U3DActivity"
android:screenOrientation="landscape" >
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
第三行是为了横屏显示,如果不写可能会闪退,注意包名跟上面是一致的。然后创建这个activity的类,就像这样
public class U3DActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_3d);
setContentView( mUnityPlayer.getView() );
}
}
R的layout的值在res的layout中添加设置好,这两句哪个都行,然后我就不描述别activity是怎么跳到这个unity的activity中来的了 关键字Intent。
在res的layerout中设置一下窗口的属性,就像这样
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/UnityView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
好了,现在我们在eclipse中导入刚才我们用unity导出的项目,导进来后应该会是这样 UnityPlayerNativeActivity 名的一个工程,右键工程->Properties->android 设置成跟主工程同一安卓版本,然后点选 Is Library Apply OK。拷贝项目下的assets下的bin目录到主工程中的相同目录下。右键主工程->Properties->android 设置Add 把刚才设置的library添加进来。别忘了clean工程,或者干脆重启一下eclipse,清清缓存的东西。
OK这样两个工程就算挂接上了。
然后我再记录一下双方互相调用的方式。
安卓端还是调用UnityPlayer.UnitySendMessage来访问场景中挂在脚本函数的对象来调用。
unity端可以
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startActivity", "do sth");
有时会因为工程activity的复杂失败 那么可以用下面的方式
var jc = new AndroidJavaClass("com.xxxx.xxxx.U3DActivity");
AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("getInstance");
jo.Call("StartActivity", "param");
注意这里是你的包名。后面这种方法需要在安卓的U3DActivity类下写一个静态的getInstance方法
public static Magic3DActivity getInstance(){
return _this;
}//这个this在这个activitiy创建时赋值就行了
如此,就可以在unity和android来回跳转了。如果你不想在跳转的时候关闭双方,可以这么处理:
在主工程的两个跳转activity中这样写
public static Intent _2dActicity = null;
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
public void StartActivity(String name)
{
_2dActicity = new Intent(mContext, MainActivity.class);
_2dActicity.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(_2dActicity);
}
这样就只是提到前面来了
OK,整个过程就是这样的