Unity&PlayFab向离线玩家发送好友请求报错问题求助
解决PlayFab离线好友请求保存失败问题
错误原因
你使用的PlayFabClientAPI.UpdateUserData属于客户端API,只能修改当前登录玩家自身的数据,对应的客户端版UpdateUserDataRequest确实没有PlayFabId参数。要修改离线玩家(其他玩家)的用户数据,必须使用PlayFab的Server API。
修改方案
- 切换到Server API:使用
PlayFabServerAPI.UpdateUserData,它对应的请求类包含PlayFabId参数,可指定目标玩家ID。 - 优化数据结构:避免用玩家显示名当键(可能重名),改用发送方的PlayFab ID作为唯一标识,同时存储显示名和请求状态。
- 注意安全:Server API需要Server密钥,禁止在客户端直接暴露密钥,建议通过自己的后端服务中转调用,或在专用服务器逻辑中执行。
修改后的完整代码
// 建议在服务器端/后端服务中执行此方法,避免客户端暴露Server密钥 public void SaveFriendRequest(string targetPlayerId, string senderPlayFabId, string senderDisplayName) { // 用发送方PlayFabID作为键,防止重名覆盖,存储显示名+请求状态 var friendRequestData = new Dictionary<string, string> { { $"FriendReq_{senderPlayFabId}", $"{senderDisplayName}|pending" } }; var updateRequest = new PlayFab.ServerModels.UpdateUserDataRequest { PlayFabId = targetPlayerId, Data = friendRequestData, Permission = PlayFab.ServerModels.UserDataPermission.Public // 设为Public方便目标玩家客户端读取 }; PlayFabServerAPI.UpdateUserData(updateRequest, OnSaveSuccess, OnSaveFailure); } // 保存成功回调 private void OnSaveSuccess(PlayFab.ServerModels.UpdateUserDataResult result) { Debug.Log("好友请求已成功保存至目标玩家数据"); } // 保存失败回调 private void OnSaveFailure(PlayFabError error) { Debug.LogError($"保存好友请求失败:{error.ErrorMessage}(错误码:{error.ErrorCode})"); }
额外说明
- 读取好友请求:目标玩家登录后,可通过
PlayFabClientAPI.GetUserData读取自己的Public数据,解析所有以FriendReq_开头的键,获取待处理的好友请求。 - 权限选择:如果不想让其他玩家看到请求,可将
Permission设为Private,但目标玩家仍能通过Client API读取自己的Private数据。
内容的提问来源于stack exchange,提问作者energy app
相关产品推荐
相关产品推荐

