妄想集合 題解(斐波那契三角形問題)
前言
目前網上找到的相關文章都是互相轉發抄襲,真的毫無閱讀價值,如此簡單的通訊竟然花了我好幾天的功夫學習,故做此記錄
Android層
準備
環境配置相關的內容就不介紹了
建立一個空專案
下面配置可以隨便寫,不會用到,但還是規範一點吧!
建立專案,等待Gradle Sync,切記不要使用代理,不要使用代理,也不要開梯子!
右鍵專案,建立一個new module,選擇library
這裡的package name要和unity中設定一致,API等級大於11
然後我們把建立工程自帶的app module刪掉,當然直接刪是刪不掉的,得在這
同事刪除MySDK的所有依賴
刪除安卓自帶的一些資原始檔,只留下main就好
到此為止安卓方面的一個空專案算是準備好了
編寫SDK
安卓肯定是不認識UNIYT的,所以我們得匯入UNITY官方給我們的一個JAR包作為橋樑,找到對應編輯器的安裝目錄
這其中有2個資料夾,得看你的UNITY專案選擇打包成mono還是il2cpp,這裡我們選擇mono,則繼續往下找
將他複製到AS對應目錄,並新增為Library
在main目錄中的package中建立一個JAVA類,整合自Fragment,有同名類,注意名稱空間
編寫程式碼
package com.banging.mysdk; import android.app.Fragment; import android.os.Bundle; import com.unity3d.player.UnityPlayer; public class MyPlugin extends Fragment { private static final String TAG = "MyPlugin"; private static MyPlugin Instance = null; private String gameObjectName; public static MyPlugin GetInstance(String gameObject) { if(Instance == null) { Instance = new MyPlugin(); 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; } }
很簡單的能夠發現,這是一個單利類,提供給Unity呼叫
Build專案,找到編譯好的arr,複製到Unity專案的Assets/Plugins/Android中
Unity層
用解壓縮軟體開啟arr,刪除兩個東西
新建一個測試場景
新建一個指令碼掛到Canvas上
using System; using UnityEngine; using UnityEngine.UI; public class Test : MonoBehaviour { public Text callbackText = null; public Text resultText = null; private AndroidJavaClass jc; private AndroidJavaObject jo; void Start() { // 這裡就是我們的定義在安卓中的的包名+類名 // 獲取到一個類,只是類,不是例項 jc = new AndroidJavaClass("com.banging.mysdk.MyPlugin"); // 呼叫靜態方法獲取單例類 jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name); try { jo.Call("SayHello"); } catch (Exception e) { callbackText.text = e.ToString(); } try { resultText.text = jo.Call<int>("CalculateAdd", 2, 3).ToString(); } catch (Exception e) { resultText.text = e.ToString(); } } // 安卓向Unity傳送的訊息 public void PluginCallBack(string text) { callbackText.text = text; } }
打包設定,公司名必須改一個,使用預設的可能打包出錯
這兩個需要和安卓那邊設定一樣,不一樣好像也可以,沒有過多測試,目前先保持一致!
打包,測試
易錯點
Gradle Sync 特別慢
不要使用代理,首先檢查是否打開了代理
這裡分兩種情況,如果你之前曾經設定過代理,哪怕你取消了,仍然會有殘留配置,檢查gradle.properties,圖中紅框內應該會有對應的代理資訊,刪掉
其次,如果你配置過代理並且主動Sync過,AS應該會有一個彈窗讓你確定代理設定,此時會在 C:\使用者\(你的使用者名稱)\.gradle 中生成一個gradle.properties,其中也會有代理資訊,刪掉,然後重啟AS,注意一定要重啟
如果你之前沒有配置過代理,但是Build也很慢,那可以考慮隨便設定一個代理,然後主動Sync,讓AS保留代理配置,生成相關檔案,然後你再刪掉,重複上一步的操作,然後重啟
Android Gradle plugin requires Java 11 to run.
本地JAVA環境版本太低了,直接點選圖中的Gradle Settings設定成對應版本就好,似乎AS預設就是安裝了JAVA11的