Unity & iOSプラグイン連携

UnityとiOSプラグインの連携学習をまとめました。

環境：
MacOSX Yosemite 10.10.3
Unity ver. 5.0.2p4
Xcode 6.3.1
検証機　iPod Touch iOS8.3

<h1>概要</h1>
Unity C#からObjective-Cを呼び出して処理をおこなう、という簡単なサンプルを作る手順をまとめました。具体的には、画面上のボタンを押すとObjective-Cのコードで計算を行い、結果をC#に返し画面上に出力するというものです。

<h2>イメージ</h2>
メソッド呼び出しイメージは
C# →　C++　→　Objective-C
のようになります。

<h1>Unity側</h1>
<h2>シーン挙動制御用</h2>
シーン初期化とボタン配置と押下時の挙動、そして結果をラベルに反映する

```
    private int num = 0;
    public UILabel num_label;
   
    void Awake()
    {
        Init();
    }

    void Init(){
        num = 0;
        setNumLabel();
    }

    // Use this for initialization
    void Start () {
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 100, 40), "+ 10"))
        {
            // Unityエディタ上なら何もしない
            #if UNITY_EDITOR
              Debug.Log("NOT IOS. DO NOTHING.");
            #elif UNITY_IOS
              num = IOSPluginCallManager.PlusTen();
              setNumLabel();
            #endif
        }

        if (GUI.Button(new Rect(10, 60, 100, 50), "- 10"))
        {
　　　　　　　// Unityエディタ上なら何もしない
            #if UNITY_EDITOR
              Debug.Log("NOT IOS. DO NOTHING.");
            #elif UNITY_IOS
              num = IOSPluginCallManager.MinusTen();
              setNumLabel();
            #endif
        }
    }

    void setNumLabel(){
        num_label.text = num.ToString();
    }
```

<h2>iOS側のソースとの連携</h2>

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

public class IOSPluginCallManager {

    // iOS側で用意したメソッド定義
    [DllImport("__Internal")]
    static extern int addTen();
	
    [DllImport("__Internal")]
    static extern int subTen();

    public static int PlusTen() {
        return addTen();
    }

    public static int MinusTen() {
        return subTen();
    }
}
```

これでUnity側の準備は完了です。

次にプラグインを作っていきます。

<h1>iOS側</h1>
UnityからC++で命令を受け取る仕組みを作ります。
XcodeでCocoa Touch Static Libraryを選択してプロジェクトを作成します。
![スクリーンショット 2015-06-28 9.28.20.png](https://qiita-image-store.s3.amazonaws.com/0/58014/20197741-5e41-06e3-9ad1-6980a7ea3d6d.png)

<h2>C＋＋</h2>
作成したプロジェクトに新規でC++ファイルを作成します（同時にヘッダファイルも作成されるかと思います。また、C++ファイルの拡張子が.cppのときは手動で.mmに変えてやります。）。 
作成した.hファイルに下記を追加します。

```
extern "C"{
    int addTen();
    int subTen();
}
```


.mmファイルは下記のようにします。（PluginSampleProjはObjective-Cのクラス）

```
#include "PluginTest.h"
#include "PluginSampleProj.h"

int addTen()
{
    NSLog(@"addTen method is invoked.");
    int num = 10;
    return [PluginSampleProj calc:num];
}


int subTen(){
    NSLog(@"subTen method is invoked.");
    int num = -10;
    return [PluginSampleProj calc:num];
}
```

<h2>Objective-C</h2>

.hファイル

```
#import <Foundation/Foundation.h>

@interface PluginSampleProj : NSObject
{
    
}

+ (int) calc:(int)_num;

@end
```

.mファイル

```
#import "PluginSampleProj.h"

@implementation PluginSampleProj

int num = 0;

+ (int)calc:(int)_num{
    num += _num;
    NSLog(@"result: %d", num);
    return num;
}

@end
```

これでプラグインソースの準備は完了です。
次にビルドしてUnityの/Assets/Plugins/iOS配下にxcodeで生成した上記ファイルを含むプロジェクトを配置して、ビルドプラットフォームがiOSであることを確認しUnityプロジェクトのビルドをしてください。
Unityでのビルドに成功するとxcodeプロジェクトが任意のディレクトリに吐き出されるのでそれをダブルクリックします。xcodeが開くのでrunしてください。

アプリが起動し、画面上のGUIボタンを押すとxcodeのoutputに

```
addTen method is invoked.
result: 10
```

と表示されました。画面上のラベルにも反映されました。

簡単ですがUnityとiOSプラグインの繋ぎこみに成功しました。
最後までお読みいただきありがとうございました。