1. 程式人生 > >Unity呼叫安卓原生的通用前奏(血淚史)

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;
    }
}

然後打包執行