「Unity/Native連携/Swift連携」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「 =iOS-Unity連携= Unityに記述 <pre> #if UNITY_IPHONE using System.Runtime.InteropServices; #endif using UnityEngine; public class ExampleClass : MonoBehaviour { #if...」) |
(→iOS-Unity連携) |
||
| (同じ利用者による、間の1版が非表示) | |||
| 行19: | 行19: | ||
[DllImport("__Internal")] | [DllImport("__Internal")] | ||
private static extern void _testExecMethod(); | private static extern void _testExecMethod(); | ||
| + | |||
| + | [DllImport("__Internal")] | ||
| + | private static extern string _testStaticStrMethod(string message); | ||
| + | |||
| + | [DllImport("__Internal")] | ||
| + | private static extern int _testStaticNumberMethod(int number); | ||
#endif | #endif | ||
void Start() | void Start() | ||
| 行27: | 行33: | ||
bool flagfalse = _testMethod(false); | bool flagfalse = _testMethod(false); | ||
bool flagstaticfalse = _testStaticMethod(false); | bool flagstaticfalse = _testStaticMethod(false); | ||
| + | string strstatic = _testStaticStrMethod("hoge"); | ||
| + | int numberstatic = _testStaticNumberMethod(123); | ||
| + | _testExecMethod(); | ||
Debug.Log("flag=" + flag); | Debug.Log("flag=" + flag); | ||
Debug.Log("flagstatic=" + flagstatic); | Debug.Log("flagstatic=" + flagstatic); | ||
Debug.Log("flagfalse=" + flagfalse); | Debug.Log("flagfalse=" + flagfalse); | ||
Debug.Log("flagstaticfalse=" + flagstaticfalse); | Debug.Log("flagstaticfalse=" + flagstaticfalse); | ||
| − | + | Debug.Log("strstatic=" + strstatic); | |
| + | Debug.Log("numberstatic=" + numberstatic); | ||
#endif | #endif | ||
} | } | ||
| 行52: | 行62: | ||
@objc public func testexec() { | @objc public func testexec() { | ||
print("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 | ||
} | } | ||
} | } | ||
| 行76: | 行96: | ||
UnityRenkei *renkei = [[UnityRenkei alloc] init]; | UnityRenkei *renkei = [[UnityRenkei alloc] init]; | ||
[renkei testexec]; // Swiftのインスタンスメソッドを呼び出す | [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; | ||
} | } | ||
} | } | ||
| 行87: | 行119: | ||
flagstaticfalse=False | flagstaticfalse=False | ||
testexec | testexec | ||
| + | strstatic=Modified message: hoge | ||
| + | numberstatic=133 | ||
</pre> | </pre> | ||
==参考== | ==参考== | ||
https://qiita.com/ohbashunsuke/items/8f3b7c733fc70a180941 | https://qiita.com/ohbashunsuke/items/8f3b7c733fc70a180941 | ||
2024年9月12日 (木) 01:01時点における最新版
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
