Unity/Native連携/Swift連携
提供: 初心者エンジニアの簡易メモ
iOS-Unity連携
Unityに記述
#if UNITY_IPHONE using System.Runtime.InteropServices; #endif using UnityEngine; public class ExampleClass : MonoBehaviour { #if UNITY_IPHONE [DllImport("__Internal")] private static extern bool _testStaticMethod(bool flag); [DllImport("__Internal")] private static extern bool _testMethod(bool flag); [DllImport("__Internal")] private static extern void _testExecMethod(); [DllImport("__Internal")] private static extern string _testStaticStrMethod(string message); [DllImport("__Internal")] private static extern int _testStaticNumberMethod(int number); #endif void Start() { #if UNITY_IOS && !UNITY_EDITOR bool flag = _testMethod(true); bool flagstatic = _testStaticMethod(true); bool flagfalse = _testMethod(false); bool flagstaticfalse = _testStaticMethod(false); string strstatic = _testStaticStrMethod("hoge"); int numberstatic = _testStaticNumberMethod(123); _testExecMethod(); Debug.Log("flag=" + flag); Debug.Log("flagstatic=" + flagstatic); Debug.Log("flagfalse=" + flagfalse); Debug.Log("flagstaticfalse=" + flagstaticfalse); Debug.Log("strstatic=" + strstatic); Debug.Log("numberstatic=" + numberstatic); #endif } }
Assets/Plugins/iOS/UnityRenkei.swiftを作成し、以下を貼り付ける。(xcode側では、Libraries/Plugins/iOS/にある。)
import Foundation @objc public class UnityRenkei: NSObject { @objc public static func teststatic(_ flag: Bool) -> Bool { return flag } @objc public func test(_ flag: Bool) -> Bool { return flag } @objc public func testexec() { print("testexec") } @objc public static func teststaticstr(_ message: String) -> String { print("Received String from Unity: \(message)") let modifiedMessage = "Modified message: \(message)" return modifiedMessage } @objc public static func teststaticnumber(_ number: Int) -> Int { print("Received Int from Unity: \(number)") let modifiedNumber = number + 10 return modifiedNumber } }
Assets/Plugins/iOS/UnityBridge.mmを作成し、以下を貼り付ける。(xcode側では、Libraries/Plugins/iOS/にある。)
#import <UnityFramework/UnityFramework-Swift.h> extern "C" { // Unityから呼び出せるSwiftメソッドのラッパー bool _testStaticMethod(bool flag) { bool result = [UnityRenkei teststatic:flag]; // Swiftのstaticメソッドを呼び出す NSLog(@"result: %d", result); return result; } bool _testMethod(bool flag) { UnityRenkei *renkei = [[UnityRenkei alloc] init]; bool result = [renkei test:flag]; // Swiftのインスタンスメソッドを呼び出す NSLog(@"result: %d", result); return result; } void _testExecMethod() { UnityRenkei *renkei = [[UnityRenkei alloc] init]; [renkei testexec]; // Swiftのインスタンスメソッドを呼び出す } const char* _testStaticStrMethod(const char* message) { NSString *nsMessage = [NSString stringWithUTF8String:message]; // Convert C string to NSString NSString *result = [UnityRenkei teststaticstr:nsMessage]; // Call Swift method // return [result UTF8String]; // Convert NSString back to C string const char* cResult = strdup([result UTF8String]); // Duplicate the string to prevent memory issues return cResult; // Return the duplicated C string } int _testStaticNumberMethod(int number) { int result = [UnityRenkei teststaticnumber:number]; // Call Swift method NSLog(@"Static number result: %d", result); return result; } }
出力
flag=True flagstatic=True flagfalse=False flagstaticfalse=False testexec strstatic=Modified message: hoge numberstatic=133