iT邦幫忙

0

[填坑日記] Android Studio plugin to Unity

要開發Android的App有許多的方法,目前以Android Studio與Unity最為多人使用,而兩者也都擁有完善的開發社群。剛好因為工作的關係,經常需要依照專案的屬性選擇開發的工具。例如 需要顯示3D、有大量動畫的專案會選擇使用Unity進行開發。而需要一些Native的工具(BLE、Toast、Boardcast......)則會使用Android studio。

Android Stduio

優點:
-效能較佳
-有許多的Native API套件
-擁有龐大的Git library

缺點:
-視覺化界面較不完整
-開發時程相對較長

Unity

優點:
-較完整的視覺化界面
-對於3D的處理較容易
-Asset story提供許多工具
-跨平台
缺點:
-效能較差


礙於選擇開發環境時,經常因為Android的功能並未支援Unity導致只能使用Android Studio開發,於是開始找方法該如何寫Android plugins for Unity。這篇文章會用Unity呼叫Android Native的Toast作為範例。
廢話到這 ~ 切入主題

首先建立Android Stduio專案

https://ithelp.ithome.com.tw/upload/images/20201016/201252983Eub9HLkA8.png
https://ithelp.ithome.com.tw/upload/images/20201016/20125298jXIsrMOqZE.png

Create new Module

https://ithelp.ithome.com.tw/upload/images/20201016/20125298gjD39y74vv.png
https://ithelp.ithome.com.tw/upload/images/20201016/20125298a9UazGMNMS.png

Create Java Class

在建立的Module路徑下,新增一個新的JavaClass (這邊取名也叫做JavaClass)
這邊寫了一個function被呼叫時會把得到的訊息跟TAG一起print在log上


public class JavaClass 
{
    private final String TAG ="JavaClass";
    
    public void logPrint (String message)
    {
        Log.i(TAG,message);
    }
}

https://ithelp.ithome.com.tw/upload/images/20201016/20125298SzGZIa7vtD.pnghttps://ithelp.ithome.com.tw/upload/images/20201016/20125298euguUHzM0y.png

Build Module

在路徑下會產生一個class.jar
如果找不到的話可以在資料夾內搜尋 .jar
https://ithelp.ithome.com.tw/upload/images/20201016/20125298BHkAPz9P3n.png

Copy to Unity plugin

在Unity Assets中 Create Plugins/Android 的資料夾並將class.jar複製進去
https://ithelp.ithome.com.tw/upload/images/20201016/20125298hORdnGwp2h.png

C# Script call Java class

利用C# Script 的AndroidJavaObject呼叫
需要注意 Package Name跟function name就是前面使用Android studio定義的

 void Start()
    {
        javaClass = new AndroidJavaObject("Android's package name");
        javaClass.Call("Android function name","Hello Unity");
    }

https://ithelp.ithome.com.tw/upload/images/20201016/20125298Tk0SymcFBW.png

利用Adb shell 確認

在adb shell 中輸入 logcat | grap JavaClass 可以看到前面寫的logPrint確實有被呼叫了

https://ithelp.ithome.com.tw/upload/images/20201016/20125298LjR4J8nuss.png

加入自動更新

每次寫一次就要移動資料夾確實是很麻煩,因此只要在Module下的那個gradle加入下面幾行就可以自動把新build出來的Plugins import到Unity的路徑。(記得先把Unity舊的Classes.jar刪掉 因為這邊有把他改名)

https://ithelp.ithome.com.tw/upload/images/20201016/20125298nZ0N1OFIiH.png

Import Unity Activity to Android Studio

因為許多的Android Native 元件都需要使用到Activity來創建,在這邊要使用Unity的Activity來創造。
如下圖 Unity的資料夾內找到classes.jar,複製到 Module路徑下的libs
然後因為我們上面再grandle中有include('classes.jar'),Sync之後就會自動import了

https://ithelp.ithome.com.tw/upload/images/20201016/20125298VKRc3prF0W.png

Write toast function

接著就可以利用UnityPlayer.currentActivity來拿到Activity去創建Native的原件,這邊寫了兩個Function,一個呼叫Toast,一個回傳number+1的數字。

https://ithelp.ithome.com.tw/upload/images/20201016/201252988B27JPTJ9n.png

  public int getNumberPlus (int number)
    {
        return number+1;
    }
    public void showToast (String message)
    {

        Toast.makeText(UnityPlayer.currentActivity, "Toast "+message, Toast.LENGTH_SHORT).show();

    }

Unity 那邊只需要使用AndroidJavaObject.Call即可以呼叫到前面寫好的showToast以及getNumberPlus兩個function

public class PluginWrapper : MonoBehaviour
{
    private AndroidJavaObject javaClass;

    public Text numText;
    public Button toastButton;

    


    // Start is called before the first frame update
    void Start()
    {
        javaClass = new AndroidJavaObject("com.example.unityplugin.JavaClass");
        javaClass.Call("logPrint","Hello Unity");
        numText.text = javaClass.Call<int>("getNumberPlus",100).ToString();
        toastButton.onClick.AddListener(new UnityEngine.Events.UnityAction (()=> showToast("Button Click")));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void showToast(string message)
    {
        javaClass.Call("showToast", message);
    }
 

}

最後在Scene內新增一個Text和Button拉到PluginWrapper內Build出APK,按下按鈕即可看到Toast。

https://ithelp.ithome.com.tw/upload/images/20201016/20125298B7mr9aMTaB.png


尚未有邦友留言

立即登入留言