上文说了怎么用UE4嵌入Python,成功以后发现一个问题,使用PyQt时候直接崩溃,尝试多线程、多进程无果以后找到了上述大佬写的插件。
众所周知,网上能找到的都是虚幻自己带的python插件,但是这个插件不能被打包进游戏里面,如果想在游戏里面运行python就需要自己写。
之前有个第三方的UnrealEnginePython插件地址,但是由于长时间停止更新,新版本已经编译不过了,但仍然有很高的参考价值。
根据第四个链接,可以看到虚幻官方插件是如何做的,简单来说就是把PyQt自己的句柄传递给UE4让其代为显示,这样才不会引起崩溃。
这就给我们一个思路,可以查看上述大佬的代码,也是用的这个原理:
因为我们要自己写插件,所以需要参考官方的这个库是怎么实现的,正好了解到C++如何暴露库给Python(方法在前一期文字)由于unreal这个库是运行时动态加载的,我们不能直接看到py文件,所以需要去官方python插件里面找这个库的实现:
UE_4.26\Engine\Plugins\Experimental\PythonScriptPlugin\Source\PythonScriptPlugin
我们用vscode快速搜索这个插件,可以找到以下代码:
看到PyMethodDef PySlateMethods[]我们就很眼熟了,这正是C++嵌入Python的入口,里面包含了很多函数,其中高亮部分就是上述PyQt使用的核心部分。
具体的代码留到下一期再分析,通过学习官方的这个Python插件,能够了解很多功能是如何实现的。
拓展资料
UE4反射论述了Python是怎么调用到UE4蓝图的
经过查看官方UE4Python插件我得出结论
unreal.parent_external_window_to_slate()可以将Qt的窗口句柄设置到UE4的Slate句柄上,具体步骤如下:
在插件中找到PySlate.cpp根据上图找到这个函数的真正位置
重点是这里,SetWindowLongPtr,我们百度搜索一下这个win函数
可以看到GWL_HWNDPARENT的含义
补充:
可以在UE4里面直接调用Python的EXE,创建独立的PyQt进程,然后与UE4的python进行socket通讯,这样也能实现功能,而且比较容易实现。
之前测试凡是导入PyQt库的话直接会引起引擎崩溃,暂时找不到解决办法,只能先这样解决了。