玩家状态
1. 概述
玩家状态是一种非持久性数据,用于表示玩家在游戏中的状态,其他玩家可以看到这些状态。当玩家离线时,玩家状态将被清除。
2. 数据结构
在数据结构中,玩家状态包含两个部分:
- status:包括在线和离线两种状态,PGOS会根据玩家的实际情况自动分配这些状态。
- presence:这是由游戏自定义的字符串,当玩家离线时会自动清除。
enum class EClientOnlineStatus
{
OnlineStatus_Offline = 0,
OnlineStatus_Online = 1
};
struct FClientPlayerPresence
{
EClientOnlineStatus status;
FString presence;
};
3. 设置当前玩家的在线状态
For 游戏客户端
从 PlayerProfile 模块调用 SetMyPresence
。
#include "PgosSDKCpp.h"
// for my player
void SomeUObjectClass::SetMyPresence()
{
auto playerProfile = IPgosSDKCpp::Get().GetClientPlayerProfileAPI();
if (playerProfile)
{
FString presence = "Matchmaking";
playerProfile->SetMyPresence(presence, [](const FPgosResult& Ret) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("SetMyPresence Success"))
}
else
{
UE_LOG(LogTemp, Log, TEXT("SetMyPresence Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}
4. 获取当前玩家的在线状态
For 游戏客户端:
从 PlayerProfile 模块调用 GetMyPresence
。
#include "PgosSDKCpp.h"
// for my player
void SomeUObjectClass::GetMyPresence()
{
auto playerProfile = IPgosSDKCpp::Get().GetClientPlayerProfileAPI();
if (playerProfile)
{
playerProfile->GetMyPresence([](const FPgosResult& Ret, const FClientPlayerPresence* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetMyPresence Success"))
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetMyPresenceFailed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}
5. 获取玩家状态
游戏可以查询一个或多个玩家的玩家状态。 For 游戏客户端
- 单个玩家:从 PlayerProfile 模块调用
GetPlayerPresence
。 - 多个玩家(批量):从 PlayerProfile 模块调用
BatchGetPlayerPre
#include "PgosSDKCpp.h"
// for one player
void SomeUObjectClass::GetPlayerPresence()
{
auto playerProfile = IPgosSDKCpp::Get().GetClientPlayerProfileAPI();
if (playerProfile)
{
FString PlayerID = "11223344";
playerProfile->GetPlayerPresence(PlayerID, [](const FPgosResult& Ret, const FClientPlayerPresence* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetPlayerPresence Success"))
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetPlayerPresence Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}
// for a batch of players
void SomeUObjectClass::BatchGetPlayerPresence()
{
auto playerProfile = IPgosSDKCpp::Get().GetClientPlayerProfileAPI();
if (playerProfile)
{
TArray<FString> PlayerIDs = {"11223344", "55667788"};
playerProfile->BatchGetPlayerPresence(PlayerIDs, [](const FPgosResult& Ret, const FClientBatchGetPlayerPresenceResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("BatchGetPlayerPresence Success"))
}
else
{
UE_LOG(LogTemp, Log, TEXT("BatchGetPlayerPresence Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}
6. 好友状态
游戏可以通过以下方式获取好友的玩家状态:
- 通过调用 GetFriendList API 获取好友列表,其回调数据中包含玩家状态信息。
struct FClientPlayerInfoWithStatus : public FPlayerInfo
{
EClientOnlineStatus status;
FString presence;
};
struct FClientFriendListInfo
{
TArray<FClientPlayerInfoWithStatus> friend_info_list;
};
- 虽然可以使用GetPlayerPresence API获取任意玩家的状态,但是通过监听OnFriendPresenceChanged事件是获取好友状态更高效的方式。请注意,要使用
OnFriendPresenceChanged
事件,游戏需要先订阅好友状态。
7. 查看玩家状态
游戏还可以查询指定玩家的状态。
/Tabs>