Я пытаюсь найти хороший способ передать параметры из моего нативного плагина Unity в objc / swift в C # unity.
Кажется, мне нужно будет использовать Marshall, но я не смог найти хорошийпример этого где угодно.
Единственное, что я обнаружил, это UnitySendMessage, но он передает строки только в качестве параметров, и даже они ограничены 1024 байтами, что недостаточно для представления объектов в JSON,и обработка нескольких сообщений кажется для этого излишним.
Идея состоит в том, чтобы иметь возможность опрашивать плагин для обнаружения объектов из MTLTexture и возвращать распознаваемые объекты.
Кодобразцы:
SwiftBridge
import Foundation
import UIKit
import Vision
@objc public class SwiftBridge: NSObject {
var delegate: DelegateCallbackFunction?
@objc static let shared = SwiftBridge()
@objc func evaluate(texture: MTLTexture) -> Bool {
guard let delegate = self.delegate else {
return false
}
let rect = CGRect(x: 1, y: 2, width: 100, height: 200)
delegate(rect)
return true
}
@objc func setDelegate(callback: @escaping DelegateCallbackFunction) -> Bool {
self.delegate = callback
return true
}
}
Unity
using System;
using UnityEngine;
using System.Runtime.InteropServices;
using AOT;
[StructLayout(LayoutKind.Sequential)]
public struct CGPoint {
public float x;
public float y;
};
[StructLayout(LayoutKind.Sequential)]
public struct CGSize {
public float width;
public float height;
};
[StructLayout(LayoutKind.Sequential)]
public struct CGRect {
public CGPoint origin;
public CGSize size;
}
public class UnityBridge : MonoBehaviour {
#region Declare external C interface
// #if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern int _vision_detectObjectsIn(IntPtr texture);
delegate bool ObjectDetectedCallback(ref CGRect rect);
[DllImport("__Internal")]
private static extern void _vision_setDelegate(ObjectDetectedCallback callback);
[MonoPInvokeCallback(typeof(ObjectDetectedCallback))]
private static bool delegateMessageReceived(ref CGRect rect) {
Debug.Log("Message received: " + rect.origin.x);
return true;
}
// #endif
#endregion
public void initializeDelegate() {
if (Application.platform == RuntimePlatform.IPhonePlayer) {
_vision_setDelegate(delegateMessageReceived);
}
}
#region Wrapped methods and properties
public void EvaluateTexture(IntPtr texture) {
initializeDelegate();
if (texture == IntPtr.Zero) {
Debug.LogError("[Texture] Pointer to buffer is null.");
return;
}
bool success;
#if UNITY_IOS && !UNITY_EDITOR
_vision_detectObjectsIn(texture);
#endif
}
#endregion
#region Singleton implementation
private static WeRDetectorUnity _instance;
public static WeRDetectorUnity Instance {
get {
if (_instance == null) {
var obj = new GameObject("WeRDetectorUnity");
_instance = obj.AddComponent<WeRDetectorUnity>();
}
return _instance;
}
}
void Awake() {
if (_instance != null) {
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
}
#endregion
}
Сообщение о получении сообщения в Unity не возвращает1 как положено, а скорее странный показатель небольшого числа.Есть идеи ??