本文主要面向對Android開發不甚瞭解的Unity開發者,介紹了基於最新的Android Studio的標準Android開發環境與項目結構的配置流程,在此基礎上,開發者可以快速的進行SDK的接入與插件的開發。
目前國內各大博客上搜到的文章內容基本上都是相互抄來抄去,比如說先是清一色的繼承UnityPlayerActivity,然後再配置AndroidManifest文件等等,這些確實有效果,但是具有很大的侷限性。例如,如果項目中如果存在兩個Android插件或SDK會怎麼樣?都繼承UnityPlayerActivity顯然是不行的,啓動入口Activity只能有一個,AndroidManifest文件沒法這樣配置。筆者最近在做畢設,幫同學接了若干個Android下的SDK,包括支付寶,科大訊飛以及二維碼掃描的SDK,參考一些國外的優秀博客以及自己的實踐,總結出一套SDK接入與插件開發的通用流程,在這裏分享給大家。
開發環境
1.開發軟件:筆者使用的開發軟件是Unity 5.4.3f 和Android Studio 2.3。
2.所需類庫:UnityPlayer等需要的classes.jar包。在 Unity支持Android下IL2CPP後,UnityPlayer相關的這個jar包位置由原來的`Editor\Data\PlaybackEngines\AndroidPlayer\bin`變成了`Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono(or il2cpp)\Release\Classes`,選擇jar包時需要注意選擇對應Backend的版本。
項目構建
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.soulgame.myplugin">
<application android:allowBackup="true" android:supportsRtl="true"></application>
</manifest>
5.最後就是編寫我們的插件或者對接第三方SDK了。首先引入Unity的jar包,將classes.jar拷貝到文件夾裏libs文件夾下面,通用點擊File -> Project Structure,在左側選擇我們的插件,然後在上方選擇Dependencies,先刪除的現存的所有依賴庫,然後點擊`+`號 ->Jar Dependency添加Unity的jar包,點擊OK完成設置,稍等一會兒就完成了構建。對於第三方SDK的jar包,以同樣的方式進行引入。如果第三方依賴庫中有so文件,先不需要導入,稍後將會說明如何添加so文件。到這一步,項目、依賴庫都設置完畢。
編寫代碼
package com.soulgame.myplugin;
import android.app.Fragment;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class MyPluginClass extends Fragment
{
private static final String TAG = "MyPlugin";
private static MyPluginClass Instance = null;
private String gameObjectName;
public static MyPluginClass GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new MyPluginClass();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true); // 這一句很重要,保存對該Fragment的引用,防止在旋轉屏幕等操作時時丟失引用(Fragment隸屬於Activity)
}
//示例方法一:簡單的向Unity回調
public void SayHello()
{
UnityPlayer.UnitySendMessage(gameObjectName,"PluginCallBack","Hello Unity!");
}
//示例方法二:計算傳入的參數並返回計算結果
public int CalculateAdd(int one, int another)
{
return one + another;
}
}
編寫完成,將插件編譯導出,選中Android Studio右側的Gradle,選中如圖所示的選項編譯輸出,稍等一會兒,在左側的Project面板可以看到相關的aar文件了,這個aar文件就是最終輸出給Unity使用的aar包,拿到aar包之後,需要進行一項關鍵的操作,將其後綴改爲壓縮格式(zip或rar)打開壓縮包刪除掉libs/下面的classes.jar(原因是Unity在打包的時候會再次拷貝安裝目錄下的classes.jar到項目中造成衝突)!如果插件使用到了so文件,將對應平臺的so文件拷貝至libs下面,如下圖右所示:using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PluginManager : MonoBehaviour
{
public string className = "com.soulgame.myplugin.MyPluginClass";
public Text callbackText = null;
public Text resultText = null;
private AndroidJavaObject pluginObject = null;
void Start()
{
#if UNITY_ANDROID && !UNITY_EDITOR
pluginObject = new AndroidJavaClass(className).CallStatic<AndroidJavaObject>("GetInstance", gameObject.name);
pluginObject.Call("SayHello");
resultText.text = pluginObject.Call<int>("CalculateAdd", 22, 33).ToString();
#endif
}
public void PluginCallBack(string text)
{
callbackText.text = text;
}
}
編寫完成後,設置好Platform和Bundle Identifier以及Mininum API Level(和插件保持一致),到真機上測試即可。