从C++本机插件更新Vector3数组
Update Vector3 array from C++ native plugin
Marshal.Copy()
方法只支持少数数组类型。现在我只知道如何从IntPtr
(指向C++代码中的浮点数组(复制到float[]
。
IntPtr pvertices = GetVerticesFromCPP();
float[] vertices = new float[nVertices * 3];
Marshal.Copy(pvertices, vertices, 0, nVertices * 3);
但我真正想要的是UnityEngine.Vector3[]
。
是否需要手动将float[]
转换为UnityEngine.Vector3[]
?或者有没有一种更简单、更快的方法可以直接做到这一点?
是否需要手动将float[]转换为UnityEngine.Vvector3[]?或者是有一种更简单、更快的方法可以直接做到这一点吗?
是的,您必须手动执行,但有更好的方法。
我假设您需要在本机端修改Vector3
,然后返回结果。不需要为此使用float
阵列。只需在C++端创建一个Vector3
结构,然后使用指针在C++和C#之间传递它不要从C++返回Vector3
数组,在C#端创建它,然后将它传递给C++函数以修改并将更改应用于参数。
C++:
这需要您在Unity中启用unsafe关键字。
struct Vector3
{
float x;
float y;
float z;
};
然后你的功能:
extern "C" void UpdateVectorArray(Vector3* vecArray, int vecSize)
{
for(int i = 0; i < vecSize; ++i)
{
//Simply modify each Vector reference
Vector3 &vec = vecArray[i];
vec.x = 11;
vec.y = 20;
vec.z = 55;
}
}
C#:
[DllImport("Plugin Name")]
static unsafe extern void UpdateVectorArray(Vector3* vecArray, int vecSize);
void UpdateVectorArray(Vector3[] vecArray)
{
unsafe
{
//Pin array then send to C++
fixed (Vector3* vecPtr = vecArray)
{
UpdateVectorArray(vecPtr, vecArray.Length);
}
}
}
用法:
从模型中获取顶点,发送到C++并对其进行修改,重新分配修改后的网格:
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
UpdateVectorArray(vertices);
//Re-assign the modified mesh
mesh.vertices = vertices;
mesh.RecalculateBounds();
}
为了避免在Unity中使用unsafe
关键字,请使用[In, Out]
属性。
[DllImport("Plugin Name")]
static extern void UpdateVectorArray([In, Out] Vector3[] vecArray, int vecSize);
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
UpdateVectorArray(vertices, vertices.Length);
mesh.vertices = vertices;
mesh.RecalculateBounds();
}
C++一侧保持不变。您也可以使用GCHandle来固定数组,避免使用unsafe
关键字,但unsafe
关键字解决方案更好更快。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '