unity调用Android原生页面

因为最近几个项目的奇葩要求,
最后实现的结果应该是android调unity,
unity里面再可以调android
android单方向调unity非常简单,其他的坑还挺多的。
先从unity调android的原生intent页面开始做起,
试了半天多终于成功了。
unity和android studio版本更新太多,
网上很多方法其实都是对的,但可能很多东西需要改了,
参考了一下其他方法,
记录一下当前的正确方法,后面再加上Android调unity试试。

—————————————————————————————————————————————————

AndroidStudio
1.新建一个project,就先都默认add no activity就好,不需要用到这个。

2.在本project中File-New-New Module,选择Android Library。此处的PackageName后面要用到。

unity调用Android原生页面

3.从unity安装目录的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes中,复制classes.jar出来,放到该Module的libs文件夹里,并右键add as library
unity调用Android原生页面

4.新建一个MainActivity继承UnityPlayerActivity,这就是后面打开app最先显示的unity界面。
另外要新写一个调用intent的方法,这就是我要做的了,调用安卓原生的页面。
mActivity可以自己自定义来写,记得给mActivity写layout。

public class MainActivity extends UnityPlayerActivity {
    Context mContext = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }
    public void showView() {
        Intent intent = new Intent(mContext, mActivity.class);
        startActivity(intent);
    }
}

5.在该module的Manifest写,自己对照着改就行,这是大概的格式。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gzpi.mylibrary" >

    <application
        android:allowBackup="true"
        android:label="调用程序测试"
        android:supportsRtl="true">
        <activity android:name=".MainActivity"
            android:label="调用程序测试">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name=".mActivity"/>
    </application>
</manifest>

6.在该module的build里,加上下面的代码,然后sync now
注意,新版本的导jar包的地址是build/intermediates/packaged-classes/release/了。

//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/packaged-classes/release/')
    into('build/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

7.在右边Gradle打开该module的Tasks-other 找到上面增加的exportJar,点击运行
unity调用Android原生页面
这样build/文件夹里就会出现这个jar包了
unity调用Android原生页面

—————————————————————————————————————————————————
Unity
1.新建一个项目,在项目Assets里新建Plugins-Android,把刚才module里的res和manifest复制过去,
再在这里新建bin文件夹,把jar包放进去,所以现在的结构是:
unity调用Android原生页面

2.选择BuildSettings,Android的setting里,
Minimum API 改成上面AndroidStudio新建项目时的最低API.
再是把 packagename改成module的名字,也就是manifest里的这个packagename
unity调用Android原生页面
unity调用Android原生页面

3.unity里设个按键什么的绑定下面的调用代码,showView就是上面安卓MainActivity里的方法名字。

    public void startMyActivity()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("showView");
    }

这样就好了,如果在build的过程中 出现“Multiple dex files define: Lcom//BuildConfig”的错误,
用压缩软件把jar包打开,把里面的buildconfig删掉就好。