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

Posted Mr_厚厚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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];    

以上是关于Unity传送数据到原生平台参数映射总结的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis总结

Unity 多平台原生SDK接入速览:微信开放平台

MyBatis要点总结

集成Unity3D到iOS应用程序中

myBatis总结一

MyBatis总结一:快速入门