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

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

Swift で Unity の macOS の Native Plugin を作る

Swift で Unity の macOS の Native Plugin を作る

  • Unity は Native Plugin を作成することで、Unity から提供されていない、OS 固有の機能を使用することができます
  • 例えば maxOS では、Bluetooth の利用などが出来るようになります
  • こちらの記事では、Swift だけで、Unity の iOS の Native Plugin を紹介しています

  • 上記の記事の iOS の Native Plugin のプロジェクトを拡張して、macOS 向けの Native Plugin を作成します
  • iOS 実機向けと、macOS 向けの Native Plugin を同時に開発し、Editor での動作確認を実現することで、開発効率の向上を狙っています
  • 今回は、iOS 向けに作成したプロジェクトをベースに、数字の文字列を整数型に変換する swiftPmPlugin_toNumber 関数を持つ macOS で利用可能な Native Pugin を作成します
  • リポジトリはこちら↓です

macOS の bundle をビルドする

スタート時の workspace の様子

  • Swift で作った SwiftPM のライブラリと、動作確認用の Native のアプリターゲットを含むプロジェクトがあります
  • アプリターゲットは今回は必須ではありません


Bundle のターゲットを作成する

  • macOS-Plugin project を作成しました
  • project は何でも良いです


  • File > New > Target から Bundle を選んで作成します
  • ここでは、MacOsSwiftPmPlugin と命名しました



Package のリンク

  • bundle のターゲットを選択し、general から Frameworks に、SwiftPM のライブラリを追加します


Header のリンク

  • MacOsSwiftPmPlugin 内に PrefixHeader.pch を作成します



  • @import {{Swift で作ったパッケージ名}}; を記述します
#ifndef PrefixHeader_pch
#define PrefixHeader_pch

// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

@import SwiftPmPlugin; // <- 追加

#endif /* PrefixHeader_pch */
  • ビルドをすると Bundle が出力されます


  • nm コマンドを利用すると、swiftPmPlugin_toNumber のシンボルが含まれることを確認できます
$ nm /path/to/bundle/MacOsSwiftPmPlugin.bundle/Contents/MacOS/MacOsSwiftPmPlugin | grep swiftPmPlugin_toNumber
0000000000001fe0 T _swiftPmPlugin_toNumber

Unity に組み込む

  • サンプルプロジェクトの Unity の Plugins/macOS/ に作成した MacOsSwiftPmPlugin.bundle を配置しました


  • macOS の場合は、DllImport 時に、bundle 名を指定する必要があるため、#if で分けました
using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class Cube : MonoBehaviour

    private static extern long swiftPmPlugin_toNumber(string stringNumber);

    void Update()
        Debug.Log("number: " + swiftPmPlugin_toNumber("30"));
  • Unity Editor から 実行してエラーが出なければ、Native Plugin の作成成功です


  • macOS の場合、一度 DllImport すると、Unity Editor を終了するまで保持されます
  • bundle の差し替えだけだと処理が変わらないので注意してください
  • ライブラリの開発時は、iOS 向けのライブラリと同様に、Native 向けのターゲットを Xcode で作成して、デバッグをすると効率的だと思います
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
Help us understand the problem. What is going on with this article?