Unity呼叫安卓原生的通用前奏(血淚史)
老早就想著寫一篇關於unity與安卓互動的部落格記錄了,一直也沒有時間剛好最近專案與安卓原生的互動很頻繁。就想著順帶記錄一下我的安卓互動血淚史。網上 的參考部落格很多很多五花八門,琳琅滿目,其實都挺不錯的但是呢在實際開發過程中會遇到各種各樣的 你想不到的坑,而這些坑只能自己一個人默默的去填平。以下也是本博主參考網路及幾何自身專案的記錄。
開始:
一:下載安裝最新版本AndroidStudio,部署安卓端
或許有的人會說習慣用Eclipse ,此處不做爭論理論兩個編輯器都是可以的,只不過一個打出的是jar包,一個打出的是arr包,具體arr包跟jar包的區別大家有興趣可以深入一下,arr是比jar包更高一級的裡面內容更多一些。其實最重要的一點現在androidStudio
1.新建工程
123內容隨便填不做特殊要求,4的話會自動生成這個名字感覺上應該跟unity的包名一致,沒做測試,為了免去不必要麻煩就設定一樣。
此介面不做設定預設即可,有特殊需求的做相應設定
注意此處有大坑(本人所遇到的),一下的1.2預設是都勾選的意思應該是預設安卓的一套顯示佈局巴拉巴拉。本人在這裡把這兩個勾選給取消掉了,不要勾選切記。這個小步驟影響你後面的步驟的繁瑣程度。
2.引用unity的classjar
classes.jar的路徑是不一樣的,我在此貼出我的路徑。大家參考
把此jar拖拽到libs,再從libs拖拽到unity目錄,孃的走過去是移動,走回來就是複製貼上了,真是厲害。
選中工程根目錄右鍵 開啟 OpenModuleSetting
好到此引用jar成功,預編譯一下。
3.敲程式碼安卓端的java程式碼,我是安卓小白程式碼全靠貼上
開啟MainActivity類,這個類名是在新建工程的時候可以設定的
package com.romantic.forunity; import android.app.AlertDialog; import android.os.Vibrator; import android.os.Bundle; import android.widget.Toast; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public String ShowDialog(final String _title, final String _content){ runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null); builder.show(); } }); return "Java return"; } // 定義一個顯示Toast的方法,在Unity中呼叫此方法 public void ShowToast(final String mStr2Show){ // 同樣需要在UI執行緒下執行 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show(); } }); } // 第一個引數是unity中的物件名字,記住是物件名字,不是指令碼類名 // 第二個引數是函式名 // 第三個引數是傳給函式的引數,目前只看到一個引數,並且是string的,自己傳進去轉吧 public void callUnityFunc(String _objName , String _funcStr, String _content) { UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content); } }
4.為unity的成功呼叫做一下改動
1)在主 activity 結點下新增資訊,否則在 Unity 匯出 APK 時會報找不到manifest 檔案的錯誤資訊
2)修改application 中的應用樣式,因為匯出的 AAR 檔案將不帶自定義的樣式,故不能從style.xml裡取系統樣式
3)同時需要刪除res\Values目錄下的styles.xml檔案
4)修改mipmap重新命名為drawable
有點亂但是按照步驟來哈 哈哈哈
修改AndroidManifest.xml
5.android端部署成功匯出arr包
按照慣例先預編譯一下然後
或者
然後把arr包還有androidMainifest.xml一起放到unity的android路徑下
二.部署Uniuty端
unity端的測試程式碼
#region 模組資訊
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name: Director
// Author: romantic123fly
// WeChat||QQ: at853394528 || 853394528
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CallAndroidTest : MonoBehaviour {
private Text mText;
void Start()
{
mText = GameObject.Find("MsgText").GetComponent<Text>();
}
public void MyShowDialog()
{
// Android的Java介面
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 引數
string[] mObject = new string[2];
mObject[0] = "赤靈";
mObject[1] = "終於起作用了";
// 呼叫方法
string ret = jo.Call<string>("ShowDialog", mObject);
setMsg(ref ret);
}
public void MyShowToast()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("ShowToast", "正在列印吐司。。。");
}
public void BeCallFunc(string _content)
{
setMsg(ref _content);
}
private void setMsg(ref string _str)
{
mText.text = _str;
}
}
然後打包執行