見出し画像

メモ:ネイティブプラグイン(Java⇔Unity)

はじめに

今回は個人的に大きく躓いた内容であるネイティブプラグインのことをまとめました。
これは個人的なメモという部分が強いため、参照される際には不備がある可能性があります。
その点に関しましてはご了承ください。

大きく躓いた部分はコードの部分だけなので、設定の部分に関しては他の記事の参照をお願い致します。

他にも検索次第で多くの記事が見つけられます。

コードまとめ

コードのまとめに入る前に1つ。
今回設定したPackage名は、"com.example"、
今回設定したclass名は、"MyPlugin"です。
ここは自分で設定する部分なので、人によって変わります。
自分が今なんのPackage名でなんのclass名で作業をしているのか確認しておきましょう。

また、扱う内容が変わる際には関数や変数を変更して違うものであるということを強調しています。

1.AndroidStudio(Java)のStatic関数(メソッド)の呼び出し

<AndroidStudio(Java)側>

package com.example; //自分のPackage名

public class MyPlugin //自分のclass{
    public static String func_1() //関数(メソッド)設定、返り値(return)あり
  {
        return( "Hello world!!"); //関数の返り値
    }
}

<Unity(C#)側>

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetStaticFunc : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_1; //ちゃんと受け取れているか確認するTMP

    string s1; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_1.text = GetFunc_1(s1); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetFunc_1(string msg1) //AndroidStudioの関数を呼び出す関数
    {
     //AndroidJavaClassとAndroidStudioのPackage名.class名で
     //使用したい関数にアクセスできるようにする
     //Package名.class名は""で囲う
        using (AndroidJavaClass cls_1 = new AndroidJavaClass("com.example.MyPlugin"))
        {
       //CallStaticでAndroidStudio側のStatic関数の呼び出し
            //関数名は""で囲う
            msg1 = cls_1.CallStatic<string>("func_1"); 
        }
        return msg1; //AndroidStudio側から受け取った値をUnityで受け取る
    }
}

2.AndroidStudio(Java)のStatic変数の呼び出し

<AndroidStudio(Java)側>

package com.example; //自分のPackage名

public class MyPlugin //自分のclass{
    public static String mStr_2 = "aaaaa";
}

<Unity(C#)側>
GetStaticとSetStaticは一緒に使うような構成にする必要があります。

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetStaticVari : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_2; //ちゃんと受け取れているか確認するTMP

    string s2; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_2.text = GetVariable_2(s2); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetVariable_2(string msg2) //AndroidStudioの関数を呼び出す関数
    {
     //AndroidJavaClassとAndroidStudioのPackage名.class名で
     //使用したい関数にアクセスできるようにする
     //Package名.class名は""で囲う
        using (AndroidJavaClass cls_2 = new AndroidJavaClass("com.example.MyPlugin"))
        {
       //GetStaticでAndroidStudio側のStatic変数の内容取得
            //変数名は""で囲う
            msg2 = cls_2.GetStatic<string>("mStr_2");

       //SetStaticでAndroidStudio側のStatic変数の内容を変更
            //変数名は""で囲う
            cls_2.SetStatic<string>("mStr_2", "Hello World");
        }
        return msg2; //AndroidStudio側から受け取った値をUnityで受け取る
    }
}

3.AndroidStudio(Java)のStaticではない関数(メソッド)の呼び出し

<AndroidStudio(Java)側>

package com.example; //自分のPackage名

public class MyPlugin //自分のclass{
    public String func_3() //関数(メソッド)設定、返り値(return)あり
  {
        return( "Hello world!!"); //関数の返り値
    }
}

<Unity(C#)側>

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetFunc : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_3; //ちゃんと受け取れているか確認するTMP

    string s3; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_3.text = GetFunc_3(s3); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetFunc_3(string msg3) //AndroidStudioの関数を呼び出す関数
    {
     //AndroidJavaObjectとAndroidStudioのPackage名.class名で
     //使用したい関数にアクセスできるようにする
     //Package名.class名は""で囲う
        using (AndroidJavaObject cls_3 = new AndroidJavaObject("com.example.MyPlugin"))
        {
       //CallでAndroidStudio側のStatic関数の呼び出し
            //関数名は""で囲う
            msg3 = cls_3.Call<string>("func_3"); 
        }
        return msg3; //AndroidStudio側から受け取った値をUnityで受け取る
    }
}

4.AndroidStudio(Java)のStaticではない変数の呼び出し

<AndroidStudio(Java)側>

package com.example; //自分のPackage名

public class MyPlugin //自分のclass{
    public static String mStr_4 = "aaaaa";
}

<Unity(C#)側>
GetとSetは一緒に使うような構成にする必要があります。

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetVari : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_4; //ちゃんと受け取れているか確認するTMP

    string s4; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_4.text = GetFunc_4(s4); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetVariable_4(string msg4) //AndroidStudioの関数を呼び出す関数
    {
     //AndroidJavaObjectとAndroidStudioのPackage名.class名で
     //使用したい関数にアクセスできるようにする
     //Package名.class名は""で囲う
        using (AndroidJavaObject cls_2 = new AndroidJavaObject("com.example.MyPlugin"))
        {
       //GetでAndroidStudio側の変数の内容取得
            //変数名は""で囲う
            msg2 = cls_4.GetStatic<string>("mStr_4");

       //SetでAndroidStudio側のStatic変数の内容を変更
            //変数名は""で囲う
            cls_4.SetStatic<string>("mStr_4", "Hello World");
        }
        return msg4; //AndroidStudio側から受け取った値をUnityで受け取る
    }
}

5.AndroidStudio(Java)のシングルトン(Singlton)関数(メソッド)の呼び出し

シングルトン(Singlton)については他の方が詳しく解説していただいています。

ただ、検索すると出てくるようにあまり多用はしない方が良いようです。
私は書くのが面倒で利用するにしても応用できるイメージが湧かないのであまり使っていません。

<AndroidStudio(Java)側>

package com.example; //自分のPackage名

public class MyPlugin //自分のclass{
    private static MyPlugin singleton = new MyPlugin(); //Singltonの初期化はここから
    private MyPlugin(){};

    public static MyPlugin getInstance()
    {
        if(singleton == null)
        {
            singleton = new MyPlugin();
        }
        return singleton;
    } //ここまで

    public String func_5() {
        return "Hello,World";
    }
}

<Unity(C#)側>

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetFuncSinglton : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_5; //ちゃんと受け取れているか確認するTMP

    string s5; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_5.text = GetFunc_5(s5); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetFunc_5(string msg_5)
    {
     //AndroidJavaClassとAndroidStudioのPackage名.class名で
     //使用したい関数にアクセスできるようにする
     //Package名.class名は""で囲う
        using (AndroidJavaClass cls_5 = new AndroidJavaClass("com.example.MyPlugin"))
        {
       //CallStaticでgetInstanceを取得
       //getInstanceも関数であるため
            using (AndroidJavaObject obj_5 = cls_5.CallStatic<AndroidJavaObject>("getInstance"))
            {
       
       //AndroidJavaObjectとAndroidStudioのPackage名.class名で
       //使用したい関数にアクセスできるようにする
       //Package名.class名は""で囲う
                msg_5 = obj_5.Call<string>("func_5");
            }
        }
        return msg_5;
    }
}

6.UnityのみでAndroidの関数(メソッド)を呼び出し

こちらはAndroidStudio(Java)側のコードを記入しなくてもAndroidの機能を使える書き方となっております。
AndroidStudioに最初から搭載されている関数(メソッド)を呼び出すため、
個人的にはAndroidStudioに詳しい人用の書き方だと思っています。

<Unity(C#)側>

using System.IO;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine;
using TMPro; //TextMeshPro(以下、TMP)を使用するための宣言

public class GetFuncUnityOnly : MonoBehaviour //自分のclass名
{
    [SerializeField] TextMeshProUGUI txtMessage_6; //ちゃんと受け取れているか確認するTMP

    string s6; //AndroidStudio側の返り値を受け取るための変数を用意

    void Start() //今回はStart関数で確認
    {
        txtMessage_6.text = GetFunc_6(s6); //TMPに関数を代入して、関数に変数を代入する
    }
    
    public string GetFunc_6(string msg6)
    {
        //unityとcontextの2行でUnityのContext(今のシーンに含まれる情報)を取得
        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject context = unity.GetStatic<AndroidJavaObject>("currentActivity");
        {

        //Callで各関数を呼び出し
            //今回はパッケージ情報に関する情報を取得していっている
            AndroidJavaObject pManager = context.Call<AndroidJavaObject>("getPackageManager");
            string pName = context.Call<string>("getPackageName");
            AndroidJavaObject pInfo = pManager.Call<AndroidJavaObject>("getPackageInfo", pName,0);

       //最終的に欲しい情報をGetで取得
            msg6 = pInfo.Get<string>("versionName");
        }
        return msg6;
    }
}

最後に

今回はAndroidStudio(Java)とUnityで情報のやり取りを行うネイティブプラグインについてまとめました。
最低限の要素が分からないまま話を進められてしまうことが多かったので、今回のまとめで最低限の構成が身に付けばと思いました。
自分を含め助けになれば幸いです。

参考

私が最低限の構成をまとめられるきっかけとなった記事はこちらになります。


この記事が気に入ったらサポートをしてみませんか?