SDK を使用してプレイヤーを見つける - プレイヤーを検索する - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
ラッパーを開く
このチュートリアルでは、AccelByte Gaming Services (AGS) Game SDK を使用して、表示名またはフレンドコードでプレイヤーを検索する方法を学びます。Byte Wars には、FriendsEssentialsWrapper.cs という SDK ラッパーがあります。このラッパーには、プレイヤー検索に関連する機能が含まれています。このチュートリアルでは、そのラッパーのスターターバージョンを使用して、フレンド機能を自由に実装できます。
スターターパックの内容
このチュートリアルを進めるには、FriendsEssentialsWrapper_Starter というフレンドエッセンシャルラッパーのスターターバージョンを見つけてください。このクラスには、すでにいくつかの機能が実装されています。プレイヤー検索機能を完成させるために、このクラスにさらに機能を追加します。
FriendsEssentialsWrapper_Starterファイル:/Assets/Resources/Modules/Social/FriendsEssentials/Scripts/FriendEssentialsWrapper_Starter.cs
FriendsEssentialsWrapper_Starter クラスには、すでにいくつかの機能があります:
-
プレイヤーの詳細を取得するための AGS Game SDK クラスは、
User、Lobby、およびUserProfilesです。これらのコード行はFriendsEssentialsWrapper_Starterにあります:private static ApiClient ApiClient => AccelByteSDK.GetClientRegistry().GetApi();
private User user;
private UserProfiles userProfiles;
private Lobby lobby; -
プレイヤーのフレンドリストが変更されたとき、またはプレイヤーを検索しているときに他のオブジェクトに通知し、それに応じて何かを実行できるようにする
ObservableListプロパティ。public ObservableList<string> CachedFriendUserIds { get; private set; } = new ObservableList<string>(); -
Awake()関数は、SDK からユーザー、ユーザープロファイル、およびロビーを取得するために使用されます。private void Awake()
{
user = ApiClient.GetUser();
userProfiles = ApiClient.GetUserProfiles();
lobby = ApiClient.GetLobby();
}
ユーザー詳細の取得を実装する
検索したユーザーとそのフレンドの詳細(表示名やアバター画像など)を表示するには、この情報を取得するための特定の SDK 関数を呼び出す必要があります。FriendsEssentialsWrapper_Starter.cs ファイルを開き、以下の GetBulkUserInfo() 関数を追加して、このためのユーティリティ関数を作成しましょう。この関数を使用すると、複数のユーザーの情報を一度にクエリできます。
public void GetBulkUserInfo(string[] userIds, ResultCallback<AccountUserPlatformInfosResponse> resultCallback)
{
user.GetUserOtherPlatformBasicPublicInfo("ACCELBYTE", userIds, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning("Error getting bulk user info, " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Successfully retrieved bulk user info");
CachedFriendUserIds.Add(userIds);
}
resultCallback?.Invoke(result);
});
}
フレンドコードでプレイヤーを検索する実装
このセクションでは、フレンドコードでプレイヤーを検索する機能を実装します。
-
FriendsEssentialsWrapper_Starter.csを開き、現在ログインしているプレイヤーのフレンドコード(パブリック ID とも呼ばれます)を取得するためのGetSelfFriendCode()という新しい関数を作成します。public void GetSelfFriendCode(ResultCallback<string> resultCallback)
{
string userId = GameData.CachedPlayerState.PlayerId;
if (string.IsNullOrEmpty(userId))
{
string errorMessage = "Error to get self friend code. Failed to find the logged-in user Id.";
BytewarsLogger.LogWarning(errorMessage);
resultCallback.Invoke(Result<string>.CreateError(ErrorCode.InvalidArgument, errorMessage));
return;
}
// Use cache if available.
if (userId == cachedUserProfile?.userId)
{
resultCallback.Invoke(Result<string>.CreateOk(cachedUserProfile.publicId));
return;
}
// Query the user profile to get its friend code (public ID).
userProfiles.GetPublicUserProfile(userId, (Result<PublicUserProfile> result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning($"Error to get self friend code. Error: {result.Error.Message}");
resultCallback.Invoke(Result<string>.CreateError(result.Error.Code, result.Error.Message));
return;
}
BytewarsLogger.Log($"Successfully get self friend code for User Id: {userId}");
cachedUserProfile = result.Value;
resultCallback.Invoke(Result<string>.CreateOk(cachedUserProfile.publicId));
});
} -
GetUserByFriendCode()という新しい関数を作成します。ここで使用される SDK 関数はPublicUserDataではなくPublicUserProfileを返しますが、後者に存在するデータが必要です。そのため、最後にGetBulkUserInfoを呼び出してそれらのデータを取得します。また、ローカルプレイヤーが現在そのユーザーを検索していることを他のオブジェクトに通知するために、ターゲットユーザーをCachedFriendUserIdsに追加しています。public void GetUserByFriendCode(string friendCode, ResultCallback<AccountUserPlatformData> resultCallback)
{
userProfiles.GetUserProfilePublicInfoByPublicId(friendCode, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning(
$"Error getting user profile public info by public id. " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
resultCallback?.Invoke(Result<AccountUserPlatformData>.CreateError(result.Error.Code, result.Error.Message));
return;
}
GetBulkUserInfo(new string[] { result.Value.userId }, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning(
$"Error getting user profile public info by public id. " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
resultCallback?.Invoke(Result<AccountUserPlatformData>.CreateError(result.Error.Code, result.Error.Message));
return;
}
BytewarsLogger.Log("Successfully retrieved user profile public info by public id.");
AccountUserPlatformData userData = result.Value.Data[0];
CachedFriendUserIds.Add(userData.UserId);
resultCallback?.Invoke(Result<AccountUserPlatformData>.CreateOk(userData));
});
});
} -
フレンドシップステータスを取得するための
GetFriendshipStatus()という新しい関数を作成します。名前が示すように、これはプレイヤーとローカルプレイヤーとのフレンドシップステータスを取得するために使用されます。public void GetFriendshipStatus(string userId, ResultCallback<FriendshipStatus> resultCallback)
{
lobby.GetFriendshipStatus(userId, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning("Error getting friendship status, " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Successfully retrieved friendship status for {userId}");
}
resultCallback.Invoke(result);
});
}
表示名でプレイヤーを検索する実装
このセクションでは、表示名でプレイヤーを検索する機能を実装します。
-
FriendsEssentialsWrapper_Starter.csを開き、GetUserByDisplayName()という新しい関数を作成します。Byte Wars では、検索結果は 1 つのみ許可されています。そのため、この関数では最初の結果のみが取得されます。また、ローカルプレイヤーが現在そのユーザーを検索していることを他のオブジェクトに通知するために、ターゲットユーザーがCachedFriendUserIdsに追加されます。備考バックエンドは、表示名検索を実行するために 3 文字から 20 文字の長さ(両端を含む)のみを受け入れることができます。この範囲外の入力は結果を返しません。ただし、AGS Private Cloud ユーザーは、環境変数を設定することでキーワード文字範囲を変更できます。
API リファレンス: IAM/PublicSearchUserV3
public void GetUserByExactDisplayName(string displayName, ResultCallback<PublicUserInfo> resultCallback)
{
const SearchType searchBy = SearchType.DISPLAYNAME;
user.SearchUsers(displayName, searchBy, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning("Error searching users by display name, " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
resultCallback?.Invoke(Result<PublicUserInfo>.CreateError(result.Error.Code, result.Error.Message));
return;
}
PublicUserInfo userByExactDisplayName = result.Value.data.FirstOrDefault(publicUserInfo =>
AccelByteWarsOnlineUtility.GetDisplayName(publicUserInfo).Equals(displayName, StringComparison.CurrentCultureIgnoreCase));
if (userByExactDisplayName == null)
{
BytewarsLogger.LogWarning($"User with display name {displayName} not found.");
resultCallback?.Invoke(Result<PublicUserInfo>.CreateError(ErrorCode.UserNotFound, "User not found."));
return;
}
BytewarsLogger.Log($"Successfully found users for display name: {displayName}");
CachedFriendUserIds.Add(userByExactDisplayName.userId);
resultCallback?.Invoke(Result<PublicUserInfo>.CreateOk(userByExactDisplayName));
});
}
アバターの取得を実装する
前の関数から収集されたデータは、プレイヤーのアバター URL であり、画像自体ではありません。実際の画像を取得するには、SDK から別の関数を呼び出す必要があります。次の手順に従ってください:
-
FriendsEssentialsWrapper_Starter.csを開き、GetUserAvatar()という新しい関数を作成します。public void GetUserAvatar(string userId, ResultCallback<Texture2D> resultCallback)
{
user.GetUserAvatar(userId, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning("Error getting Avatar, " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Successfully retrieved Avatar for User Id: {userId}");
}
resultCallback?.Invoke(result);
});
}
フレンドリクエストの送信を実装する
フレンド招待リクエストを送信する機能を実装するには、FriendsEssentialsWrapper_Starter.cs を開き、SendFriendRequest() という新しい関数を作成します。
public void SendFriendRequest(string userId, ResultCallback resultCallback)
{
lobby.RequestFriend(userId, result =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning("Error sending Friends Request, " +
$"Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
BytewarsLogger.Log("Successfully sent Friends Request");
}
resultCallback?.Invoke(result);
});
}
リソース
- このチュートリアルで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。