引言
在寫了Unity與Android交互方案優(yōu)化版這篇文章得到了大家的認可,很多大佬評論說該方案用起來還可以。不過也有很多人咨詢,如果需求要在原生的Activity里實現(xiàn)一些回調(diào)的重寫躲因,或者是某些SDK需要自定義的Activity開發(fā)時早敬,該怎么做。其實實現(xiàn)起來還是比較簡單的大脉,這里也提供一個方案搞监,同樣是減少了那些繁瑣的操作步驟,盡量簡單的讓您快速實現(xiàn)需求镰矿。
本文適用對象
- 有一定的Unity開發(fā)經(jīng)驗琐驴,會使用Unity
- 有一定的Android開發(fā)經(jīng)驗,會使用AndroidStudio秤标,會看查看調(diào)試信息
- 本文的所有內(nèi)容基于Unity與Android交互方案優(yōu)化版提供的方案之上绝淡,為其擴展、加強
方案優(yōu)勢
- 需要引用unity下的class.jar苍姜,但是該jar并不會被打包出來牢酵,所以沒有網(wǎng)上其他方案的那些繁瑣的解壓、拷貝等步驟衙猪。
- 需要在Unity的/Plugins/Android下放置AndroidManifest.xml文件馍乙,因為必須要描述自定義的Activity等信息。
- Unity打包時PackageName不依賴于引用文件
- 發(fā)布簡單垫释,只需要導(dǎo)出arr并直接拷貝到/Plugins/Android目錄下即可使用潘拨,不用對文件做任何修改
文章DEMO對應(yīng)的IDE版本
- AndroidStudio 3.4.1 (親測通過)
- Unity 2018.4.0 (親測通過)
流程
因為項目是基于Unity與Android交互方案優(yōu)化版擴展而來的,所以我們這里省略掉前戲饶号,而是直接開始高潮部分铁追。
Android部分
放置unity的class.jar
首先我們拷貝unity安裝目錄下針對的class.jar到AndroidStudio中庫項目下的tempLibs目錄中。這里我用的是Unity 2018.4.0版本茫船,拷貝的文件是"[Unity安裝路徑]\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\class.jar"
一般來說說Android開發(fā)時琅束,依賴的庫文件都是放到libs目錄中的,但是該目錄中的內(nèi)容默認是打包時會一起編譯進包的算谈,所以我們自己建立一個tempLibs(名字你隨便壬鳌)目錄,來放這種不參與編譯的jar然眼。
修改build.gradle文件
這一個地方很關(guān)鍵艾船,請仔細閱讀
修改build.gradle文件,的dependencies部分高每,添加class.jar的引用屿岂,這里切記用compileOnly,這樣打包aar的時候鲸匿,該class.jar不會被打包出去爷怀。
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
compileOnly files('tempLibs/classes.jar') //使用compileOnly指定該jar只是開發(fā)時引用,編譯時不導(dǎo)出
}
寫一個自定義的Application
我們創(chuàng)建一個CustomApplication文件带欢,繼承自Application运授。為了方便測試烤惊,我們重寫onCreate方法
import android.app.Application;
import android.util.Log;
public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("unity_with_android_plus", "老子就是自定義的Application");
}
}
寫一個自定義的Activity
我們創(chuàng)建一個CustomActivity文件,繼承自UnityPlayerActivity吁朦。為了方便測試柒室,我們重寫onCreate方法
這就是為什么要引入class.jar的原因,因為我們要繼承 "com.unity3d.player.UnityPlayerActivity" 這個類
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
public class CustomActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
Log.i("unity_with_android_plus", "老子就是自定義的Activity");
}
}
Unity部分
編寫AndroidManifest.xml文件
我們在Assets/Plugins/Android目錄下逗宜,新建一個文件AndroidManifest.xml伦泥。內(nèi)容如下
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jing.unity" >
<application
android:name="com.jing.CustomApplication"
android:label="@string/app_name">
<activity android:name="com.jing.CustomActivity"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.lib_name" android:value="unity" />
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
</activity>
</application>
</manifest>
在這里,可以看到我們明確指出了Application使用的是我們自定義的CustomApplication锦溪,Activity使用的是CustomActivity。至于其它的參數(shù)的含義府怯,請各位大佬自行百度android知識刻诊。
測試
我們配置一下BuildSettings,確保勾上Development Build牺丙。然后打包APK開始測試则涯。
讓程序運行起來,我們可以在AndroidStudio的Logcat里看到我們自定義的Application以及Activity已經(jīng)起作用了冲簿,并打印了日志信息粟判。
DEMO地址
結(jié)束語
基本上該文章配合之前的文章,可以解決我們在Unity和Android交互開發(fā)中遇到的所有問題峦剔,為所欲為了档礁。如果后續(xù)還有其它的更好的方案,我會再更新吝沫。