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

use*_*677 11 c c# dll struct unity-game-engine

所以我有一个带有以下结构的C API

typedef struct mat4f_ { float m[4][4]; } mat4f;
Run Code Online (Sandbox Code Playgroud)

它作为参数传递给我的一个API函数:

void myFunction(const mat4f matrix);
Run Code Online (Sandbox Code Playgroud)

我使用dll将此函数导出到Unity中的C#:

[DllImport ("mylib")] 
private static extern void myFunction(mat4f matrix);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该如何制作相应的C#结构?

现在我有以下内容:

[StructLayout(LayoutKind.Sequential)]
public struct mat4f
{
    public float[,] m;
}
Run Code Online (Sandbox Code Playgroud)

并使用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
Run Code Online (Sandbox Code Playgroud)

这是正确的做法吗?有一个更好的方法吗?

zwc*_*oud 4

对于 4\xc3\x974 矩阵,您可以使用UnityEngine.Matrix4x4. 如果您想使用自己的结构,我建议您以相同的方式实现它UnityEngine.Matrix4x4:

\n\n
[StructLayout(LayoutKind.Sequential)]\npublic struct mat4f\n{\n    public float m00;\n    public float m01;\n    public float m02;\n    public float m03;\n    public float m10;\n    public float m11;\n    public float m12;\n    public float m13;\n    public float m20;\n    public float m21;\n    public float m22;\n    public float m23;\n    public float m30;\n    public float m31;\n    public float m32;\n    public float m33;\n\n    public static mat4f Identity = new mat4f\n    {\n        m11 = 1.0f,\n        m22 = 1.0f,\n        m33 = 1.0f,\n        m44 = 1.0f\n    };\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一种blittable 类型。Blittable 类型在托管代码和非托管代码之间传递时不需要转换。

\n\n

使用示例:

\n\n
mat4f matrix = mat4f.Identity;\nmyFunction(matrix);  // Call DLL function\n
Run Code Online (Sandbox Code Playgroud)\n\n

现有的实现与我上面介绍的类似。

\n\n\n