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)
这是正确的做法吗?有一个更好的方法吗?
对于 4\xc3\x974 矩阵,您可以使用UnityEngine.Matrix4x4. 如果您想使用自己的结构,我建议您以相同的方式实现它UnityEngine.Matrix4x4:
[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}\nRun Code Online (Sandbox Code Playgroud)\n\n这是一种blittable 类型。Blittable 类型在托管代码和非托管代码之间传递时不需要转换。
\n\n使用示例:
\n\nmat4f matrix = mat4f.Identity;\nmyFunction(matrix); // Call DLL function\nRun Code Online (Sandbox Code Playgroud)\n\n现有的实现与我上面介绍的类似。
\n\nUnityEngine.Matrix4x4文档。Vector4类型也是值类型。)