Steam連携
    • PDF

    Steam連携

    • PDF

    記事の要約

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

    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.