Unityからネィティブプラグインを使う

ネィティブ周りのど素人が苦戦しながら調べてみました。

検証環境:
Windows 7 32bit
Android Studio 2.1.3
Unity 5.3.5p8
JDK 1.8
実機Android 5.0.1 
実機iOS 8.3
Xcode 7.2.1

#プラグインを配置するフォルダを作成
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/ba48791d-87ba-8766-40b6-25295737c7da.png)
AndroidとiOSのフォルダをPluginsのしたに作成します。


#Android用にjarファイルの作成
ざっと調べた限り手段(C++とか)がいくつかあるようですが、今回はJavaで連携することとします。

Android Studioでjarファイルを作成します。
「Start a new Android Studio project」
にて新規プロジェクトを作成します。

ちょっとわかりくいですが、今回は「Twitter」というUnityのプロジェクトの直下に「MyPlugins」というAndroid Studioのプロジェクトを作成します。
ちなみに別にここに作成することは必須ではないです。
都合上、Unityプロジェクトに含めてみただけです。自分がわかりやすいところに作成してください。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/793eaf0f-2e63-ad25-37ac-247367bbd58d.png)

「Add No Activity」でActiviyなしのシンプルなプロジェクトを作成します。
![キャプfチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/ef408c04-da0e-fe4d-d78c-dde1368b7df2.png)

下図のような感じで新規Moduleを作成します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/afaa3dfb-d7c6-b056-fc5e-18f7ce72756c.png)

「Android Library」で作成します。
![キャffプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/a229408a-21bd-c38d-adc4-3036075a05b3.png)

「twitter」という名前で作成しました。
![キャ1プチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/0d2ed9aa-bd30-fa9f-7ed9-0dd021942866.png)

Unityの機能をAndroidから使うため、classes.jarを配置します。
今回の環境では以下に存在しました。
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar

android.jarも配置します。
C:\Users\okuhiiro\AppData\Local\Android\sdk\platforms\android-23\android.jar

これを下記場所にコピーします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/2fa53801-63c2-5a9d-ab18-1758b7afb893.png)

ソースコードを以下に記述しました。
トーストを出すだけの簡単なものです。
![キャqプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/1d7e4a94-e7bd-7c28-ad76-b8e3df23ae3c.png)

```java:Twitter.java
package okuhiiro.twitter;

import android.app.Activity;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;

public class Twitter {
    public static void ShowToast() {
        final Activity activity = UnityPlayer.currentActivity;
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(activity, "OK!!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
```

UnityPlayerがうまくimportできない場合は、下記ボタンでSyncしてください。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/616a1505-4874-be7a-511d-3b6386fcbd87.png)

作成したtwitterモジュールのbuild.gradleを編集します。
デフォルトのファイルから追加した行とコメントアウトしたところは下記になります。

```java:build.gradle
//apply plugin: 'com.android.library'
apply plugin: 'java' // 追加

//android {
//    compileSdkVersion 23
//    buildToolsVersion "24.0.2"
//
//    defaultConfig {
//        minSdkVersion 15
//        targetSdkVersion 23
//        versionCode 1
//        versionName "1.0"
//    }
//    buildTypes {
//        release {
//            minifyEnabled false
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//        }
//    }
//}

dependencies {
    //compile 'com.android.support:appcompat-v7:23.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //testCompile 'junit:junit:4.12'

    sourceCompatibility = 1.7 // 追加
    targetCompatibility = 1.7 // 追加
}

// 以下追加
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
```

以下コマンドでビルドします。
初回はどこからかビルドするためのものをダウンロードしてくる可能性があるので時間がかかりました。

```
C:\Users\okuhiiro\Unity\Twitter\MyPlugins>gradlew jar
```

**警告: [options] ブートストラップ・クラスパスが-source 1.7と一緒に設定されていません**
とでましたが今回は**無視**。 :laughing:

以下場所にjarファイルが生成されました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/262d4100-43fc-7786-8b96-f19255ff4323.png)

#UnityからjarのメソッドをCallする
作成したjarを「プラグインを配置するフォルダを作成」で作成した「Android」の下にいれます。

適当にuGUIでボタンを作成しました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/23074d8c-1fd8-0a64-a019-3b951f47f180.png)

このボタンに下記イベントを割り当てています。

```csharp
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class TwitterController : MonoBehaviour {

	public void OnTwitter()
	{
#if UNITY_EDITOR
        Debug.Log("UnityEditorでは使用できません");
#elif UNITY_ANDROID
		// パッケージ名 + クラス名を引数にする
		using (AndroidJavaClass javaClass = new AndroidJavaClass("okuhiiro.twitter.Twitter"))
		{
			// そのクラスのメソッドを指定する.
			// 引数があるの場合は、第2引数以降がそのメソッドの第1引数に該当する.
			javaClass.CallStatic("ShowToast");
		}
#endif
    }
}

```

ボタンを押下すると無事トーストがでました。
<img width="320" alt="IMG_0081.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17192/bbbbd490-75ed-573d-9a55-0109614c5459.png">

#iOS用にmmファイルの作成
続いてiOS。mmファイルをおくだけであとはUnityがやってくれるのでAndroidと違い比較的簡単。

下記の「プラグインを配置するフォルダを作成」で作成した「iOS」の下にいれます。

```objc
extern "C" {
    void TestAlert() {
		UIAlertView *alert = [[UIAlertView alloc]
					initWithTitle:@"タイトル"
					message:@"ほげ"
					delegate:nil
					cancelButtonTitle:@"OK" otherButtonTitles:@"NO", nil
		];
		[alert show];
    }
}
```

#Unityからobject-cのメソッドをCallする

Androidと同じで適当にuGUIでボタンを作成しイベントをつけておきます。
つけるイベントは下記です。上のAndroidのやつに追記しました。
UNITY_IOSで分岐されているところが追加したところです。

```csharp
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class TwitterController : MonoBehaviour {
#if UNITY_IOS
    [DllImport("__Internal")]
    static extern void TestAlert();
#endif

	public void OnTwitter()
	{
#if UNITY_EDITOR
        Debug.Log("UnityEditorでは使用できません");
#elif UNITY_ANDROID
		// パッケージ名 + クラス名を引数にする
		using (AndroidJavaClass javaClass = new AndroidJavaClass("okuhiiro.twitter.Twitter"))
		{
			// そのクラスのメソッドを指定する.
			// 引数があるの場合は、第2引数以降がそのメソッドの第1引数に該当する.
			javaClass.CallStatic("ShowToast");
		}
#elif UNITY_IOS
        TestAlert();
#endif
    }
}
```

ボタンを押下すると無事アラートがでました。
<img width="320" alt="IMG_0081.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17192/90b96f9e-9217-c78e-60df-65d3b8f1e01e.png">

#続き
で[次回](http://qiita.com/okuhiiro/items/545b0c38636b264176f2)で本当にやりたかったこと。