Robloxは、ユーザーが対話する各ゲームまたはアプリに対してユニークなドメインスコープ付きユーザーIDを割り当てます。このページでは、ドメインスコープによる識別がどのように機能するか、またゲームコード内でUser型をどのように使用するかを説明します。
ユーザー識別の中心となる概念は以下の通りです。
| 概念 | 説明 |
|---|---|
| ユーザー | Robloxの永続的なアカウント。 |
| プレイヤー | 実行中のゲームのデータモデル内でのユーザーの表現(プレイヤーを参照)。 |
| Userデータ型 | 特定のドメイン内でのユーザーのアイデンティティを表すデータ型。これは、ゲームコード内でユーザーを参照するための標準識別子です。 |
| ドメインスコープ付きユーザーID | 特定のドメイン内でユーザーを一意に識別する数値の識別子。この識別子は、すべてのゲームおよびアプリで異なります。 |
ドメインスコープ付きユーザーID
ドメインスコープ付きユーザーIDは、特定のゲームまたはアプリ内でユーザーに割り当てられるユニークな識別子です。グローバルユーザーIDとは異なり、ドメインスコープ付きユーザーIDはそれを発行したドメイン内でのみ意味を持つため、同じユーザーは対話する各ゲームまたはアプリで異なるドメインスコープ付きユーザーIDを持ちます。スコープ付きIDの展開前にゲームに参加したプレイヤーは、そのゲーム内で元のグローバルユーザーIDを保持します(戻ってきたプレイヤーを参照)。
ドメインタイプはEnum.DomainTypeで表されます:
| ドメインタイプ | スコープされた先 | 例 |
|---|---|---|
| Enum.DomainType.EXPERIENCE | 特定のゲーム(ユニバース) | あなたのゲーム内でのプレイヤーのID |
| Enum.DomainType.OAUTH | 特定のOAuthアプリケーション | あなたの外部ツール内でのユーザーのID |
ドメインスコープ付きIDの仕組み
プレイヤーがあなたのゲームに参加すると、そのゲームにユニークなドメインスコープ付きユーザーIDが割り当てられます。同じプレイヤーが別のゲームに参加すると、異なるドメインスコープ付きユーザーIDが与えられます。これにより:
- ドメインスコープ付きユーザーIDは整数であり、既存のグローバルユーザーIDに似ています。
- ドメインスコープ付きユーザーIDは、既存のグローバルユーザーIDと衝突しません。
- 同じ数値が異なるドメインで異なるユーザーに現れることがあります。一意のキーは、ドメインタイプ、ドメインID、およびドメインスコープ付きユーザーIDの組み合わせです。
例のシナリオ
以下の例では、異なるゲームが同じユーザーをどのように参照するかを示しています:
| シナリオ | ユーザーの状況 | ゲームで見えるユーザーID |
|---|---|---|
| ユーザーがゲームAに接続 | 戻ってきたプレイヤー(スコープ付きID以前に訪れた) | 123(グローバルID、変更なし) |
| ユーザーがゲームBに接続 | スコープ付きIDの展開後の初回訪問 | 500789(ゲームBのドメインスコープ付きユーザーID) |
| ユーザーがゲームCに接続 | スコープ付きIDの展開後の初回訪問 | 302441(ゲームCのドメインスコープ付きユーザーID) |
戻ってきたプレイヤー
プレイヤーがスコープ付きユーザーIDの展開前にすでにあなたのゲームに参加していた場合、そのゲームにおける元のグローバルユーザーIDを保持します。これにより、既存のデータストアキー、リーダーボード、インベントリが変更なしで引き続き機能します。
ユーザー型の扱い方
Userは、ゲームコード内のユーザーを識別する標準的な方法です。Userの値は、ドメインスコープ付きユーザーIDとともにドメインタイプおよびドメインIDを保持するため、アイデンティティのコンテキストは常に識別子と共に送信されます。APIの詳細については、Userのリファレンスを参照してください。
プレイヤーからユーザーを取得する
Userを取得する主な方法は、接続されたPlayerからPlayer.Userを介して行います:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local user = player.User
print("ドメインユーザーID:", user.Id)
print("ドメインタイプ:", user.DomainType)
print("ドメインID:", user.DomainId)
end)
IDからユーザーを構築する
現在のゲーム内で既知のユーザーIDからUserを作成するには、User.fromId()を使用します:
local user = User.fromId(knownUserId)
エンジンAPIでのユーザーの使用
ユーザーIDパラメーターを受け入れるエンジンAPIは、Userの値を直接受け入れます。Userの使用を推奨します:
-- 両方の形式が動作します:BadgeService:AwardBadge(player.User, badgeId) -- 推奨BadgeService:AwardBadge(player.UserId, badgeId)
-- 両方の形式が動作します:local target = Players:GetPlayerByUserId(player.User) -- 推奨local target = Players:GetPlayerByUserId(someUserId)
数値のユーザーIDがユーザーIDを受け取るエンジンAPIに渡されると、自動的にUserにラップされます。
ユーザーIDを返すエンジンAPI
数値のユーザーIDを返すエンジンAPIは、同じフィールド名と型を使用し続けます。返される各IDは、プレイヤーがスコープ付きIDの展開前または後にゲームに参加したかに応じて、グローバルIDまたはドメインスコープ付きユーザーIDのいずれかです:
- 戻ってきたプレイヤー(最初にスコープ付きIDの展開前に参加)— APIはユーザーのグローバルユーザーIDを返します。
- 新しいプレイヤー(最初にスコープ付きIDの展開後に参加)— APIはユーザーのドメインスコープ付きユーザーIDを返します。
グローバルおよびドメインスコープ付きユーザーIDは、衝突しない標準の整数ですので、これらの数値フィールドを読み取る既存のコードは引き続き機能します。
ユーザーアイデンティティの保存
単一のゲーム内のデータストアキーには、直接user.Idを使用します:
local key = ("player_%d"):format(player.User.Id)PlayerDataStore:SetAsync(key, data)
他のシステムによって読み取られる可能性のある値や完全なドメインコンテキストが必要な値については、UserをToString()でシリアライズします:
local encoded = player.User:ToString()SomeDataStore:SetAsync("support_ticket_user", encoded)-- 後で、文字列から復元local user = User.fromString(encoded)
シリアリゼーションの保証についての詳細は、Userのリファレンスを参照してください。
ベストプラクティス
- 新しいコードでは、標準識別子としてPlayer.Userを使用してください。
- あるドメインからの数値のユーザーIDを使用して、別のドメイン内のユーザーを特定しないでください。