如何在Godot中从Image数据字典获取Format枚举值?
解决Godot中Image.Format枚举与字符串互转的问题
核心问题
通过RPC传输Image.data字典时,其中的format字段会被序列化为字符串(例如"RGBA8"),但Image.create_from_data需要传入Image.Format枚举值(例如Image.FORMAT_RGBA8),直接传递字符串会导致参数不匹配报错。
解决方案
方法1:用Godot内置枚举反射方法
Godot的枚举原生支持字符串与枚举值的互转,针对Image.Format可以直接用以下方式处理:
接收端:字符串转枚举值
修改接收代码,把序列化后的字符串格式转为枚举:
@rpc("any_peer", "call_remote", "reliable") func _set_texture_rpc(texture_data): # 将字符串格式转为Image.Format枚举值 var format_enum = Image.Format.get_value_from_name(texture_data.format) # 转换失败时 fallback 到RGBA8,避免报错 if format_enum == -1: format_enum = Image.FORMAT_RGBA8 var received_image = Image.create_from_data( texture_data.width, texture_data.height, texture_data.mipmaps, format_enum, texture_data.data ) received_texture = ImageTexture.create_from_image(received_image)
发送端(可选):主动转枚举为字符串
如果需要主动控制序列化后的格式字符串,也可以在发送时手动转换:
func _get_texture_for_rpc(texture): var img = texture.get_image() var img_data = img.data # 把枚举值转成对应名称字符串(和默认序列化结果一致,可选操作) img_data["format"] = Image.Format.get_name_from_value(img.format) return img_data
方法2:手动维护映射字典
如果担心不同Godot版本的枚举名称兼容性问题,可以自己定义映射表:
# 定义格式映射字典,按需添加需要的格式 var FORMAT_STRING_TO_ENUM = { "RGBA8": Image.FORMAT_RGBA8, "RGB8": Image.FORMAT_RGB8, "RGBA4444": Image.FORMAT_RGBA4444, "RGB565": Image.FORMAT_RGB565 } # 接收端使用 @rpc("any_peer", "call_remote", "reliable") func _set_texture_rpc(texture_data): # 找不到对应格式时默认用RGBA8 var format_enum = FORMAT_STRING_TO_ENUM.get(texture_data.format, Image.FORMAT_RGBA8) var received_image = Image.create_from_data( texture_data.width, texture_data.height, texture_data.mipmaps, format_enum, texture_data.data ) received_texture = ImageTexture.create_from_image(received_image)
注意事项
get_value_from_name找不到对应枚举名称时会返回-1,必须加 fallback 逻辑防止崩溃。- 确保发送和接收端使用相同Godot版本,不同版本的
Image.Format枚举名称可能存在差异。 - 传输大纹理的
data会占用较多带宽,建议必要时先对图像压缩再传输。
内容的提问来源于stack exchange,提问作者Double Sept
相关产品推荐
相关产品推荐

