1)新建空的AndroidStudio工程,但是新建過程時最小SDK版本要與unity一致,如下圖所示,本次操作均為api16
?
2)創建Library,如下圖所示,新建module,然后選擇Android Library。
新建模塊為UnityPlugin,如下圖所示,注意此時的PackageName后續用得到
4)引入unity的classes.jar
按下圖所示,找到Unity安裝目錄下的classes.jar文件,并放入上述工程中\unityplugin\libs下(即新建Module下的libs下)
?
選擇File-ProjectStructure,調出Project Structure界面,依次選擇unityplugin(上述建立的module)-Dependencies,然后點擊右側加號-Jar dependences,并選擇libs下引入的classes.jar,如下圖所示,確定引入。
?
5)添加插件代碼
在com.idea.unityplugin下新建類UnityPlugin
在類UnityPlugin(繼承UnityPlayerActivity )中添加如下代碼
package com.idea.unityplugin;import android.os.Bundle; import android.widget.Toast;import com.unity3d.player.UnityPlayerActivity;public class UnityPlugin extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);}// 傳入數據,并通過toast顯示public void ShowToast(final String message){runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();}});}// 返回一個字符串(靜態方法)public static String GetInformation(){return "Android Static Msg";}// 返回一個字符串(非靜態方法)public String GetInfo(){return "Android Msg";} }
6)生成jar或者aar包
點擊build.gradle(此插件的gradle),添加如下代碼,操作如下圖所示。
task makeJar(type: Copy) {delete 'build/libs/unityplugin.jar'from('build/intermediates/bundles/release/')into('build/libs/')include('classes.jar')rename('classes.jar', 'unityplugin.jar')
}makeJar.dependsOn(build)
?點擊Terminal,輸入gradlew makeJar回車,等待執行結束即可,即可在\unityplugin\build\outputs\aar下目錄下找到.aar文件。
?
7)將6)中aar文件放入unity中Assets文件下Plugins\Android目錄下,同時新建AndroidManifest.xml文件,并添加如下內容
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xxxx.androidplugin"android:versionCode="1"android:versionName="1.0"><applicationandroid:allowBackup="true"android:label="@string/app_name"android:supportsRtl="true"><activity android:name="com.XXXX.unityplugin.UnityPlugin"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
注意事項如下圖所示
8)調用代碼
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class CallAndroidMethod : MonoBehaviour {public Button[] buttons;public Text text;private void ShowAndroidToast(){//text.text = "Toast ";using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){text.text = "Toast:";jo.Call("ShowToast", "Android Toast");}}//using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))//{// text.text += " Toast1 ";// using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("crrentActivity"))// {// text.text += " Toast2 ";// //jo.Call("ShowToast", "Android Toast");// jo.CallStatic<string>("GetInformation");// text.text += " Toast3 ";// }//} }private void GetInfomation(){string info = "";using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){text.text = "Static:";info = jo.CallStatic<string>("GetInformation");}}text.text += info;}private void GetInfo(){string info = "";using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){text.text = "Nonstatic:";info = jo.Call<string>("GetInfo");}}text.text += info;}// Use this for initializationvoid Start (){buttons[0].onClick.AddListener(ShowAndroidToast);buttons[1].onClick.AddListener(GetInfomation);buttons[2].onClick.AddListener(GetInfo);} }
然后發布apk即可用了
出現問題:
1)CommandInvokationFailure: Gradle build failed.
解決:修改Build System為Internal
2)IOException:?Failed?to?Move?File?/?Directory?from?'Temp/StagingArea\android-libraries\app-debug\classes.jar'?to?'Temp/StagingArea\android-libraries\app-debug\libs\classes.jar'.
解決:將插件aar文件用解壓軟件打開(直接雙擊),并不解壓,然后刪除libs下的classed.jar即可。
參考文獻:
https://blog.csdn.net/qq_16763249/article/details/81876038(非MainActivity調用方法,純java類調用)
https://blog.csdn.net/qq_28775437/article/details/78605691?locationNum=3&fps=1(打包報錯問題匯總)
https://blog.csdn.net/qiu_zhongya/article/details/51419456(主要參考文獻_原文)
?