繁体   English   中英

如何在C#Unity中使用带有2D数组的C结构

[英]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

现有的实现类似于我上面提到的实现。

将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM