您的位置:首页 > 移动开发 > Unity3D

安卓调用unity的3D界面

2015-10-01 14:16 399 查看
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,整个过程就是这样的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: