查看: 22402|回复: 133

[在unity中制作] 低水平的本地插件接口

  [复制链接]

14

主题

17

帖子

664

积分

vip会员

Rank: 1

积分
664
发表于 2016-7-12 13:57:20 | 显示全部楼层 |阅读模式
除了基本的脚本接口,本机代码的插件团结可以接受某些事件发生时的回调。这主要是用来在你的插件实现底层渲染并使其与统一的多线程渲染工作。

通过统一接口定义暴露头设有编辑。

界面注册

一个插件应该出口unitypluginload和unitypluginunload统一处理主要事件。看到iunityinterface。Hfor the正确签名。iunityinterfaces提供给插件访问进一步统一的API。

    #include "IUnityInterface.h"
    #include "IUnityGraphics.h"
    // Unity plugin load event
    extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
        UnityPluginLoad(IUnityInterfaces* unityInterfaces)
    {
        IUnityGraphics* graphics = unityInterfaces->Get<IUnityGraphics>();
    }
访问图形设备

插件可以使用通用的图形设备的功能得到iunitygraphics接口。在较早的版本的Unity有unitysetgraphicsdevice函数用于出口以接收通知的图形设备事件。从统一5.2新iunitygraphics接口(发现iunitygraphics。H)提供了一种方法来登记一个回调。

    #include "IUnityInterface.h"
    #include "IUnityGraphics.h"

    static IUnityInterfaces* s_UnityInterfaces = NULL;
    static IUnityGraphics* s_Graphics = NULL;
    static UnityGfxRenderer s_RendererType = kUnityGfxRendererNull;

    // Unity plugin load event
    extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
        UnityPluginLoad(IUnityInterfaces* unityInterfaces)
    {
        s_UnityInterfaces = unityInterfaces;
        s_Graphics = unityInterfaces->Get<IUnityGraphics>();

        s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent);

        // Run OnGraphicsDeviceEvent(initialize) manually on plugin load
        // to not miss the event in case the graphics device is already initialized
        OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize);
    }

    // Unity plugin unload event
    extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
        UnityPluginUnload()
    {
        s_Graphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent);
    }

    static void UNITY_INTERFACE_API
        OnGraphicsDeviceEvent(UnityGfxDeviceEventType eventType)
    {
        switch (eventType)
        {
            case kUnityGfxDeviceEventInitialize:
            {
                s_RendererType = s_Graphics->GetRenderer();
                //TODO: user initialization code
                break;
            }
            case kUnityGfxDeviceEventShutdown:
            {
                s_RendererType = kUnityGfxRendererNull;
                //TODO: user shutdown code
                break;
            }
            case kUnityGfxDeviceEventBeforeReset:
            {
                //TODO: user Direct3D 9 code
                break;
            }
            case kUnityGfxDeviceEventAfterReset:
            {
                //TODO: user Direct3D 9 code
                break;
            }
        };
    }
插件的渲染线程回调

绘制在统一的平台,可以多线程如果一些可用的CPU将允许它。当多线程渲染时,渲染API命令,发生在一个线程从一个运行MonoBehaviour脚本完全分开。因此,它不可能为你的插件立即开始执行渲染的,因为可能会妨碍任何渲染线程的时间做。

为了做任何渲染插件,你应该打电话gl.issuepluginevent从你的脚本。这将导致提供的原生功能是从渲染线程调用。例如,如果你调用从相机OnPostRender函数gl.issuepluginevent,你相机渲染完成后立即回调到插件。

签名的unityrenderingevent回调提供iunitygraphics。H 本地插件的代码:

/ /插件函数来处理一个特定的渲染事件
静态unity_interface_api onrenderevent(int eventid)
{
// TODO:用户绘制的代码
}

/自由定义功能通过一个回调函数插件脚本
extern“C”的具体unityrenderingevent unity_interface_export unity_interface_api
getrendereventfunc()
{
返回onrenderevent;
管理插件的代码示例:

    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport("RenderingPlugin")]
    #endif
    private static extern IntPtr GetRenderEventFunc();

    // Queue a specific callback to be called on the render thread
    GL.IssuePluginEvent(GetRenderEventFunc(), 1);
这样的回调,现在也可以通过添加commandbufferscommandbuffer.issuepluginevent。

例子

一个渲染插件实例可以在这里下载。这说明两件事:

渲染一个三角形的旋转从C代码毕竟定期进行渲染。
填补了从C代码的一个程序上的纹理,使用texture.getnativetextureptr访问它。
工程项目:

Windows(Visual Studio 2013)和Mac OS X(Xcode 3.2)使用Direct3D 9,Direct3D 11和OpenGL,Direct3D 12根据平台。Direct3D 9部分代码还演示了如何处理“丢失”的设备。
Windows应用商店的应用程序(见renderingplugin \ wsavisualstudio2013的更多信息)


回复

使用道具 举报

0

主题

825

帖子

2702

积分

vip会员

Rank: 1

积分
2702
发表于 2016-7-13 19:32:21 来自手机 | 显示全部楼层
楼主好人!
回复 支持 反对

使用道具 举报

0

主题

832

帖子

2730

积分

vip会员

Rank: 1

积分
2730
发表于 2016-7-13 19:41:16 | 显示全部楼层
好吗
回复 支持 反对

使用道具 举报

0

主题

833

帖子

2748

积分

vip会员

Rank: 1

积分
2748
发表于 2016-7-13 20:24:12 来自手机 | 显示全部楼层
怎么下载额
回复 支持 反对

使用道具 举报

0

主题

889

帖子

2959

积分

vip会员

Rank: 1

积分
2959
发表于 2016-7-13 20:54:13 来自手机 | 显示全部楼层
谢谢共享,总之先收藏了
回复 支持 反对

使用道具 举报

0

主题

852

帖子

2878

积分

vip会员

Rank: 1

积分
2878
发表于 2016-7-13 21:46:18 来自手机 | 显示全部楼层
全就行啊,,支持 一下
回复 支持 反对

使用道具 举报

0

主题

867

帖子

2882

积分

vip会员

Rank: 1

积分
2882
发表于 2016-7-13 22:08:58 | 显示全部楼层
这就是为什么春哥在天朝这么火的原因啊!
回复 支持 反对

使用道具 举报

0

主题

877

帖子

2880

积分

vip会员

Rank: 1

积分
2880
发表于 2016-7-13 22:20:04 | 显示全部楼层
一定要看看。。。。。。
回复 支持 反对

使用道具 举报

0

主题

867

帖子

2873

积分

vip会员

Rank: 1

积分
2873
发表于 2016-7-13 22:57:06 来自手机 | 显示全部楼层
真的是全套吗?
回复 支持 反对

使用道具 举报

0

主题

879

帖子

2890

积分

vip会员

Rank: 1

积分
2890
发表于 2016-7-14 00:01:57 来自手机 | 显示全部楼层
这个必须顶,,,,
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部