自分の記憶ではUnityからSwiftを呼び出すための手順が以前は複雑だったのですが、最近は簡単になったようなのでメモしておきます。
※Unity2019.4.4f1で試しています。
- Helloworld.swift
- Bridge.mm
- Main.cs
この3ファイルを使います。
概要図
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#から実行することになります。
import Foundation
@objc public class Helloworld : NSObject {
@objc public static func hello() {
print("Hello Swift!")
}
}
Objective-C++から呼び出したいものに@objc
アトリビュートを付けます。1
Swiftを呼び出すObjective-C++
#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++を呼び出す
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
-
クラス全体をObjective-C++からアクセスを受け付ける場合は、クラス宣言前に
@objcMembers
をくっつける ↩