Steam連携

Prev Next

Classic/VPC環境で利用できます。

ゲームでの、プレイヤーの Steamアカウントを利用した認証設定を次のシナリオで説明します。

  • Steamアカウントでログインを設定
  • 既存のユーザーでログインまたは新規ユーザーを作成
  • 匿名ログインから Steamアカウント経由のプラットフォームログインにユーザーを更新

ゲーム内のプレイヤーに Steamログインオプションを提供するために、Steamworksパートナーポータルからアプリを作成します。続けてユーザーをログインさせてセッションチケットを取得するために、Steamworks.Net SDKをインストールします。

Steamアカウントログインの設定

  1. Steamworksの文書に従ってアプリを作成し、アプリ IDを記録します。Steamworks documentation.
  2. ウェブ APIキー文書を使った認証に応じて公開者のウェブ APIキーを作成します。Authentication using Web API Keys
  3. Unity用 SDKをインストールする具体的な指示に従ってSteamWorks.Net SDKをインストールします。
    1. SteamWorks.Net SDK Unity pluginを Importします。
    2. プロジェクトのルートにある steam_appid.txtを開き、480を自分のアプリ IDに置き換えます。
    3. シーン内のゲームオブジェクトに Steamマネージャゲームコンポーネントを追加します。これで Steamライブラリがリセットされます。
    4. テストする前に、Steamがインストールされ、ログインしているか、開発中のプロジェクトライブラリにあるか確認します。

Steamログイン

  1. Steamworks.NETから最新バージョンをダウンロードし、Unity Importを行います。
    console_steam01
  2. プロジェクトのルートフォルダに steam_appid.txtファイルを作成した後、Steamから発行された app IDを入れて保存します。
    console_steam02
  3. Users & Permissions > Manage Group > Create Group > Create Web API KEYを作成します。
    console_steam03
  4. Steam APP IDと Web APIキーを GAMEPOTダッシュボード > 連携 > Steamに追加します。
    console_steam04

SteamManagerシーンを追加し、そのシーンに追加

Assets > Scripts > Steamworks.NET > SteamManager.csを、Hierarchyの空のオブジェクトを作成して追加します。
console_steam05

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