渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

UnityとObjective-Cのやりとり

UnityとObjective-Cのやりとり

こんにちは、Unityエンジニアのオオバです。

UnityとSwiftのやり取りを進めていたのですが、
なかなかうまく行かなかったので、一旦初心に帰ります。

Objective-CとUnityのやり取りを確認していきます。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

ディレクトリ構成

Assets/  
└──Plugins/  
    ├── Test.cs  
    └── iOS/  
        ├── SampleObjC.mm  
        └── SamplePlugin.cs  

拡張子.mmの理由

Objective-Cの拡張子はもともと.mです。
しかし、.mmに変更されています。

この理由はObjective-Cファイル内に、
C++を内包するからです。

📚 参考サイト : Objective-CのクラスをC++でラップする方法 - Faith and Brave - C++で遊ぼう

このようなファイル構成です。

以下3ファイルのサンプルコードを公開します。

💻ソースコード : SampleObjC.mm
#import <Foundation/Foundation.h>

extern "C"  
{
    void _callObjcMethod(const char *msg)  
    {
        // コンソールにログを出力  
        NSString *str = [NSString stringWithCString:msg encoding:NSUTF8StringEncoding];  
        NSLog(str);  
    }
}
💻ソースコード : SamplePlugin.cs
using System.Collections.Generic;  
using UnityEngine;  
using System.Runtime.InteropServices;  
// ネイティブとC#をつなぐブリッジ役  
public class SamplePlugin : MonoBehaviour  
{
    #if UNITY_IOS && !UNITY_EDITOR  
    [DllImport ("__Internal")]  
    static extern void _callObjcMethod (string msg);  
    #endif  

    public static void CallObjcMethod (string msg)  
    {
        #if UNITY_IOS && !UNITY_EDITOR  
        _callObjcMethod (msg);  
        #endif  
    }
}
💻ソースコード : Test.cs
using UnityEngine;  

public class Test : MonoBehaviour  
{
    public int cnt;  

    void Update ()  
    {
        SamplePlugin.CallObjcMethod (cnt.ToString ());  
        cnt++;  
    }
}

特に壁にぶつからずスムーズに実装できました。

ただSampleObjC.mmはテキストエディタやRiderで記述するとコード補完が効きません
Xcodeで開いてもファイル単品をオープンするだけではコード補完が効かず、
もっと複雑な処理を書く場合は結構厳しい気がしました。

プラグインのコード補完を有効にする

そこでXcodeプロジェクトを、
ネイティブプラグインのフォルダに作り
コード補完が効く状態にします。

UnityとObjective-Cのやりとり_0

XcodeのFile > New > Project から
Cocoa Touch Framworkを選択。

UnityとObjective-Cのやりとり_1

適当なProductNameを付けて、
Languageを Objective-Cを選択します。

UnityとObjective-Cのやりとり_2

File > New > File からObjective-C Fileを選択。
SampleObjC.mと命名。

UnityとObjective-Cのやりとり_3

コチラのディレクトリに格納します。
※Xcode上でSampleObjC.mmにリネームしました

するとコード補完の利くSampleObjC.mmを調整できるようになります。

オススメ記事
検証環境
  • Unity2017.1.0f3
  • Xcode 8.3.3
  • macOS 10.12.4
参考サイト