標籤:

一種unity Android集成SDK的方式

由於目前國內各類應用市場分庭而治的情況,當要分發至這些渠道後,往往需要集成各類應用市場的SDK,在接入了幾家之後,對提供的官方的Spec做法略有異議,這裡主要介紹的內容與官方介紹的方式有出入。

Unity在工程內提供了Plugins的方式集成其他平台內原生的功能調用,在Asset/Plugins/Android目錄下支持以下四種插件

  • .aar
  • .jar
  • Native c++ code
  • Extending the UnityPlayerActivity Code

前兩種將文件直接放在Plugins目錄,在unity層中就能直接調用了,調用的方式可以通過AndroidJavaObject(鏈接)。項目的工程建立可以參看我之前這一篇[1]

對於Native c++ 的代碼相較於之前兩種,需要指定對應的CPU,調用方式可以參見官網。

針對UnityPlayerActivity則需要在Android層進行擴展,以下是繼承類示例。

import com.unity3d.player.UnityPlayerActivity;import android.os.Bundle;import android.util.Log;public class ExtendedActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("OverrideActivity", "onCreate called!"); }}

還需要修改Assert/Plugins/Android目錄下的AndroidManifest.xml文件,這個可以看作Android啟動的入口配置文件,修改它為我們繼承出來的UnityPlayerActivity。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product"> <application android:icon="@drawable/app_icon" android:label="@string/app_name"> <activity android:name=".ExtendedActivity" 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> </activity> </application></manifest>

再將這個ExtendedActivity打成jar包放在Assert/Plugins/Android目錄下,就能正常調用了,至於SDK中各類相關載入代碼直接寫在繼承出來的類中就行了,打包方式可以也參考這裡[1],要額外注意的是要將打包生成的R.java刪除掉;當然,也可以直接在AndroidStudio中打包,這裡不贅述了。

各類SDK提供的方式需要將Unity工程導出Android工程後再將相關內容集成至項目內,對於更新頻繁及分發渠道多種的情況需要更加自動化流程,unity本身集成了各類平台的打包工具的目的也是為了能更加自動化的部署到各類平台上,如果是要將某個小遊戲、或者一個場景集成到一個Android APP中,這個做法是合適的,但是要為了某個功能的調用而採用這樣方法,帶來很多事倍功半的效果。集成成Plugins的方式更利於在unity中直接自定義編譯的pipeline,方便項目管理。


推薦閱讀:

Moba手游優化總結
Unity接入多個SDK的通用介面開發與資源管理(二)
使用頂點投射的方法製作實時陰影
一個簡單的探照燈shader
Unity中的單例模式、回調函數、消息分發的使用區別?

TAG:unity |