Как передать аргументы из iOS (Objc / Swift) в Unity, которые являются структурами / классами? (без использования UnitySendMessage) - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь найти хороший способ передать параметры из моего нативного плагина 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 как положено, а скорее странный показатель небольшого числа.Есть идеи ??

1 Ответ

0 голосов
/ 27 мая 2019

Вам необходимо создать структуру для параметра передачи, вы можете использовать параметры несколько раз, а также получить доступ к основному классу.

struct Location {
  let latitude:"latitude"
  let longitude: "longitude"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...