Godot4.1.1でAndroidPlugin V1を動かしてみた

　Android StudioでGodot Androidプラグイン(v1アーキテクチャ)用Android Libraryを作成して、Godotのサンプルプロジェクトに組み込み、実行するまでの手順をまとめました。

https://docs.godotengine.org/en/4.1/tutorials/platform/android/android_plugin.html#android-plugin

:::note
 Godot 4.2では、Android Pluginがバージョンアップして、v2アーキテクチャになるようです。
:::

# 名前の関係
　GodotのAndroidプラグイン用のAndroid Libraryを生成して使うときの、ファイルと名前の関係を整理しました。
　黄色の矢印は、元の名前を、矢印先に設定するという意味です。
![2023-10-15 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/48e6c9a2-a207-9c46-e7a8-0fee51bc3814.png)
①Godot Download pageからダウンロードしたgodot-lib.4.1.2.stable.template_release.aarを配置して、build.gradle(Module:androidlib)に依存関係を設定する。
②org.godotengine.godot.plugin.GodotPluginを派生したクラスのパッケージ名付きクラス名を、AndroidManifest.xmlに設定
③生成したAndroidライブラリのファイル名を、Godotプロジェクトのandroid/plugins配下に置いたgdapファイルの「binary=」に設定
④Godotプロジェクトのandroid/plugins配下に置いたgdapファイルの「name=」に設定した名前が、GodotのAndroidエクスポートの「プラグイン」オプションに自動的に表示される
⑤JavaクラスのgetPluginNameメソッドで返す文字列識別子を指定して、GDScriptからAndroidプラグインを検索し、singletonのインスタンスを取得する
⑥Javaクラスの@UsedByGodotでアノテーションしたメソッドを、GDScripから使用できる

# Godotプラグイン用のAndroid Libraryを作成
　Android Studioを使用して、Android Libraryをビルドする環境を準備します。Godot Engine Libraryへの依存関係を設定し、GDScriptから呼び出すクラスとメソッドを作成します。
　Android Studioは、Electric Eel | 2022.1.1 Patch 1を使用しました。
## Android StudioでNew Projectを作成する
「New Project」ボタンを押下します。
![2023-10-14 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/3c3ae2bd-f256-be3f-a854-b91ca5519107.png)

「No Activity」を選択します。今回はActivityは使用せず、しかも後で削除するので何でも良いです。
![2023-10-14 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/dff62fc7-492a-9785-c245-e5a637a47718.png)

新規プロジェクトのNameとPackage name、Save locationなどを設定して、「Finish」ボタンを押下します。

![2023-10-14 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6957f238-97cc-4712-0e13-9a833bf48cbe.png)

Android Studioが必要なファイルのダウンロードやビルドなどを開始して、忙しそうなので、落ち着くまで待ちましょう。下記のように、プロジェクトファイル（appやGradle Scrips)などが表示されて、左下にfinishが表示されるとよいと思います。
![2023-10-14 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/be6f632f-4022-b55a-4a70-63b8dde3c1d4.png)

## Android Libraryを作成するためのモジュールを追加する
　Android Libraryを作成するためのモジュールを追加します。

　Fileメニューから「Project Structure...」を実行します。
![2023-10-14 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/8578621b-29ea-1a79-6c0c-9c14c1447f64.png)
 「Modules」を選択し、「＋」（New Module）ボタンを押下します。
![2023-10-14 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/b4949c8b-edaa-ec11-373a-56a3bd4ef177.png)
「Android Library」を選択し、Module Nameを入力しPackage nameを確認して、「Finish」ボタンを押下します。

| 項目名 | 設定値 | 用途 |
|:-|:-|:-|
| Module name  | androidlib  | Package nameに反映されます  |
| Package name  | com.footinglow.androidlib  | 後でAndroid manifest.xmlで使用します  |

![2023-10-14 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/3f6ca556-cc5b-839c-ce01-bdf1d331ed47.png)
「Finish」ボタンを押下すると、gitに追加するファイルの確認ダイアログが表示されます。確認して、「Add」ボタンを押下します。
![2023-10-14 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/51f89ce1-a742-1ecd-e5a8-76ad3f84d689.png)
「androidlib」が追加されました。
![2023-10-14 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/4b24c753-690a-d2c3-d1a0-310118c7c040.png)
プロジェクトエクスプローラでも「androidlib」のフォルダを確認できます。Gradel Scriptsにも「build.gradle(Module:androidlib)が追加されました。
![2023-10-14 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/4b97ecd7-030e-6549-e50e-d23604589001.png)

## 不要な「app」を削除する
　今回は、アプリケーションモジュール「app」は不要なので削除します。
　Fileメニューの「Project Structure...」を実行します。Modulesを選択後、「app」を選択して「－」（Remove Module）ボタンを押下します。

![2023-10-14 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/dd3104f0-a75d-7c9c-1b14-8d5e7f7c84e1.png)
削除されました。
![2023-10-14 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/34673fab-dfed-ea92-cdce-9f7b11709576.png)
プロジェクトエクスプローラから「app」フォルダとGradel Scriptsの「build.gradel(Module app)も削除されました。
![2023-10-14 (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/f5774150-e664-8d83-a47c-6e627f0e3986.png)

## Android Libraryに、Godot Engine Libraryを追加する
　GodotからAndroid Libraryを呼び出すためには、「Godot Engine Libary」をAndroid Libraryにリンクする必要があります。使用するGodotのバージョンに対応しているものをダウンロードしましょう。

https://godotengine.org/download

今回、Godot 4.1.1stableを使用しているため、「You can find previous releases in the download archive.」のリンクから4.1.1-stableのリンクに行きます。
　最初表示されていませんが、「Show all downloads」をクリックすると「AAR library
Android plugins · Java · Kotlin」が表示されます。クリックしてダウンロードします。
　ファイル名は**godot-lib.4.1.1.stable.template_release.aar**でした。

## ダウンロードしたGodot Engine LibraryをAndroid Libraryに移動する
　ダウンロードしたGodot Engine Libraryの**godot-lib.4.1.1.stable.template_release.aar**を先ほどAndroid Studioで作成したプロジェクトのフォルダ内に移動して、関連付けをします。

　移動先のフォルダを表示するためにAndroid Studioのプロジェクトエクスプローラの「Android ▽」をクリックして、「Project Files」の表示に変更します。
![2023-10-14 (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/eb8cb01a-5ced-8199-a272-3eb3ddbc6bb5.png)
追加したAndroid Library Moduleの「androidlib」の下にある「libs」が見えるようにします。
![2023-10-14 (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/06704660-3f34-1a34-ea50-c74551f41f5c.png)

　Windowsのエクスプローラを開いて、**godot-lib.4.1.1.stable.template_release.aar**ファイルを「androidlib/libs」にドラッグして移動しましょう。
　ドラッグするとダイアログが表示されるので、「Refactor」ボタンを押下するとファイルの移動が完了します。
![スクリーンショット (847).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/0470991f-4f36-586a-3935-de12afe52846.png)

## Android LibraryモジュールにGodot Engine Libraryへの依存関係を追加する
　Android Libraryモジュール「androidlib」に、先ほど移動したGodot Engine Libraryの**godot-lib.4.1.1.stable.template_release.aar**への依存関係を設定します。
　Projectメニューから「Project Structure...」を実行します。
　Dependencies、androidlibと選択し、Declared Dependenciesの下の「＋」（Add Dependency）ボタンを押下します。
![2023-10-14 (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/b2ee455f-a792-2474-dd28-8afa12a4484e.png)
「2 JAR/AAR Dependency」を実行します。
![2023-10-14 (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/8c52a4ab-4463-cb10-cd14-45120657b671.png)
step 1に「libs/godot-lib.4.1.2.stable.template_release.aar」を手入力します。Step 2はimplementationのままで、OKボタンを押下する。(本当はStep 2はcompileOnlyにしたいが選択肢にない）
![2023-10-14 (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/ebf8c6a0-a9bb-fa04-1e50-418df259b7b1.png)

## 
　プロジェクトエクスプローラの表示が「Project Files」のままの場合、「Android」に戻します。
![2023-10-14 (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/f43876fd-d9a1-cace-92fb-e38b6bf22742.png)
プロジェクトエクスプローラのbuild.gradle(Module:androidlib)を開きます。
先ほど追加した依存関係がそのまま
「implementation files('libs/godot-lib.4.1.2.stable.template_release.aar')」とあるので、「implementation」を「compileOnly」に変更します。
![2023-10-14 (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/e066aee0-4872-ba68-5f81-8e8647802bc9.png)

## org.godotengine.godot.plugin.GodotPluginの派生クラスを追加する
　org.godotengine.godot.plugin.GodotPluginの派生クラスを追加します。
　そうするとGodotで実行時する時にSingletonでインスタンス化されます。

　パッケージを右クリックして、
![2023-10-14 (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/1e846718-f75f-2b03-cbba-069cc89fabc9.png)
NewからJava Classを選択します。
![2023-10-14 (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/1b397923-312b-01bd-44a2-71851c8e2594.png)
クラス名を入力します。後でパッケージ名付きにしてAndroid Manigest.xmlに設定します。

| 項目名 | 設定値 | 用途 |
|:-|:-|:-|
| Class名  | GodotExtendedPlugin  | 後でAndroidManifest.xmlに設定します  |

![2023-10-14 (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/c377b86e-8650-d746-1cf1-e68b2fa29118.png)
　このように追加されます。
```java
package com.footinglow.androidlib;

public class GodotExtendedPlugin{
}
```
 「org.godotengine.godot.plugin.GodotPlugin」の派生クラスに変更しましょう。
```java
package com.footinglow.androidlib;

public class GodotExtendedPlugin extends org.godotengine.godot.plugin.GodotPlugin{
}
```
２つのエラーが指摘されます。Constructorが無い、と、getPluginName()の実装が無い、です。
クラス定義のあたりを右クリックして、Generateを実行しましょう。
![2023-10-14 (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/d7facbbd-06e3-d54b-4464-50dd39beae65.png)
「Constructor」を実行しましょう。
![2023-10-14 (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/e9d380ec-7e4f-d8e4-a452-d0f55d347527.png)
同様にGenerateを実行して、「Implement Methods...」を実行します。
![2023-10-14 (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/65ff4f57-852a-2bcf-a5b3-ceeb3fd09558.png)
「getPluginName():String」を選択した状態でOKを押下します。
![2023-10-14 (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/98d69907-1dbf-52fa-f78b-80457b689861.png)

下記のようになります。
またgetPluginNameメソッドのreturn文字列は、GodotのGDScriptからプラグインを検索する時の識別子になるので、適切な名称を設定しましょう。ここではクラス名と同じにしました。

| 項目名 | 設定値 | 用途 |
|:-|:-|:-|
| getPluginNameメソッドのreturn文字列  | "GodotExtendedPlugin"  | GDScriptからPluginを検索する時の文字列識別子  |

```JAVA
package com.footinglow.androidlib;

import androidx.annotation.NonNull;

import org.godotengine.godot.Godot;

public class GodotExtendedPlugin extends org.godotengine.godot.plugin.GodotPlugin{
    public GodotExtendedPlugin(Godot godot) {
        super(godot);
    }

    @NonNull
    @Override
    public String getPluginName() {
        return "GodotExtendedPlugin";
    }
}

```

## GodotのGDScriptから実行するメソッドを定義する
　GodotのGDScriptから実行するメソッドを定義しましょう。
　GDScriptから呼び出したいメソッドは「@UsedByGodot」でアノテーションする必要がありますので、「import org.godotengine.godot.plugin.UsedByGodot;」を追加しましょう。
　あとは動作確認用に固定の文字列を返すgetMyMessageメソッドを追加しましょう。

```JAVA
package com.footinglow.androidlib;

import androidx.annotation.NonNull;

import org.godotengine.godot.Godot;
import org.godotengine.godot.plugin.UsedByGodot;

public class GodotExtendedPlugin extends org.godotengine.godot.plugin.GodotPlugin{
    public GodotExtendedPlugin(Godot godot) {
        super(godot);
    }

    @NonNull
    @Override
    public String getPluginName() {
        return "GodotExtendedPlugin";
    }

    @UsedByGodot
    public String getMyMessage() {
        return "Hello, Android Plugin!";
    }
}

```

## AndroidManigest.xmlにPluginがロードするクラスを定義する
　AndroidManifest.xmlにAndroid Pluginがロードするクラス名を定義します。
![2023-10-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/8edc09d4-6adf-1b28-2c5a-c6d4b2bdeffc.png)

android:nameは「org.godotengine.plugin.v1.」までがとても大事です。Godot Pluginは、おそらくandroid:nameでプラグイン対象かを判断していると思います。
android:valueは追加したクラスをパッケージ名付きで設定します。

| 項目名 | 設定値 | 用途 |
|:-|:-|:-|
| android:name  | org.godotengine.plugin.v1.GodotExtendedPlugin  | android:nameは「org.godotengine.plugin.v1.」までが必須。その後の名称は何でもよさそう  |
| android:value  | com.footinglow.androidlib.GodotExtendedPlugin  | Pluginがロードするクラスを正しく設定する  |

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <meta-data
            android:name="org.godotengine.plugin.v1.GodotExtendedPlugin"
            android:value="com.footinglow.androidlib.GodotExtendedPlugin" />
    </application>
</manifest>
```

## Android Library AARファイルの出力を確認する
　プロジェクトエクスプローラの表示を「Project Files」に変更すると、Android Library AARファイルが、build/outputs/aar/androidlib-debug.aarに出力されます。
![2023-10-15 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/95c10eb6-d7f4-dd2b-4b5a-b295240ea0ef.png)
　出力されていない場合は、Buildログでエラーが無いか確認しましょう。
　「Build」メニューからRebuild Projectを実行してみましょう。
![2023-10-15 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/f41af400-2ca0-8778-c56f-60b7cd5fc6f6.png)

# GodotプロジェクトにAndroid Libraryをインストールする
 出力したAndroid Libraryを、Godotサンプルプロジェクトにインストールします。

## Godotサンプルプロジェクトを作成する
　Android Libraryから取得した文字列をコントロールに表示するサンプルプロジェクトを作成します。
![2023-10-15 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/0a070d3a-0157-c8b8-f70a-2554fd1c06a7.png)

　Godotが起動したら、シーン内の「ユーザインタフェース」ボタンを押下して、Contolをトップノードします。子ノードにlabelを追加します。
　Controlにスクリプトをアタッチして下記のスクリプトを追加しましょう

```GDScript
extends Control

func _ready():
	if Engine.has_singleton("GodotExtendedPlugin"):
		var singleton = Engine.get_singleton("GodotExtendedPlugin")
		$Label.text = singleton.getMyMessage()
	else:
		$Label.text = "No Plugin"
```
 実行して、「No Plugin」と表示されればOKです。

## Androidビルドテンプレートのインストール
　プロジェクトメニューから「Androidビルドテンプレートのインストール」を実行します。
　完了すると、Godotプロジェクトがあるフォルダに「android」ディレクトリが作成されます。

## Android Libraryをインストールする
　Androidライブラリのプロジェクトフォルダの、androidlib\build\outputs\aar\androidlib-debug.aarを、Godotプロジェクトフォルダのandroid/pluginsにコピーします。
![2023-10-15 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/2e498355-a293-5f8c-d97a-48bcf2bd077c.png)

　同じフォルダに、拡張子「.gdap」のテキストファイルを作成し、Godot EngineにAndroidプラグインを認識させます。ファイル名は、aarファイル名に、「.gdap」拡張子をつけて、「androidlib-debug.aar.gdap」にしました。
　中は下記のようにします。[dependencies]に設定するものは、今回はありません。
　「name=」の後ろに設定した文字列が、GodotのAndroidエクスポートのオプションのプラグインカテゴリに表示されます。
```
[config]

name="GodotExtendedPlugin"
binary_type="local"
binary="androidlib-debug.aar"

[dependencies]
```
| 項目名 | 設定値 | 用途 |
|:-|:-|:-|
| name  | GodotExtendedPlugin  | GodotのAndroidエクスポート内のプラグインオプション表示名  |
| binary_type  | local  | localで良いと思います  |
| binary  | androidlib-debug.aar  | Android Libraryのファイル名  |




## Androidエクスポートするための設定
　プロジェクトメニューからプロジェクト設定を開いて、右の方にある「Advanced Settings」を有効にします。レンダリングのテクスチャの「Import ETC2 ASTC」にチェックを入れます。
　保存して再起動ボタンを押下します。

## Androidエクスポートの設定
　「プロジェクト」メニューの「エクスポート...」を実行します。「追加...」からAndroidを選択します。
　gdapファイルが正しいと、「プラグイン」にgdapファイルで設定したnameが表示されるので、チェックを入れて有効にします。
　プラグインを使用する場合は、Gradle Buildの「Use Gradle Build」のチェックを有効にする必要があります。
![2023-10-15 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6feb4614-400b-1ac9-7572-0fab13d9726e.png)

## Androidスマホで実行
　apkファイルをAndroidスマホにインストールして実行して、「Hello, Android Plugin!」と表示されれば成功です。

# 終わりに
　GodotでAndroid Pluginを使用するとAndroidの機能を使えるようになり自由度が高くなります。
　アプリ内課金、広告、Google Play Consoleのリーダーズボードなどを使う場合はAndroidプラグインを使うことになりそうです。
　デメリットとしては、当たり前ですがAndroid専用になるということ。マルチプラットフォームを前提としている場合は、なるべくAndroidプラグインへの依存が最小になるように設計しましょう。

# github
ソースファイルはこちらです。

https://github.com/footinglow/Godot4/tree/main/03_study/AndroidPlugin1

以上です。