Help us understand the problem. What is going on with this article?

Unity & iOSプラグイン連携

More than 5 years have passed since last update.

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

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

概要

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

イメージ

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

Unity側

シーン挙動制御用

シーン初期化とボタン配置と押下時の挙動、そして結果をラベルに反映する

    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();
    }

iOS側のソースとの連携

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側の準備は完了です。

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

iOS側

UnityからC++で命令を受け取る仕組みを作ります。
XcodeでCocoa Touch Static Libraryを選択してプロジェクトを作成します。
スクリーンショット 2015-06-28 9.28.20.png

C++

作成したプロジェクトに新規で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];
}

Objective-C

.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プラグインの繋ぎこみに成功しました。
最後までお読みいただきありがとうございました。

shell
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした