本人最近研究了Godot的架构,在使用GDExtension时,发现网上的中文资料很少!!!所以本人抽空,在这里讲解一下如何使用GDExtension,并在Godot4中继续使用新版本的GDnative
首先,GDExtension是什么,GDExtension实质就是Godot4.0加入的新的二进制模块处理架构,使用它,可以实现在不编译引擎的情况下,直接给引擎编写模块(引入新的类)
当然,一提到二进制脚本,你可能会想起在Godot4.0之前的GDnative,如果你有GDnative开发经验,你应该会知道GDnative的原始C API是繁杂的,对移植很不友好,GDExtension解决了这个问题,GDExtension的API是轻量的!GDExtension也是易于移植的,只要你喜欢,在任何可以编译为动态库的语言中,你都可以轻易地编写与Godot4交互的胶水层。
所以GDExtension是取代了GDnative吗?不是的,GDExtension与GDnative设计的初衷不同,两者的使用方法也有很大区别,GDnative仍旧存在,只是GDnative API都做了变更,向GDExtension API迁移了,但仍有区别!
两者本质的不同是:GDnative是Godot的一个模块,而GDExtension是集成在引擎核心文件中的!
https://github.com/godotengine/godot-headers
你可以在github上的godot引擎项目的godot-headers子项中下载到gdnative_interface.h库文件
(当然,在godot引擎源代码godot/core/extension/gdnative_interface.h也可以找到)
目前gdnative_interface.h只有近500行,相比于过去的GDnative(数以千计的)来说,是真的简洁
https://github.com/godotengine/godot-cpp
当然,实际上你应该去godot-cpp,下载并配置官方集成库,这才是开发GDExtension的标配!!!
但本文重在介绍GDExtension的底层与Godot4的交互,所以就从原始的gdnative_interface.h来讲
!!!如有错误,请指出,谢谢!!!
开始之前,我们先用Godot4创建一个项目:
注:我的演示项目链接已放置下方,可以直接下载演示使用!
因为目前Godot4的opengl渲染驱动并未稳定开放,并且我的linux lite环境没有完备的vulkan驱动,
这代表我无法直接运行Godot4,我会收到<引擎渲染错误>的提示!!
但在等待Godot4的opengl渲染和vulkan驱动之前,我们仍旧可以用命令行操作Godot4,抢先体验它
!!!该教程中,我将以Godot命令行操作演示!!!
1.新建文件夹,作为我们的项目根目录,在其中创建一个project.godot文件,你不需要操作project.godot,待会Godot会自动读写,初始化项目
2.接着我们将Godot4应用程序复制到我们新建的文件夹中,执行:
./godot.64 -e --display-driver headless
其中-e代表运行编辑器,Godot会自动初始化project.godot
其中--display-driver表示图形渲染架构,这里我们选择headless(无渲染)
执行后,我们的项目目录中就有了.godot文件夹:
3.接着在项目中,创建一个GDExtension引导文件,文件为XXX.gdextension:
它的内容也很简单,configuration部分需注明动态库的入口点,这个我们下面重点讲
libraries部分就是指明动态库位置,格式为
特征字符=" 动态库在项目目录下的位置 ",这里不多赘述了,如有问题,请私聊
【这里吐槽一下,本人之所以研究4.0的gdnative卡了这么久,都是特征字符害的,详见本帖gdnative部分】
(注:特征字符可以到引擎源码OS::has_feature查询)
4.添加一个GDExtension资源表,用于引擎查询并加载GDExtension,在.godot中创建extension_list.cfg文件:
并添加XXX.gdextension的路径
至此,Godot4的GDExtension基本配置环境就完成了,但是!GDExtension想要正常加载,你必须启动整个项目,所以你得有个场景......这些配置我就不展示了,可以直接下载我的演示项目:
https://files.cnblogs.com/files/DND-duo/GDExtensionDemo.zip
准备好项目之后,我们就可以编写GDExtension了,接下文——
首先,GDExtension是什么,GDExtension实质就是Godot4.0加入的新的二进制模块处理架构,使用它,可以实现在不编译引擎的情况下,直接给引擎编写模块(引入新的类)
当然,一提到二进制脚本,你可能会想起在Godot4.0之前的GDnative,如果你有GDnative开发经验,你应该会知道GDnative的原始C API是繁杂的,对移植很不友好,GDExtension解决了这个问题,GDExtension的API是轻量的!GDExtension也是易于移植的,只要你喜欢,在任何可以编译为动态库的语言中,你都可以轻易地编写与Godot4交互的胶水层。
所以GDExtension是取代了GDnative吗?不是的,GDExtension与GDnative设计的初衷不同,两者的使用方法也有很大区别,GDnative仍旧存在,只是GDnative API都做了变更,向GDExtension API迁移了,但仍有区别!
两者本质的不同是:GDnative是Godot的一个模块,而GDExtension是集成在引擎核心文件中的!
https://github.com/godotengine/godot-headers
你可以在github上的godot引擎项目的godot-headers子项中下载到gdnative_interface.h库文件
(当然,在godot引擎源代码godot/core/extension/gdnative_interface.h也可以找到)
目前gdnative_interface.h只有近500行,相比于过去的GDnative(数以千计的)来说,是真的简洁
https://github.com/godotengine/godot-cpp
当然,实际上你应该去godot-cpp,下载并配置官方集成库,这才是开发GDExtension的标配!!!
但本文重在介绍GDExtension的底层与Godot4的交互,所以就从原始的gdnative_interface.h来讲
!!!如有错误,请指出,谢谢!!!
开始之前,我们先用Godot4创建一个项目:
注:我的演示项目链接已放置下方,可以直接下载演示使用!
因为目前Godot4的opengl渲染驱动并未稳定开放,并且我的linux lite环境没有完备的vulkan驱动,
这代表我无法直接运行Godot4,我会收到<引擎渲染错误>的提示!!
但在等待Godot4的opengl渲染和vulkan驱动之前,我们仍旧可以用命令行操作Godot4,抢先体验它
!!!该教程中,我将以Godot命令行操作演示!!!
1.新建文件夹,作为我们的项目根目录,在其中创建一个project.godot文件,你不需要操作project.godot,待会Godot会自动读写,初始化项目
2.接着我们将Godot4应用程序复制到我们新建的文件夹中,执行:
./godot.64 -e --display-driver headless
其中-e代表运行编辑器,Godot会自动初始化project.godot
其中--display-driver表示图形渲染架构,这里我们选择headless(无渲染)
执行后,我们的项目目录中就有了.godot文件夹:
3.接着在项目中,创建一个GDExtension引导文件,文件为XXX.gdextension:
它的内容也很简单,configuration部分需注明动态库的入口点,这个我们下面重点讲
libraries部分就是指明动态库位置,格式为
特征字符=" 动态库在项目目录下的位置 ",这里不多赘述了,如有问题,请私聊
【这里吐槽一下,本人之所以研究4.0的gdnative卡了这么久,都是特征字符害的,详见本帖gdnative部分】
(注:特征字符可以到引擎源码OS::has_feature查询)
4.添加一个GDExtension资源表,用于引擎查询并加载GDExtension,在.godot中创建extension_list.cfg文件:
并添加XXX.gdextension的路径
至此,Godot4的GDExtension基本配置环境就完成了,但是!GDExtension想要正常加载,你必须启动整个项目,所以你得有个场景......这些配置我就不展示了,可以直接下载我的演示项目:
https://files.cnblogs.com/files/DND-duo/GDExtensionDemo.zip
准备好项目之后,我们就可以编写GDExtension了,接下文——