You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:52:35