9

Is it possible to write unity IOS plugin in Swift?

I already have a working swift framework and want to use it as a plugin in Unity

I saw some places which say it can only be done on Objective-c but is there a workaround for swift?

2 Answers 2

9

How to call Unity methods

Unity interface functions are defined in UnityInterface.h in Xcode project built by Unity. This header file is imported in UnitySwift-Bridging-Header.h, so you can call the functions directly in your Swift codes.

To call Unity methods, use UnitySendMessage function like below:

    //  Example.swift

import Foundation

class Example : NSObject {
    static func callUnityMethod(_ message: String) {
        // Call a method on a specified GameObject.
        UnitySendMessage("CallbackTarget", "OnCallFromSwift", message)
    }
}

How to access Swift classes from Unity

Step 1: Create your Swift classes.

//  Example.swift

import Foundation

class Example : NSObject {
    static func swiftMethod(_ message: String) {
        print("\(#function) is called with message: \(message)")
    }
}

Step 2: Include "unityswift-Swift.h" and define C functions to wrap Swift classes in .mm file (Objective-C++).

//  Example.mm

#import <Foundation/Foundation.h>
#import "unityswift-Swift.h"    // Required
                                // This header file is generated automatically when Xcode build runs.

extern "C" {
    void _ex_callSwiftMethod(const char *message) {
        // You can access Swift classes directly here.
        [Example swiftMethod:[NSString stringWithUTF8String:message]];
    }
}

Step 3: Create interface class to call exported C functions from C#.

// Example.cs

using System.Runtime.InteropServices;

public class Example {
    #if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void _ex_callSwiftMethod(string message);
    #endif

    // Use this method to call Example.swiftMethod() in Example.swift
    // from other C# classes.
    public static void CallSwiftMethod(string message) {
        #if UNITY_IOS && !UNITY_EDITOR
        _ex_callSwiftMethod(message);
        #endif
    }
}

Step 4: Call the method from your C# code.

Example.CallSwiftMethod("Hello, Swift!");

The file names of UnitySwift-Bridging-Header.h and unityswift-Swift.h are defined in "Objective-C Bridging Header" entry and "Objective-C Generated Interface Header Name" entry in Build Settings. These settings and other settings about Swift compiler are set automatically by PostProcesser when the Unity build runs.

Requirements

iOS 7 or later

Compatibility

Unity 5.3.5f1 Xcode 7.3.1

Sign up to request clarification or add additional context in comments.

2 Comments

this is old version Swift but it's great example
@Abs3akt, unfortunately this method does not work anymore - "unityswift-Swift.h" is just not found
6

As top-level Swift is simply not accessible from Unity, the "workaround" for Swift is to write an Objective-C wrapper class around it, and access that.

Depending on the amount and complexity of your Swift code that might still be the most optimal approach.

1 Comment

Thanks, can you guide me how to make the bridge you mention? do i need to write objective-c wrapper and after the unity build the xcode project import the swift framework? any related docs will be great

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.