跳到主要内容

玩家状态

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;
};

7. 查看玩家状态

游戏还可以查询指定玩家的状态。

presence

/Tabs>