UE4的属性同步竟然不区分字符串大小写

ProLightsfx 2025-7-16 16 7/16

一、起因

今天被UE4坑惨了,收到个bug单,偶发来回改名后,无法改回原名,重新登录后可继续修改回原名字。那么可能是DS同步到客户端之后值没有set进去,或者干脆没有同步给客户端,但这怎么会偶发呢?

废了很大劲,才找到稳定复现的办法[这是最艰难的一步],名字AB改成ab。然后再次改成AB的时候,就改不了了,说是名字没变。断点了一下还真是没有同步给客户端[裂开],客户端本地存的还是AB。

可能在我的常识里面cc++gorust等编程语言的字符串比较默认就是区分大小写的,所以以为UE的FString的比较运算符是区分大小写的。直到今天才知道老版本的UE4FString竟然默认不区分大小写,真的是绝了,要不要这么坑。

代码如下

// Engine/Source/Runtime/Core/Public/Containers/UnrealString.h
FORCEINLINE friend bool operator==(const FString& Lhs, const FString& Rhs)
 {
  return Lhs.Equals(Rhs, ESearchCase::IgnoreCase);
 }

二、字符串同步(Replication)是否受此影响?

同步机制本身不关心operator==的实现,它直接比较二进制数据(或调用NetSerialize)。

但属性同步的触发条件(如UPROPERTY(Replicated)的脏值检查)可能会依赖operator==,因此:

i.如果operator==被改为IgnoreCase,则"AB""ab"会被视为相同,不会触发同步。

ii.如果保持默认CaseSensitive,则"Hello""hello"会被视为不同,会触发同步。

三、RPC(远程过程调用)参数传递

RPC参数直接传输字符串的二进制数据,保留原始大小写,不受operator==影响。

四、查看新版本

查看了新版本UE5.3+,已经是默认区分大小写了。

// Engine/Source/Runtime/Core/Public/Containers/UnrealString.h
FORCEINLINE friend bool operator==(const FString& Lhs, const FString& Rhs)
{
    return Lhs.Equals(Rhs, ESearchCase::CaseSensitive); 
}

五、总结

乐观一点,UE的坑真的是踩一个就少一个[狗头]!

大家如果有基于UE的开发的话,可以检查下自己的版本是否区分大小写,这玩意儿是真的坑了。

关于

本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/article/ue4-case-sensitive/

Thank you!

                                                                                                                                             ------from ProLightsfx

如果你对推荐系统、游戏开发、C++优化、程序员成长等感兴趣或者想参与讨论的话,欢迎关注笔者公众号.

UE4的属性同步竟然不区分字符串大小写

- THE END -

ProLightsfx

7月16日16:54

最后修改:2025年7月16日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论