15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Unity & iOSプラグイン連携

Last updated at Posted at 2015-06-28

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](https://qiita-image-store.s3.amazonaws.com/0/58014/20197741-5e41-06e3-9ad1-6980a7ea3d6d.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プラグインの繋ぎこみに成功しました。
最後までお読みいただきありがとうございました。

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?