Unity传送数据到原生平台参数映射总结

Unity传送数据到原生平台参数映射总结

在Unity的移动游戏开发中,尤其涉及到一些原生插件的开发中,需要利用Unity和原生平台(iOS、安卓)之间的通信机制,实现数据和事件的传输。其中数据传输涉及到脚本数据到C++数据类型的一个转变,因为在往原生平台传数据过程中,数据会以无类型的数据流传过去,因此正确的接收转换数据十分重要。

关于Unity和iOS原生平台之间的通信方法请移步:Unity与IOS通信

基本数据类型可以直接传输

像int,float,bool,byte等基本数据类型可以直接传输和转换,其中byte在C++中用unsigned char来接:

Unity中:

[DllImport("__Internal")]
public static extern int Test(int param1, float param2, bool param3);

原生接口中:

extern "C" int Test(int param1, float param2, bool param3)
{
}

字符串string直接用char数组接收

Unity中:

[DllImport("__Internal")]
public static extern int Test(string param1);

原生接口中:

extern "C" int Test(char* param1)
{
}

Unity对象(贴图、Mesh buffer等)转成IntPtr传输,使用void*接收

Unity中:

[DllImport("__Internal")]
public static extern int Test(IntPtr rt, IntPtr vb, IntPtr ib);


RenderTexture rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 0);
Mesh mesh = new Mesh();
IntPtr rtPtr = rt.GetNativeTexturePtr();
IntPtr VB = mesh.GetNativeVertexBufferPtr(0);
IntPtr IB = mesh.GetNativeIndexBufferPtr();
Test3(rtPtr, VB, IB);

原生接口中:

extern "C" int Test(void* rt, void* vb, void* ib)
{
    //id<MTLTexture> tex = (__bridge id<MTLTexture>)rt;
    //id<MTLBuffer> VB = (__bridge id<MTLBuffer>)vb;
}

关于数组的传输

基础数据类型的数组可以直接传:

Unity中:

[DllImport("__Internal")]
public static extern int Test(int[] param1, float[] param2, bool[] param3);

原生接口中:

extern "C" int Test(int* param1, float* param2, bool* param3)
{
}

Unity对象数组要以IntPtr数组的形式传递,传递的是InrPtr数组的IntPtr指针,C++那边用void**接收【当然基础数据类型的数组也是可以传IntPtr指针的,传递的是数组首地址的指针】:

Unity中:

[DllImport("__Internal")]
public static extern int Test(IntPtr param1);

RenderTexture rt1 = RenderTexture.GetTemporary(Screen.width, Screen.height, 0);
RenderTexture rt2 = RenderTexture.GetTemporary(Screen.width, Screen.height, 0);
RenderTexture rt3 = RenderTexture.GetTemporary(Screen.width, Screen.height, 0);

IntPtr[] rtsArr = {rt1.GetNativeTexturePtr(),rt2.GetNativeTexturePtr(),rt3.GetNativeTexturePtr()};
GCHandle rtsHandle = GCHandle.Alloc(rtsArr, GCHandleType.Pinned);
Test(rtsHandle.AddrOfPinnedObject());

原生接口中:

extern "C" int Test(void** param1)
{
    void* rt1 = param1[0];
    void* rt2 = param1[1];
    void* rt3 = param1[2];    
}
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值