連載
» 2011年07月04日 00時00分 UPDATE

Unityで楽々スマホ用3Dアプリ開発入門(2):UnityでAndroidの機能を拡張する2つの手法とは (1/3)

[佐藤大介,グリー株式会社 メディア開発本部]

UnityはAndroidの機能を自由に拡張できる!

 前回の「iOSアプリのAndroid移植も簡単なUnityの基礎知識」では、「Unity」の概要や使い方、Unityの機能を拡張するプラグイン、リモートデバッグツールなどを紹介しました。

 開発コストだけでなく移植コストを最小限に抑えてくれるUnityですが、よくあるマルチOS対応のソリューションでは、逆に個別のOSごとの個別実装ができない、あるいは難しいという点があったりします。

 特にネイティブコードとの連携、ネイティブデバイスとの連携などが最たるものです。しかしUnityでは、この問題を解決する方法を提供しています。

 今回はUnityが提供しているネイティブコードとの連携手段として、以下の2つの方法についてサンプルコードを交えて解説します。

  1. JNIでUnity側からJavaクラスを呼び出す
  2. Unityを実行しているActivity自体をカスタマイズ

JNIでUnity側からJavaクラスを呼び出す準備

 手始めに、ありきたりではありますが、Javaクラス内で出力した文字列「Hello World」をUnity側で取得するサンプルから説明します。どうやってUnityからJava側のクラスメソッドを呼び出すのか確認しましょう。

【1】Unityプロジェクト「HelloWorldJNI」の新規作成

 [File]→[New Project]で「HelloWorldJNI」プロジェクトを作成します。パッケージは特にインポートしません。

【2】Android用にビルド設定

 [File]→[Build Settings...]から[Build Settings]を開き、[Platform]を「Android」にして[Switch Platform]を押します。[Player Settings...]を押して[Inspector]ウィンドウにて[Bundle Identifier]にパッケージ名を指定します。ここでは「com.example.unity.hello」とします。

【3】呼び出し先のJavaクラス「HelloWorldJava」を作成

 Javaクラスの開発環境には何を利用しても構いません。ここではEclipseを利用してプロジェクトとクラスを作成しました。

 例として、パッケージ名を「com.example.java.helloworld」とし「HelloWorldJava」クラスを作成し、コンストラクタ1つと、静的メソッドを1つ、インスタンスメソッドを1つ作成しました。

package com.example.java.helloworld;
 
public class HelloWorldJava {
 
    public HelloWorldJava(){
    }
 
    static public String getStaticHello(){
        return "Hello World, Static!";
    }
 
    public String getHello(){
        return "Hello World!";
    }
}
  • public HelloWorldJava():コンストラクタ
  • static public String getStaticHello():静的関数として「Hello World Static!」文字列を返す関数
  • public String getHello():インスタンス関数として「Hello World!」文字列を返す関数

【4】クラスのビルドとJARファイルの設置

 作成したクラスをコンパイルし、JARファイルにしてUnityプロジェクトのディレクトリ内に設置します。ここでは、Eclipseの[JAR Export]機能を用いて「HelloWorldJava.jar」として作成しています。

図1 [JAR Export]ダイアログ 図1 [JAR Export]ダイアログ

 保存先には決まりがあり、「【Unityプロジェクトディレクトリ】/Assets/Plugins/Android/」の下に設置する必要があります。

図2 【Unityプロジェクトディレクトリ】/Assets/Plugins/Android以下に設置 図2 【Unityプロジェクトディレクトリ】/Assets/Plugins/Android以下に設置

C#からJNIアクセスを簡単にするヘルパークラス

 UnityからJavaクラスを読み出す方法はいくつかありますが、一番分かりやすく簡単な方法は、Unityスクリプト上からC#JavaScriptなどを用いてのJNI(Java Native Interface)アクセスを簡単にするヘルパークラス「AndroidJNIHelper」を利用する方法でしょう。

 JNIと、後ほど使うAndroid NDKについての詳細は、以下の記事を参照しておいてください。

ヘルパークラスを利用するためのコードを入手

 このヘルパークラスを利用するためのコードは、Unityのサイトからダウンロードできます。Unity Pluginに関するページの「Java Plugin Sample」の項目において「AndroidJNIHelper」を用いたサンプルアプリが提供されており、この中に下記で利用している各ファイルが提供されています。

.
└─JavaPluginSample
├─Assets
│ │
│ └─Plugins
│ │ JavaVM.cs ←利用する
│ │ JNI.cs ←利用する
│ │
│ └─Android
│ │
│ ├─bin
│ │
│ ├─jni
│ │ Android.mk ←利用する
│ │ jni.cpp ←利用する
│ │
│ ├─libs
│ │
│ └─src
│
└─Library

Android NDKを用いてヘルパークラス用のネイティブライブラリをビルド

 まず、ヘルパークラス用のネイティブライブラリ「libjni.so」をコンパイルするために、jni.cppファイルと、NDKビルド用のファイル「Android.mk」をJavaプロジェクト内の「jni」ディレクトリに設置します。

図3 Eclipseの[Package Explorer] 図3 Eclipseの[Package Explorer]

 そして、Android NDKを用いてビルドします。

$ pwd
/Users/daisuke.sato/workspace_from0308/itmedia/HelloWorldJava
$ ls
bin        jni        src
$ ndk-build -B (Android NDK提供のコマンドを実行)
Compile++ arm : jni 
/Users/daisuke.sato/workspace_from0308/itmedia/HelloWorldJava/libs/armeabi

 ビルドすると「./libs/armeabi/」の下にlibjni.soファイルができます。

$ ls
bin jni libs obj src
$ ls -l ./libs/armeabi/
total 88
-rwxr-xr-x 1 daisuke.sato staff 41776 3 21 17:56 libjni.so

 生成されたlibjni.soをJARファイルと同じ場所に設置します。すると、Unityプロジェクトのディレクトリ構成は下記のようになります。

図4 生成された「libjni.so」ファイルを設置 図4 生成された「libjni.so」ファイルを設置

 次ページでは、Javaクラス呼び出し用C#スクリプトを作り、実際に動かしてみます。また、UnityがAndroid上で、どのように動作しているのかを解説します。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。