我正在编写一个统一插件,我需要从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);
}
答案 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>