題外話

我本來不想寫這篇文章的,但是我特么忍無可忍了,在baidu上搜啊,出現的文章都是一個人寫的,你們複製粘貼能不能敬業點,最起碼改個路徑啥的也對的起來搜索的小夥伴們吧,然後就是用eclipse來搞的,都3000年了啊,現在誰不用Android studio啊。逼的我沒有辦法了最近萬里長城還格外堅固村裡圍欄屹立不倒,聯繫了下國外的小姐姐開個遠程控制才尋找到了很多有用的小知識。

寫作背景

有個需求就是在unity裡面調用外面的各種硬體設備,所以解決各種問題就只能在android下來解決,unity裡面調用來,之前搜索的都是獲取什麼wifi信號手機電量的,好像並沒有什麼卵用參考價值,這裡不講其他設備怎麼在android上跑通,只說unity與android交互的橋樑,橋樑架通你調用原子彈都沒人管你。


正題了啊!注意了!

  1. 首先你得有Android studio
  2. 可以有一個unity(主要是用到裡面的一個jar包,到時候心情好我共享一下)
  3. 要非常虔誠的讀下面的內容

在Android studio上建一個新的項目

項目建好了就是這個目錄

項目建立完成

然後在當前的項目裡面新建一個module,注意注意!選擇Android Library

準備新建module
選擇android library
全憑愛好起名

創建完成後現在目錄是這個??額樣

裡面多了一個noyaoface的module

然後我們把裡面那個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,這個不能說錯的,我覺得是不科學的,具體原因不細說了給你們資料裡面說的挺清除,給你們轉個鏈接就差不多明白了,這個鏈接國內可以打開。

Unity Android plugin tutorial (1/3) Fundamentals - eppz!?

eppz.eu
圖標

我們給改成這樣

代碼到下面複製

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參數的作用
}

感謝有個小哥哥的代碼參考,因為不是在自己電腦上看的找不到小哥哥的鏈接了

純屬????吧亂泡,看看就行了,有什麼問題留言

推薦閱讀:

相关文章