11
7

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 3 years have passed since last update.

【Unity】最近のUnityでC#からSwiftを実行する最短実装

Posted at

自分の記憶ではUnityからSwiftを呼び出すための手順が以前は複雑だったのですが、最近は簡単になったようなのでメモしておきます。
Unity2019.4.4f1で試しています。

  • Helloworld.swift
  • Bridge.mm
  • Main.cs

この3ファイルを使います。

概要図

image.png
C#から直接Swiftは呼び出せず、一旦Objective-C++を挟みます。

Unityプロジェクトの構成

Assets
├── Plugins
│   └── iOS
│       ├── Helloworld.swift (Swift)
│       └── Bridge.mm (Objective-C++)
└── Scripts
    └── Main.cs (C#)

このような感じでAssets/Plugins/iOS/の中にSwiftファイルObjective-C++ファイルを入れておきます。

最終的にC#から呼び出したいSwift

ゴールはhelloメソッドをC#から実行することになります。

Helloworld.swift
import Foundation

@objc public class Helloworld : NSObject {
    @objc public static func hello() {
        print("Hello Swift!")
    }
}

Objective-C++から呼び出したいものに@objcアトリビュートを付けます。1

Swiftを呼び出すObjective-C++

Bridge.mm
#import <UnityFramework/UnityFramework-Swift.h>

extern "C" {
  void FromCsharp() {
      [Helloworld hello];
  }
}

FromCsharpメソッドをC#から呼び出します。

#import <UnityFramework/UnityFramework-Swift.h>

以前は#import <[Unityのプロジェクト名]-Swift.h>が必要だった記憶ですが、最近はUnityが自動生成するヘッダファイルUnityFramework/UnityFramework-Swift.hをimportしておけば良いようです。

C#からObjective-C++を呼び出す

Main.cs
public class Main : MonoBehaviour 
{
    [DllImport("__Internal")]
    private static extern void FromCsharp();

    void Start() {
        FromCsharp();
    }
}

ここは馴染み深いコードで、[DllImport("__Internal")]をくっつけて呼び出すメソッドを定義します。

最後に

以前はSwiftにアクセスするの面倒くさいなと思っていましたが、ネイティブプラグインが作りやすくなった感があります。

環境

  • Unity2019.4.4f1
  • Unity2020.1.0f1
  • Xcode 11.6
  1. クラス全体をObjective-C++からアクセスを受け付ける場合は、クラス宣言前に@objcMembersをくっつける

11
7
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
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?