将id <mtltexture>从ios发送到unity

时间:2018-05-20 10:22:39

标签: ios objective-c unity3d

我正在编写一个统一插件,我需要从ios发送纹理到统一。 有UnitySendMessage函数以char*为参数,但我找不到将id<MTLTexture>转换为char*的方法。

如何从ios发送id<MTLTexture>并以统一方式接收?

我目前的代码:

//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);
}

1 个答案:

答案 0 :(得分:1)

iOS plugin documentation表示您只能使用UnitySendMessage传递字符串。

解决方法是在Objective-C端创建从字符串到纹理对象的映射,通过UnitySendMessage传递字符串键,然后使用自定义DllImport函数检索纹理对象。

声明你的地图:

// 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);

在C#端,CreateExternalTexture需要一个指向类型为IntPtr的纹理对象的指针。要获得它,您可以声明一个DllImport函数,该函数采用纹理名称并返回IntPtr

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

并在iOS上实现它,如下所示:

return plugin->_textures[textureName];

根据CreateExternalTexture期望的内容,不确定它是否有效。

另见这篇文章,一个人正在做类似的事情(但反过来): Convert uintptr_t to id<MTLTexture>