UE4使用Cesium加载私有桶资源FName超限及调高NAME_SIZE上限方法问询
你遇到的FName's 1023 max length exceeded. Got 1405 characters excluding null-terminator报错,根因是UE4中FName类型默认最大长度限制为1023字节,将CloudFront Signed Cookie全量转为URL查询参数后长度超出限制导致。下面分两类路径给出解决方案:
更优的替代方案(优先推荐,无需修改引擎底层)
- 改用CloudFront Signed URL而非Signed Cookie:Signed URL仅需为单个资源生成专属的短签名参数,无需将Cookie的多个字段全部拼接至URL中。你可以在项目中继承
UCesium3DTileset类,重写资源请求回调,每次发起瓦片请求前实时为对应资源URL拼接单签名参数,而非一次性拼接所有Cookie字段,可大幅缩短URL长度。 - 部署轻量中转代理:在服务端搭建简单的请求代理服务,UE侧所有瓦片请求统一发往该代理地址,由代理侧携带CloudFront签名信息访问S3私有桶资源,再将结果返回给UE。该方案下UE侧的URL仅包含代理地址和瓦片路径,完全不会携带超长签名参数,也无需暴露私有桶的访问权限。
- 直接在请求头携带Cookie:修改Cesium for UE源码中HTTP请求的构造逻辑,找到
CesiumHttpClient相关实现,在发送3DTiles资源请求时,直接将Signed Cookie写入请求头的Cookie字段,无需转为查询参数修改URL,从根源避免URL超长问题。
修改NAME_SIZE的可行性及操作方法
调整
NAME_SIZE的方案可行,但属于UE底层修改,需要全量重新编译UE引擎,且会带来额外内存开销:每个FName实例的内存占用会随你设置的最大值同步提升,若项目中大量使用FName,内存占用会有可感知的上涨,同时部分硬编码FName长度限制的第三方插件可能出现兼容问题,若非特殊情况不推荐优先使用该方案。
具体实现步骤如下:
- 若你使用的是Epic Games Launcher分发的预编译版本UE,需要先下载对应版本的UE源码;若已经在使用源码版UE,直接进入下一步
- 打开UE源码目录下的
Engine/Source/Runtime/Core/Public/UObject/NameTypes.h文件 - 找到宏定义
#define NAME_SIZE 1024,将数值修改为满足你需求的大小(比如2048,建议预留足够冗余) - 全量重新编译UE引擎,同时重新编译你项目中依赖引擎底层的所有插件(包括Cesium for UE插件)
- 验证修改:在项目中打印
FName::GetMaxNameLength()的返回值,确认数值与你修改的配置一致即生效。
内容的提问来源于stack exchange,提问作者Aayush
相关产品推荐
相关产品推荐

