Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@shell

Unity & iOSプラグイン連携

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

14
Help us understand the problem. What is going on with this article?
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
14
Help us understand the problem. What is going on with this article?