1. 程式人生 > >Unity3D工程整合到Android工程步驟及問題解決

Unity3D工程整合到Android工程步驟及問題解決

我們公司主要開發AR專案的,所以經常需要做Unity和Android的整合,一路走過來,掉進過無數的坑,百度到爛了還有各種請教大神,還是沒得解決問題,再憑藉自己的直覺猜測才一點點搞定了。

從在開始捋起吧:

1.先讓unity同事將unity的專案打包Android工程,一定一定要注意打包的時候注意一個關鍵地方,這個是影響機子適配問題的(這個問題我被深坑了好久):


一定要選上(ARMv7 + x86)!!!!否則有些手機會出現如下硬體不支援的彈框。


2.開始匯入到Android專案中,以module形式加入,(為什麼要這樣?而不是把程式碼複製到app的那個module裡?因為到時候unity修改程式碼的時候,就知道什麼叫痛苦),

匯入之後一定會報錯的,不要慌,喝口水壓壓驚,這個坑我都走過了,不要怕。之前我寫過一篇部落格處理這個問題,這次再將一次:

(1)將unity的這個module裡的 build.grandle的第一行改成:apply plugin: 'com.android.library'

(2)將compileSdkVersion和buildToolsVersion 改成跟你的app裡的版本一樣

 (3)刪掉applicationId這一行

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile files('libs/unity-classes.jar')
    compile files('libs/dingzhihua_new.jar')
}

(4)到unity這個module的AndroidManifest檔案裡,application刪掉label和theme兩個屬性

(5)把帶有那個<intern-filter>的activity,加上android:process="e.unitry3d"(這個是給unity用來呼叫安卓的,比如按手機返回鍵的時候會關閉當前介面,不然會沒反應或者閃退),並刪掉<intern-filter>,不然安裝的時候會出現兩個app


 <application
        android:banner="@drawable/app_banner"
        android:debuggable="false"
        android:isGame="true">
        <activity
            android:name="com.yuto.customization.UnityPlayerActivity"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:process="e.unitry3d"
            android:screenOrientation="sensorPortrait">
            
            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
            <meta-data
                android:name="unityplayer.ForwardNativeEventsToDalvik"
                android:value="false" />
        </activity>
    </application>

3.介面跳轉,Android的介面跳轉到unity介面,注意導包要導的是剛才在unity的AndroidManifest的那個Activity

 Intent intent = new Intent(CustomizeActivity.this, UnityPlayerActivity.class);
 this.startActivity(intent);

到這裡就完成了,基本可以順利運行了。

但是,但是,但是,有些機子還是會彈出


感覺好崩潰啊,各種百度,找方法解決,還是沒!解!決!

有些專案根據http://blog.csdn.net/li438730745/article/details/65937001這篇部落格解決了問題,但是還是有不少人沒解決,比如我。

而且,我的專案很簡單,module除了app和unity之外,沒其他的module,app的libs檔案也是空的!!!

而且,同一個手機,同一個unity的module,放在兩個不同的專案裡,竟然有一個能執行,另一個不能執行!!!

認認真真的比對了一天,加上猜測,發現不能執行的專案的app的build.grandle檔案裡有一行很可疑



很可能是引入的so庫跟unity的so庫重名衝突了!,雖然我們看不到gpuimage這個的so庫。

然後去GitHub下載了GPUImage的module,替換了紅框comple這一行,然後就能運行了!

因為gpuimage呼叫的是C/C++,如果你的app執行進入unity介面出現彈框,就替換compile方式,改成module形式,刪掉衝突的so庫