![](/img/trans.png)
[英]How to use 2D GameObject array as a parameter in a c# function ( 2D unity game)
[英]How to use C struct with 2D array in C# Unity
所以我有一个带有以下结构的C API
typedef struct mat4f_ { float m[4][4]; } mat4f;
它作为参数传递给我的一个API函数:
void myFunction(const mat4f matrix);
我使用dll将此函数导出到Unity中的C#:
[DllImport ("mylib")]
private static extern void myFunction(mat4f matrix);
我的问题是, 我应该如何制作相应的C#结构?
现在我有以下内容:
[StructLayout(LayoutKind.Sequential)]
public struct mat4f
{
public float[,] m;
}
并使用try尝试使用如下函数:
//Just make an identity matrix
mat4f matrix;
matrix.m = new float[4, 4] { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
myFunction(matrix); //Call dll function
这是正确的做法吗? 有一个更好的方法吗?
对于4×4矩阵,您可以使用UnityEngine.Matrix4x4
。 如果您想使用自己的结构,我建议您以与实现UnityEngine.Matrix4x4
相同的方式实现它:
[StructLayout(LayoutKind.Sequential)]
public struct mat4f
{
public float m00;
public float m01;
public float m02;
public float m03;
public float m10;
public float m11;
public float m12;
public float m13;
public float m20;
public float m21;
public float m22;
public float m23;
public float m30;
public float m31;
public float m32;
public float m33;
public static mat4f Identity = new mat4f
{
m11 = 1.0f,
m22 = 1.0f,
m33 = 1.0f,
m44 = 1.0f
};
}
这是一种blittable类型 。 Blittable类型在托管代码和非托管代码之间传递时不需要转换 。
样品用途:
mat4f matrix = mat4f.Identity;
myFunction(matrix); // Call DLL function
现有的实现类似于我上面提到的实现。
UnityEngine.Matrix4x4
文档 。 Vector4
类型也是值类型。) 将C#结构传递给您正在执行的导入函数是有效的,但是您应该在结构中指定数组的长度,即使您稍后指定其大小也是如此。
c声明基本上指定了一个长度为16的数组,所以我将指定c#结构如下:
[StructLayout(LayoutKind.Sequential)]
public struct mat4f
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] public float[,] m;
}
您可以在此处详细了解如何编组数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.