简体   繁体   中英

Send id<MTLTexture> from ios to unity

I'm writing a plugin for unity, and I need to send a texture from ios to unity. There is a UnitySendMessage function which takes char* as a parameter, but I didn't find a way to convert id<MTLTexture> to char* .

How can I send id<MTLTexture> from ios and receive it in unity?

My current code :

//ios side ...
id<MTLTexture> _texture = CVMetalTextureGetTexture(texture);
UnitySendMessage(CALLBACK_OBJECT, CALLBACK_TEXTURE_READY,_texture);//error
//...

//unity side
private void OnTextureReady(string texture_str)
{
   IntPtr texture = new IntPtr(Int32.Parse(texture_str));
   int width = 256;
   int height = 256;
   rawImage.texture = Texture2D.CreateExternalTexture(width, height, 
   TextureFormat.ARGB32, false, false, texture);
}

iOS plugin documentation says that you can only pass strings using UnitySendMessage.

The workaround would be to create a mapping from string to texture objects in Objective-C side, pass the string key via UnitySendMessage and then retrieve the texture object using a custom DllImport function.

Declare you map:

// class field
{
    NSMutableDictionary<NSString *, id<MTLTexture>> _textures;
}

// in constructor
_textures = [NSMutableDictionary new];

// in function code
NSString *textureName = @"cookies";
_textures[textureName] = texture; // save MTLTexture for later

UnitySendMessage(CALLBACK_OBJECT, CALLBACK_TEXTURE_READY, textureName);

On the C# side CreateExternalTexture requires a pointer to a texture object of type IntPtr . To obtain it you can declare a DllImport function that takes a texture name and returns IntPtr :

[DllImport("__Internal")]
static extern IntPtr GetMetalTexturePointerByName(string textureName);

and implement it on the iOS side like so:

return plugin->_textures[textureName];

Not sure if it works though in terms of what CreateExternalTexture expects.

See also this post, a guy is doing something similar (but reverse): Convert uintptr_t to id<MTLTexture>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM