我本來不想寫這篇文章的,但是我特么忍無可忍了,在baidu上搜啊,出現的文章都是一個人寫的,你們複製粘貼能不能敬業點,最起碼改個路徑啥的也對的起來搜索的小夥伴們吧,然後就是用eclipse來搞的,都3000年了啊,現在誰不用Android studio啊。逼的我沒有辦法了最近萬里長城還格外堅固村裡圍欄屹立不倒,聯繫了下國外的小姐姐開個遠程控制才尋找到了很多有用的小知識。
有個需求就是在unity裡面調用外面的各種硬體設備,所以解決各種問題就只能在android下來解決,unity裡面調用來,之前搜索的都是獲取什麼wifi信號手機電量的,好像並沒有什麼卵用參考價值,這裡不講其他設備怎麼在android上跑通,只說unity與android交互的橋樑,橋樑架通你調用原子彈都沒人管你。
在Android studio上建一個新的項目
項目建好了就是這個目錄
然後在當前的項目裡面新建一個module,注意注意!選擇Android Library
創建完成後現在目錄是這個??額樣
然後我們把裡面那個app的module給刪掉吧,沒什麼??8用。
刪這個應該知道怎麼刪除吧,算了,我還是截圖吧
我這個版本的Android studio可能在我寫這篇文章的時候比較新,是3.4.1的
點完OK然後在目錄上右擊刪除
好了,這個app已經離我們而去了
開始搞代碼了
我們現在看到我們新建的這個module裡面跟平常app裡面的目錄結構沒啥區別,就是裡面少一個mainActivity,沒有事情,我們也新建一個,這裡我要說的就是,這個新建的activity就相當於我們在unity裡面調用的一個入口,說了這麼多,看圖就行。
注意!這個給取消,我們不需要layout布局
創建好後就是這樣的結構了,下面開始說重點 重點 重點
因為是unity與Android交互,裡面需要用到一個unity的一個jar包,這個jar包一般都在這裡
/Unity/Hub/Editor/2019.2.0b1/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar
/Unity/Hub/Editor/2019.2.0b1/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar
這個我得提一下,要不你們光知道有這個東西不知道在哪裡,這個jar包好說,等會我傳一下子,要是寫完的時候忘了,你們聯繫我再給你們發,我為了這個jar包現安裝了一個unity,很煩。
我們把這個jar包放到libs裡面然後導入一下
開始寫代碼了
開這啊!這是重點!你們不管在哪裡查找的資料都是說要繼承這個activity,這個不能說錯的,我覺得是不科學的,具體原因不細說了給你們資料裡面說的挺清除,給你們轉個鏈接就差不多明白了,這個鏈接國內可以打開。
我們給改成這樣
package com.fornb.noyaoface;
import android.app.Fragment; import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class NoYaoMoney extends Fragment {
private static final String TAG = "NoYaoMoney"; private String mGameObjectName; private static NoYaoMoney instance;
public static NoYaoMoney getInstance(String gameObject) {
if (instance == null) { instance = new NoYaoMoney(); instance.mGameObjectName = gameObject; UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(instance, TAG).commit(); }
return instance; }
public void send(){
UnityPlayer.UnitySendMessage(mGameObjectName, "XMessageCallBack", "NoYaoMoney"); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
這裡我要說一下UnitySendMessage這個方法,就像我在圖片里說的,之前我是用廣播一秒一發送UnitySendMessage這個方法,這個方法用大白話解釋就是說我在這邊調用一次,unity那邊就有反饋一次,跟介面作用差不多,並不是說我調用了這個方法,那邊沒有反饋,需要那邊持續更新讀取這個方法。
UnitySendMessage(參數1,參數2,參數3)
參數1不用管
參數2是在unity那邊的接收方法名(在unity代碼中就明白了)
參數3是傳遞的信息
現在表面更能就這樣,可以測試了,就是在unity調用send方法,看看unity能不能讀取到NoYaoMoney這個字元串。
下面就是打包,這個baidu上基本沒有正確的
首先知道as打完的是XXX.arr的包,不是jar包,現在unity裡面是支持arr的,而且非常方便不需要什麼目錄結構直接導入就能用。
我們寫完這個功能讓unity調用,如果是測試就沒必要混淆了,要是寫些不想讓人看見的東西就要混淆,這裡我就不寫怎麼混淆了,需要的小夥伴可以留言,非常簡單。
這裡注意重點我們在打包的時候不能把libs裡面那個class.jar包打進去,因為這樣會在unity里衝突,這裡怎麼剔除,有些人說打完包改後綴zip然後刪除lib裡面這個jar,我只想說qnmd,你看過arr打完包是啥樣嗎。都在一個jar裡面了,這裡只需要在build.gradle裡面改下即可
這樣打包的時候就不會打到裡面
點一下,打包開始
successful。打包成功!
現在這個arr包就可以當sdk給unity的小夥伴發過去了,可以用gui看一下jar裡面的樣子,因為是沒混淆的,都可以看到
現在把arr傳給小夥伴了,然後告訴他這樣用就可以了
public string className="com.fornb.noyaoface.NoYaoMoney"; 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("send");
#endif }
public void XMessageCallBack(string str){ //str會接收NoYaoMoney這個字元串 //UnityPlayer.UnitySendMessage(mGameObjectName, "XMessageCallBack", "NoYaoMoney"); //比較一下UnitySendMessage參數的作用 }
感謝有個小哥哥的代碼參考,因為不是在自己電腦上看的找不到小哥哥的鏈接了
純屬????吧亂泡,看看就行了,有什麼問題留言
推薦閱讀: