1. 程式人生 > >如何簡單的使用Unity呼叫原生Android外掛

如何簡單的使用Unity呼叫原生Android外掛

Unity呼叫原生Android

Foldcc
Unity version:2018.1
Android Studio version : 3.1.2

簡介

由於自己需要使用Android原生的一些功能,但是發現網上對接原生的方法實在太麻煩太複雜,因此自己打算髮這篇部落格供大家參考 ,沒有那麼多複雜操作,不需要什麼匯出unity的class.jar、不需要繼承UnityPlayerActivity、不需要修改什麼xml也不需要同步包名什麼的。

整體流程:

先大概講一遍整體流程 在逐一細講:
1. 使用Android Studio寫一個工具類
2. 將工具類匯出為aar或者jar,這裡我匯出的為aar也推薦使用
3. 將外掛匯入到Unity的Plugins/Android下
4. 建立用於與建立對接的工具類

Android工具類

這裡用一個震動工具類給大家演示,不需要建立Activity,直接建立一個普通的class檔案就行了,然後將他匯出為aar,放到Unity 專案中,一定要放在Plugins/Android下 如果沒有對應資料夾直接建立,Android如何匯出外掛請自行百度,工具類參考程式碼如下(工具類就一個簡單的呼叫系統震動沒有註釋也不需要過多注意,本文著重講Unity端):

public class Vibrator {
    private android.os.Vibrator vibratorService;
    public boolean Init (Context context){
        vibratorService = (android.os.Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        return
(vibratorService != null); } public boolean HasVibrator(){ if(vibratorService == null) return false; return vibratorService.hasVibrator(); } public void StartVibrator(int ms){ if(vibratorService == null) return; vibratorService.vibrate(ms); } public
void LoopStartVibrator(long[] pattern, int repeat) { if(vibratorService == null) return; vibratorService.vibrate(pattern, repeat); } public void StopVibrator(){ if(vibratorService == null) return; vibratorService.cancel(); } }

Unity對接Android

對接的核心需要以下兩個類:

  • AndroidJavaClass : 獲取指定路徑下的javaClass物件
  • AndroidJavaObject : 獲取指定路徑下的javaObject物件

現在我們第一步是要把寫好的工具給拿到手,因此直接使用new AndroidJavaObject(“工具類地址全名”)即可, 通過這一句程式碼我們就已經拿到工具類並例項化了,但由於我的震動類需要一個Activity上下文物件不然沒法使用,我們可以通過直接獲取Unity自己的Activity來初始化震動類。
以下程式碼是獲取Unity的Activity後傳入到工具類的程式碼演示:

 //獲取Unity的Activity Class
 using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    //獲取對應的例項化物件,這兩句都是固定寫法
                    using (AndroidJavaObject activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"))
                    {
                        //拿到我自己的工具類並例項化
                        AndroidJavaObject  VibratorInstance = new AndroidJavaObject("tool.foldcc.unitytools.Vibrator");
                        //向工具類裡的Init方法傳入Unity的activity物件用於初始化工具類
                        VibratorInstance .Call<bool>("Init", activityContext);
                    }
                }

這裡的 Call 方法第一個引數表示執行的指定方法名後面的是一個可變引數,可以寫方法需要的對應引數。

呼叫原生工具類的方法

執行原生工具類的關鍵就是Call方法,以下是Cal方法的幾種說明:

  • Call : 呼叫指定非靜態方法
  • Call<指定型別> : 呼叫指定非靜態方法並返回指定型別(基礎型別)
  • CallStatic : 呼叫指定靜態方法
  • CallStatic<指定型別> : 呼叫指定靜態方法並返回指定型別(基礎型別)

關於引數問題: 第一個引數為 方法名 必須傳, 第二個為一個可變長引數,可以傳多個引數也可以不傳,根據對應方法的需求來定。

最後貼出Unity端對接Android程式碼:

using UnityEngine;

public class VibratorImp{

    private AndroidJavaObject VibratorInstance = null;

    private static VibratorImp vibratorImp;

    public static VibratorImp Instance {
        get {
            if (vibratorImp == null) {
                vibratorImp = new VibratorImp();
                using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    using (AndroidJavaObject activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"))
                    {
                        using (AndroidJavaClass pluginClass = new AndroidJavaClass("tool.foldcc.unitytools.Vibrator"))
                        {
                            if (pluginClass != null)
                            {
                                vibratorImp.VibratorInstance = new AndroidJavaObject("tool.foldcc.unitytools.Vibrator");
                                vibratorImp.VibratorInstance.Call<bool>("Init", activityContext);
                            }
                        }
                    }
                }
                if (vibratorImp.VibratorInstance == null)
                {
                    Debug.LogError("Init vibrator service err");
                }
            }
            return vibratorImp;
        }
    }

    /// <summary>
    /// 啟動震動
    /// </summary>
    /// <param name="ms">震動時間(毫秒)</param>
    public void StartVibrator(int ms) {
        VibratorInstance.Call("StartVibrator", ms);
    }

    /// <summary>
    /// 啟動高階震動 可自行控制震動間隔來間接控制震動強度
    /// </summary>
    /// <param name="msArray">陣列下標從0開始第一個為震動時長第二個為停頓時長以此迴圈</param>
    /// <param name="repeat">從指定下標開始 -1表示從頭開始 預設為-1</param>
    public void LoopStartVibrator(long[] msArray , int repeat = -1) {
        VibratorInstance.Call("LoopStartVibrator", msArray , repeat);
    }

    /// <summary>
    /// 停止震動
    /// </summary>
    public void StopVibrator() {
        VibratorInstance.Call("StopVibrator");
    }

}

在Unity遊戲邏輯中任何一個地方呼叫該工具類即可實現自定義震動效果!麻煩點個贊喲!

相關推薦

如何簡單的使用Unity呼叫原生Android外掛

Unity呼叫原生Android Foldcc Unity version:2018.1 Android Studio version : 3.1.2 簡介 由於自己需要使用Android原生的一些功能,但是發現網上對接原生的方法實

Unity學習筆記007.Unity接入原生Android百度AR地圖

大概操作步驟按筆記006執行。 1.背景 環境: OS:Windows10 Android Studio3.2 Unity 2018.1.2f1 思路 Unity端:主調方,UI Android端:底層介面,打包aar方式 2.步驟 2.1 Android S

unity呼叫android原生介面

這2天在研究unity呼叫android原生的java程式碼,由於對android開發不熟悉,一切都是從頭開始學。最開始連通過搜尋引擎要用什麼關鍵字都不知該如何概括(現在知道了,即:android plugin for unity)。。。我使用的android開發工具是and

Unity呼叫iOS原生內購

Unity在5.x以後的版本,都附帶了各種平臺的IAP(內購),網上一搜Unity IAP,就一大堆如何如何接入的教程,據說還挺方便的。本人也是用Unity 5.x,也曾經用了一下Unity的IAP,那為何現在還要討論呼叫iOS原生的IAP呢? 在這裡不得不吐槽一下Unity的IAP,雖然它目的

Android封裝jar包,把當前專案設定成module,封裝手機振動jar包給unity呼叫

Android封裝jar包或者把當前專案設定成module操作步驟都一樣,此處以手機振動為例,封裝jar包給Unity平臺使用,具體如下: Android部分: 1.建立unity要呼叫的手機振動的類:PhoneVibrate package com.lin.phonevibrate;

Unity呼叫Android

unity5.X androidstudio3.1.2 第一步,新建安卓工程 點finish就可以了。 新建module。 選擇Android Library。 此處Pacage name要和unity裡面的包名一致。然後點finish,等

Unity呼叫Android方法實現開啟第三方APK

Android 建立的Android的工程,和平常一樣建立 匯入classes.jar包開啟Windows找到classes.jar檔案複製到app> libs下。我的classes.jar檔案位置為D:\ Unity5.6.0 \ Editor \ Data

Unity專案接入Android的Admob Native(原生視訊廣告) SDK

Admob的Native(原生)廣告SDK有Unity版本,但只支援圖文廣告,不支援視訊,為了在Native中加入視訊,只好來接Android的SDK。實現了Unity專案匯出Android Studio工程,AS接入Android SDK後匯出Apk過程。 對於Andro

Android外掛化技術之旅 1 開篇 - 實現啟動外掛呼叫外掛中的Activity和Service

前言 Android技術如今已很成熟了,元件化、外掛化、熱修復等等框架層出不窮,如果只停留在單純的會用框架上,技術永遠得不到成長,只有懂得其原理,能夠婉婉道來,能夠自己手動寫出,技術才會得到成長,與其焦慮未來,不如把握現在。本篇將手寫教大家寫出外掛化框架,外掛化技術是Android高階工程師必備的技術之一,

unity 呼叫C++庫(android+jni+window dll平臺實現)

方便不知道如何再unity呼叫各平臺動態庫的同學參考,實測可用: window案例 動態庫名 tracker_model.dll 位置 unity工程 Assets\Plugins目錄下 c# 關鍵呼叫 程式碼  using UnityEngine; using Syst

Unity--- 簡單模仿一下原生協程的實現

先來看下測試程式碼 ... void Start() { CoroutineManager.Manager.StartCorouine(testWaitTime(1)); CoroutineManager.Manager.StartCorouine(te

Android Studio如何匯出可供Unity使用的aar外掛詳解

前言   專案之前使用Eclipse匯出的jar檔案來做與Android互動,最近因為工作需要需使用Android Studio的aar檔案,網上參考了部分文章,也結合自己的理解重新整理一下具體的方法,通過寫一個測試Demo來表述Android Studio建立aar的過程與及Unity如何使用aar檔案,希

Android Studio 匯出aar包供Unity呼叫

前言   專案之前使用Eclipse匯出的jar檔案來做與Android互動,最近因為工作需要需使用Android Studio的aar檔案,網上參考了部分文章,也結合自己的理解重新整理一下具體的方法,通過寫一個測試Demo來表述Android Studio建立aar的

Android H5混合開發 JS呼叫原生方法

最近剛接收的新專案,涉及到了JS和原生android的互動,遇到了一些問題做個記錄儲存下來首先 webview.addJavascriptInterface1.首先還是一樣的佈局檔案放WebView控制元件,建立一個H5Activity.class去呼叫此佈局2.然後給w

Unity呼叫Android引數為陣列的方法

Unity開發過程中,如果要呼叫Android端的java方法,恰巧該方法的引數是可變引數或者陣列,使用unity的AndroidJavaObject提供的call方法直接傳遞c#陣列,是需要對陣列引數做一下處理。舉例說明:java方法如下:public void addLi

android 呼叫原生圖片裁剪後的圖片尺寸縮放

在安卓開發中,如果對拍照後的圖片進行圖片裁剪,如果是呼叫系統的裁剪,如下: /* * 裁剪圖片 */ private void cropPhoto() { Intent intent = new Intent("com.android.camera.act

Android Unity混合開發之Unity呼叫Android方法的坑

dialog popupwindow 之類 凡是跟控制元件有關係的方法 都要 private void yourMethodName() { runOnUiThread(new Runnable() { @Override public void

Unity呼叫安卓原生的通用前奏(血淚史)

   老早就想著寫一篇關於unity與安卓互動的部落格記錄了,一直也沒有時間剛好最近專案與安卓原生的互動很頻繁。就想著順帶記錄一下我的安卓互動血淚史。網上 的參考部落格很多很多五花八門,琳琅滿目,其實都挺不錯的但是呢在實際開發過程中會遇到各種各樣的 你想不到的坑,而這些坑只能

Unity調用Android的Activity

unity android activity 交互 之前http://shuxiayeshou.blog.51cto.com/4452347/1932216 寫了關於Unity與Android結合所遇到的問題及解決方法總結一下,Unity做一個簡單的場景,AndroidStudio建一個簡單的

unity直連android真機在Profiler性能分析測試

unity androi 如果 dash 分析 窗口 tcp 是不是 屏蔽 基礎步驟: 1、Unity打開你要測試的項目:File–Build Settings 2、如下圖,按圖順序進行1、2、3、4、5操作,如果做過了,2就是灰色的,不能被點擊,4和5