用Godot 4尝试编一个电子书软件,初步效果已经出来,并且通过管道通信接口可以获取、设置属性、调用函数,貌似能处理各种事宜了。
其实不然,外因通过内因起作用,如果没把里面搞明白,功能没有开放出来,则有些需求就不能实现。
比如,现在想动态加载新的图书,这就是一个实际需求。如果每一本电子书,都需要导出一次,那这个软件就太不通用了。
之前加载图片时,GDScript代码:
# 目标对象上加载图片
func loadPng(obj, pngFileName) -> bool:
var texture = load(pngFileName) as Texture2D;
if(texture != null):
obj.set_texture(texture);
obj.scale.y = get_viewport_rect().size.y / texture.get_height();
obj.scale.x = obj.scale.y;
obj.position.y = get_viewport_rect().size.y / 2; # 垂直居中
adjustPos();
return true;
return false;
直接加载另一图片,结果不成功

这就得研究一下了。
导入import
把这个图片拷贝到Godot开发环境中,发现切换回Godot时,会快速闪过一个import对话框,那想必Godot干了什么事
到资源管理器,看到多了一个对应的.import文件,打开看了一下内容
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rv5gm15xbcaf"
path="res://.godot/imported/DrGraph_Page24.png-1dd935fbb11807a645ea1ea79ec38662.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Pages/DrGraph_Page24.png"
dest_files=["res://.godot/imported/DrGraph_Page24.png-1dd935fbb11807a645ea1ea79ec38662.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
既然是动态生成的,那肯定是代码里写的。到源码中找,从哪里下手呢?查import、.import都是一大堆结果。再试试内容,查找[remap],结果很少

定位一看,是EditorFileSystem类的两个函数_reimport_group、_reimport_file,那肯定是用_reimport_file。但这个函数是不可访问的。好在源码在手,直接public出来,可以访问了。
但这个要给GDScript调用,还得做一些工作,需要加入到ClassDB中去。
为了简单一些,直接加到DllStream类中【见Godot 4 源码分析 - 增加管道通信_DrGraph的博客-优快云博客】,增加一个import函数
ClassDB::bind_method(D_METHOD("import", "fileName"), &DllStream::import);
String DllStream::import(String fileName) {
if (FileAccess::exists(fileName + ".import") == false)
EditorFileSystem::get_singleton()->_reimport_file(fileName);
return fileName;
}
运行后,还是不成功。调试发现,_find_file(p_file, &fs, cpos)返回false。而_find_file居然要求文件位于"res://"目录以下,也就是说,得在工程目录下。
bool EditorFileSystem::_find_file(const String &p_file, EditorFileSystemDirectory **r_d, int &r_file_pos) const {
//todo make faster
if (!filesystem || scanning) {
ret
408



被折叠的 条评论
为什么被折叠?



