Steam連携
- 印刷する
- PDF
Steam連携
- 印刷する
- PDF
記事の要約
この要約は役に立ちましたか?
ご意見ありがとうございます
Classic/VPC環境で利用できます。
ゲームでの、プレイヤーの Steamアカウントを利用した認証設定を次のシナリオで説明します。
- Steamアカウントでログインを設定
- 既存のユーザーでログインまたは新規ユーザーを作成
- 匿名ログインから Steamアカウント経由のプラットフォームログインにユーザーを更新
ゲーム内のプレイヤーに Steamログインオプションを提供するために、Steamworksパートナーポータルからアプリを作成します。続けてユーザーをログインさせてセッションチケットを取得するために、Steamworks.Net SDKをインストールします。
Steamアカウントログインの設定
- Steamworksの文書に従ってアプリを作成し、アプリ IDを記録します。Steamworks documentation.
- ウェブ APIキー文書を使った認証に応じて公開者のウェブ APIキーを作成します。Authentication using Web API Keys
- Unity用 SDKをインストールする具体的な指示に従ってSteamWorks.Net SDKをインストールします。
- SteamWorks.Net SDK Unity pluginを Importします。
- プロジェクトのルートにある steam_appid.txtを開き、480を自分のアプリ IDに置き換えます。
- シーン内のゲームオブジェクトに Steamマネージャゲームコンポーネントを追加します。これで Steamライブラリがリセットされます。
- テストする前に、Steamがインストールされ、ログインしているか、開発中のプロジェクトライブラリにあるか確認します。
Steamログイン
- Steamworks.NETから最新バージョンをダウンロードし、Unity Importを行います。
- プロジェクトのルートフォルダに steam_appid.txtファイルを作成した後、Steamから発行された app IDを入れて保存します。
- Users & Permissions > Manage Group > Create Group > Create Web API KEYを作成します。
- Steam APP IDと Web APIキーを GAMEPOTダッシュボード > 連携 > Steamに追加します。
SteamManagerシーンを追加し、そのシーンに追加
Assets > Scripts > Steamworks.NET > SteamManager.csを、Hierarchyの空のオブジェクトを作成して追加します。
GAMEPOTログインに追加
Steamログインを完了した後、Steamセッションチケットを signInWithCredentialでログイン処理してください。
NBaseSDK.NBase.signInWithToken("steam", memberId, sessionTicket, (user, error) =>
{
try
{
if(error != null)
{
Debug.Log("Login Success - " + user.ToString());
}
memberId = user.Id;
}
catch (Exception ex)
{
Debug.Log($"An exception occurred during sign-in: {ex.Message}");
}
});
ゲームにコードを追加するサンプルコード
private Callback<GetAuthSessionTicketResponse_t> m_GetAuthSessionTicketResponse;
private byte[] m_Ticket;
private uint m_pcbTicket;
private HAuthTicket m_HAuthTicket;
// NBase Initializeの完了後に実行してください。
private void Initialize()
{
try
{
InitializeSteamAuth();
// Steamがリセットされたか確認
if (SteamManager.Initialized)
{
// Steamログイン状態を確認
if (SteamUser.BLoggedOn())
{
// ログイン済みの場合
CSteamID steamId = SteamUser.GetSteamID();
string steamName = SteamFriends.GetPersonaName();
Log($"Steam User Connected - Name: {steamName}, SteamID: {steamId}");
}
else
{
// ログインしていない場合
Log("Steam user not logged in. Opening Steam login overlay.");
ShowBox("Steam must be running to play this game.");
}
}
else
{
Log("Steam is not initialized. Please make sure Steam is running.");
ShowBox("Steam must be running to play this game.\nPlease start Steam and restart the game.");
}
}
catch (Exception ex)
{
Log($"Failed to initialize Steam login: {ex.Message}");
ShowBox("Failed to connect to Steam. Please restart the game.");
}
}
private void OnDestroy()
{
CleanupAuthTicket();
}
private void InitializeSteamAuth()
{
if (!SteamManager.Initialized)
{
Log("Steam is not initialized. Skipping auth ticket generation.");
return;
}
try
{
// Create callback for auth ticket response
m_GetAuthSessionTicketResponse = Callback<GetAuthSessionTicketResponse_t>.Create(OnGetAuthSessionTicketResponse);
// Initialize ticket buffer
m_Ticket = new byte[1024];
// Create SteamNetworkingIdentity instance
SteamNetworkingIdentity networkingIdentity = new SteamNetworkingIdentity();
// Get auth session ticket with networking identity
m_HAuthTicket = SteamUser.GetAuthSessionTicket(
m_Ticket,
1024,
out m_pcbTicket,
ref networkingIdentity
);
if (m_HAuthTicket == HAuthTicket.Invalid)
{
throw new Exception("Failed to get valid Steam auth ticket");
}
Log($"Successfully generated Steam auth ticket. Ticket size: {m_pcbTicket} bytes");
}
catch (Exception ex)
{
Log($"Error during Steam auth ticket generation: {ex.Message}");
CleanupAuthTicket();
}
}
private void OnGetAuthSessionTicketResponse(GetAuthSessionTicketResponse_t pCallback)
{
try
{
if (pCallback.m_hAuthTicket != m_HAuthTicket)
{
Log("Received response for different auth ticket");
return;
}
// Resize to buffer of actual ticket size
System.Array.Resize(ref m_Ticket, (int)m_pcbTicket);
// Format as Hex
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (byte b in m_Ticket)
{
sb.AppendFormat("{0:x2}", b);
}
CSteamID steamId = SteamUser.GetSteamID();
sessionTicket = sb.ToString();
NBaseSDK.NBase.signInWithToken("steam", steamId.ToString(), sessionTicket, (user, error) =>
{
try
{
if(error != null)
{
Debug.Log("Login Success - " + user.ToString());
}
memberId = user.Id;
}
catch (Exception ex)
{
Debug.Log($"An exception occurred during sign-in: {ex.Message}");
}
});
switch (pCallback.m_eResult)
{
case EResult.k_EResultOK:
Log("Steam auth ticket successfully generated");
break;
case EResult.k_EResultInvalidParam:
Log("Steam auth ticket generation failed: Invalid parameters");
break;
case EResult.k_EResultLimitExceeded:
Log("Steam auth ticket generation failed: Limit exceeded");
break;
default:
Log($"Steam auth ticket generation failed: {pCallback.m_eResult}");
break;
}
}
catch (Exception ex)
{
Log($"Error processing auth ticket response: {ex.Message}");
}
}
private void CleanupAuthTicket()
{
if (m_HAuthTicket != HAuthTicket.Invalid)
{
try
{
SteamUser.CancelAuthTicket(m_HAuthTicket);
m_HAuthTicket = HAuthTicket.Invalid;
m_Ticket = null;
Log("Steam auth ticket cleaned up successfully");
}
catch (Exception ex)
{
Log($"Error cleaning up auth ticket: {ex.Message}");
}
}
}
自動ログイン処理のサンプルコード
自動ログイン処理するために、まずログインしているかどうかを確認するサンプルコードです。
NBaseSDK.NBase.signInLastLoggedIn((user, error) =>
{
if (error != null)
{
// 自動ログインができない場合、一般ログインとして処理
NBaseSDK.NBase.signInWithToken("steam", steamId.ToString(), sessionTicket, (user, error) =>
{
try
{
if(error != null)
{
Debug.Log("Login Success - " + user.ToString());
}
}
catch (Exception ex)
{
Debug.Log($"An exception occurred during sign-in: {ex.Message}");
}
});
}
else if(user != null)
{
// 自動ログイン成功
Debug.Log("Login Success - " + user.ToString());
}
}
この記事は役に立ちましたか?