UnityとAndroidネイティブの連携:UnityからネイティブのActivityを呼び出す[part2]

UnityとAndroidネイティブの連携 の投稿一覧

今回は、AndroidネイティブのActivity呼び出し後にResourceファイルを使用する場合の実機検証を行いました。

環境

  • OSX Yosemite v10.10.4
  • Unity v5.1.2f1
  • AndroidStudio v1.3.1
  • 検証端末 Nexus7(2012) v5.1.1

Androidそのままで動作させる際は R.hoge.moge といった記述をするだけで良いところが、UnityからAndroidプラグインを使用する場合では上手くいきません。
具体的には
android.content.res.Resources$NotFoundException: Resource ID #0x0
のように、リソースの参照エラーとなります。
これを回避するには、Androidそのままで動作させる場合と比較して2点修正することになります。

修正点1:javaファイルの記述を変更する

先述の通り、R.~~ が使用できません。代替の記述としてgetIdentifier()を使用します。
下記は、AndroidLibraryモジュールのBlankActivityを生成したものを必要な箇所修正した例です。

public class ResTestActivity extends Activity {

    private Resources r;
    private String packageName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        r = getResources();
        packageName = getPackageName();
        setContentView(r.getIdentifier("activity_res_test", "layout", packageName));
    }
/*以下略*/

修正点2:resディレクトリをUnityプロジェクト内に配置する

UnityプロジェクトのAndroidプラグイン配置先、~/Assets/Plugins/Android直下にresディレクトリをそのまま移植するだけでokです。

実行例

前回の記事のプロジェクトを利用して、Unityボタンを増やし起動検証を行いました。
もし修正が不十分な場合、ボタンを押した = Activityを呼び出した時点でアプリが落ちてしまいます。
test1 test2