安卓调用unity的3D界面

来源:互联网 发布:python 流对象如何传输 编辑:程序博客网 时间:2024/05/21 10:20

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,整个过程就是这样的

0 0
原创粉丝点击