NetGUID
UE用NetGUID标识每个可复制的Actor,前后端通过这个ID对应同一个对象。
NetGUID映射表
UNetDriver(全局唯一)通过FNetGUIDCache* GuidCache成员持有全局的NetGUID与FNetGuidCacheObject映射表。
前后端连接成功后,前后端各自创建一个UNetConnection,UNetConnection通过UPackageMap* PackageMap成员引用全局的UNetDriver::FNetGUIDCache映射表。
PackageMap管理每个UNetConnection的连接状态:AckState(哪些 NetGUID 已确认)、ExportBunches(待发送的导出包)。并且提供抽象接口,可替换实现。
UActorComponent网络身份
UActorComponent默认分配独立的NetGUID。
UActorComponent属性复制和RPC调用走的是所属Actor的ActorChannel,内部通过ObjectID标识组件对象。
即便向一个UActorComponent发送RPC,底层也是向这个UActorComponent所属的Actor发送RPC,只不过会用额外的额参数指向这个UActorComponent。
// UNetDriver::ProcessRemoteFunction
virtual void ProcessRemoteFunction(
AActor* Actor, // ← RPC 绑定到这个 Actor
UFunction* Function,
void* Parameters,
FOutParmRec* OutParms,
UFrame* Stack,
UObject* SubObject // ← SubObject 可选,但仍在 Actor 通道内
);
// ActorChannel.h
virtual void ProcessRemoteFunction(
AActor* Actor,
UFunction* Function,
void* Parameters,
FOutParmRec* OutParms,
UFrame* Stack,
class UObject* SubObject = nullptr // ← 即使指定 SubObject
); // 仍然走 Actor 的 ActorChannel
Discussion
留言讨论
发表留言时,评论服务会记录必要的 IP 与 User-Agent 信息,用于安全审核和防止滥用。