ぐーるらいふ

底辺。

【Unity】【Android Plugin】android連携で画像を読み込みたかっただけなのにちょっとハマった話

お疲れ様です。ぐーるです。
最近もお絵描きの練習と新しいゲームの開発をコツコツやってます。
もうすぐ1weekまた始まるんでしたっけ。
ヤバい。Inventoryシステムの完成を急ぎたい。

Androidプラグイン

UnityからAndroidネイティブの機能を使いたい場合はプラグインを作成する必要があります。
作り方についてはちょっと調べると沢山出てくるのでここでは割愛。
プロジェクト作って、
新しくモジュール追加でLibrary選んで、
適当にコード書いてビルドして、
aarからjar取り出すかbundlesの下から取ってきて、
Plugins/Androidの下に配置すればOKってな具合です。

まぁ大概はビルド&配置task作って楽しますかね。

画像が出ない?

画像を読み出す時はこんな感じのコードを書きます。

// res/drawable/hogehoge.pngを読み出す
Context unityContext = UnityPlayer.currentActivity.getApplicationContext();
int resourceId = unityContext.getResources().getIdentifier("hogehoge", "drawable", unityContext.getPackageName());

ふむふむ、なるほど。ではこのまま書こう。
と書いてみるとhogehoge.pngが読めない。
えー何故だ!?Plugins/Android/res/drawableの下にちゃんと置いてるよ?と。
今回はこのお話。

結論

ハッキリ言ってしまえば配置ミスです。
こう配置する必要がありました。

// Plugins/Android/の下
res/drawable-hdpi-v4/
res/drawable-ldpi-v4/
res/drawable-mdpi-v4/
res/drawable-xhdpi-v4/
res/drawable-xxhdpi-v4/
res/drawable-xxxhdpi-v4/

正解は全部作って全部にちゃんとhogehoge.png入れとけ!です。これだけ。

出来上がったjarかAndroid exportしたAndroidプロジェクトを見てみればすぐわかりますが、
res/drawableの下に置いたビルド後に画像が無くなってるんですよね。
恐らくUnity側でそこは自動でアイコンを配置したりなどで使ってて
何か入れておいても無視されてる様子。

Androidやってる人からしたら常識なのかもしれないですが、
dpiによってリソース分けられてるんですよね。すっかり忘れてました。

余談

アイコン読み出したいときはこう書きます

Context unityContext = UnityPlayer.currentActivity.getApplicationContext();
// iconを読み出す
PackageManager packageManager = unityContext .getPackageManager();
ApplicationInfo applicationInfo = null;
try
{
    applicationInfo = packageManager.getApplicationInfo(unityContext .getPackageName(), PackageManager.GET_META_DATA);
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
    return;
}
appIconResId = applicationInfo.icon; // iconのリソースIDを取り出す