微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Unity3d中调用GL.IssuePlugInEvent并将参数传递给C中的插件端

如何解决如何在Unity3d中调用GL.IssuePlugInEvent并将参数传递给C中的插件端

我正在尝试为 Unity 编写一个插件,该插件在 android 的本机端(但同样适用于任何其他 dll 左右的库)和 Unity 端之间传递信息。我想分享的信息是与OpenGL相关的。在 Unity 文档中,指定必须通过 GL.IssuePlugInEvent 函数调用必须在渲染线程上运行的所有内容。这个函数虽然对参数非常严格:它需要调用具有特定签名的函数

回调必须是“void UNITY_INTERFACE_API UnityRenderingEvent(int eventId)”签名的原生函数

并且只有附加参数 eventId。

然后我怎样才能从 so 库中传回统一方面的信息?

解决方法

用于创建插件和使用 IssuePluginEvent 的 Unity 示例涵盖了您希望/需要直接调用 C 函数的情况,并且该函数仅接受 eventId 作为参数。如果读者来自 C\C++ 背景并且不熟悉 C#,则可能会产生误导。事实上,您实际上可以使用这个简单的技巧调用 C# 函数,并在该函数内部调用传递多个参数的 C 函数。 步骤是:

  1. 获取 C# 函数的函数指针(注意该函数将是静态的)
  2. 将该函数指针传递给 GL.IssuePluginEvent
  3. 在你的静态 C# 函数中,根据 eventId 的情况,调用适当的 C 函数
    void Update()
    {
        GL.IssuePluginEvent(RenderThreadHandlePtr,GL_INIT_EVENT); // example
    }

    /// <summary> Renders the event delegate described by eventID. </summary>
    /// <param name="eventID"> Identifier for the event.</param>
    private delegate void RenderEventDelegate(int eventID);
    /// <summary> Handle of the render thread. </summary>
    private static RenderEventDelegate RenderThreadHandle = new RenderEventDelegate(RunOnRenderThread);
    /// <summary> The render thread handle pointer. </summary>
    public static IntPtr RenderThreadHandlePtr = Marshal.GetFunctionPointerForDelegate(RenderThreadHandle);

    public const int GL_INIT_EVENT = 0x0001;
    public const int GL_DRAW_EVENT = 0x0002;

    /// <summary> Executes the 'on render thread' operation. </summary>
    /// <param name="eventID"> Identifier for the event.</param>
    [MonoPInvokeCallback(typeof(RenderEventDelegate))]
    private static void RunOnRenderThread(int eventID)
    {
        switch (eventID)
        {
            case GL_INIT_EVENT:
                glInit(par1,par2,par3);  // C function with 3 parameters 
                break;
            case GL_DRAW_EVENT:
                glStep();
                GL.InvalidateState();
                break;
        }
    }

    [DllImport("hello-jni")]
    private static extern void glInit(int par1,int par2,int par3);

    [DllImport("hello-jni")]
    private static extern void glStep();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。