#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX #define STEAMWORKS_ENABLED #endif #if STEAMWORKS_ENABLED using Steamworks; #endif using System.Collections; using UnityEngine; using UnityEngine.UI; using TcgEngine; // 添加TcgEngine命名空间引用以访问SteamCurrencyManager namespace TcgEngine.UI { /// /// Main script for the login menu scene /// public class LoginMenu : MonoBehaviour { [Header("Login")] public UIPanel login_panel; public InputField login_user; public InputField login_password; public Button login_button; public GameObject login_bottom; public Text error_msg; [Header("Register")] public UIPanel register_panel; public InputField register_username; public InputField register_email; public InputField register_password; public InputField register_password_confirm; public Button register_button; [Header("Other")] public GameObject test_area; [Header("Music")] public AudioClip music; private bool clicked = false; private static LoginMenu instance; #if STEAMWORKS_ENABLED private Callback m_GameOverlayActivated; private Callback m_UserStatsReceived; private Callback m_UserStatsStored; private Callback m_SteamServersConnected; private Callback m_SteamServersDisconnected; private Callback m_ValidateAuthTicketResponse; #endif void Awake() { instance = this; #if STEAMWORKS_ENABLED // 确保SteamManager存在 if (SteamManager.Initialized) { // 注册 Steam 回调 m_GameOverlayActivated = Callback.Create(OnGameOverlayActivated); m_UserStatsReceived = Callback.Create(OnUserStatsReceived); m_UserStatsStored = Callback.Create(OnUserStatsStored); m_SteamServersConnected = Callback.Create(OnSteamServersConnected); m_SteamServersDisconnected = Callback.Create(OnSteamServersDisconnected); m_ValidateAuthTicketResponse = Callback.Create(OnValidateAuthTicketResponse); Debug.Log("Steam initialized through SteamManager"); } // 初始化Steam货币系统 if (SteamCurrencyManager.instance == null) { GameObject steamCurrencyGO = new GameObject("SteamCurrencyManager"); SteamCurrencyManager currencyManager = steamCurrencyGO.AddComponent(); currencyManager.InitializeSteamCurrency(); } else { SteamCurrencyManager.instance.InitializeSteamCurrency(); } #endif } #if STEAMWORKS_ENABLED private void OnGameOverlayActivated(GameOverlayActivated_t pCallback) { if (pCallback.m_bActive != 0) { Debug.Log("Steam overlay now active"); } else { Debug.Log("Steam overlay now inactive"); } } private void OnUserStatsReceived(UserStatsReceived_t pCallback) { if ((ulong)pCallback.m_nGameID == SteamUtils.GetAppID().m_AppId && pCallback.m_eResult == EResult.k_EResultOK) { Debug.Log("Received stats and achievements from Steam"); } else { Debug.Log("Failed to receive stats and achievements from Steam"); } } private void OnUserStatsStored(UserStatsStored_t pCallback) { if (pCallback.m_eResult == EResult.k_EResultOK) { Debug.Log("Stored stats and achievements to Steam"); } else { Debug.Log("Failed to store stats and achievements to Steam"); } } private void OnSteamServersConnected(SteamServersConnected_t pCallback) { Debug.Log("Connected to Steam servers"); } private void OnSteamServersDisconnected(SteamServersDisconnected_t pCallback) { Debug.Log("Disconnected from Steam servers"); } private void OnValidateAuthTicketResponse(ValidateAuthTicketResponse_t pCallback) { Debug.Log("Auth ticket response received"); } public void UnlockAchievement(string achievementId) { if (SteamManager.Initialized) { bool ret = SteamUserStats.SetAchievement(achievementId); if (ret) { SteamUserStats.StoreStats(); Debug.Log("Unlocked achievement: " + achievementId); } } } public void UpdateStat(string statName, int value) { if (SteamManager.Initialized) { bool ret = SteamUserStats.SetStat(statName, value); if (ret) { SteamUserStats.StoreStats(); Debug.Log($"Updated stat {statName} to {value}"); } } } public string GetSteamUserName() { if (SteamManager.Initialized && SteamUser.GetSteamID().IsValid()) { return SteamFriends.GetPersonaName(); } return ""; } public ulong GetSteamID() { if (SteamManager.Initialized && SteamUser.GetSteamID().IsValid()) { return SteamUser.GetSteamID().m_SteamID; } return 0; } #endif private void Start() { AudioTool.Get().PlayMusic("music", music); BlackPanel.Get().Show(true); error_msg.text = ""; test_area.SetActive(Authenticator.Get().IsTest()); string user = PlayerPrefs.GetString("tcg_last_user", ""); login_user.text = user; if (Authenticator.Get().IsTest()) { login_password.gameObject.SetActive(false); login_bottom.SetActive(false); } else if (!string.IsNullOrEmpty(user)) { SelectField(login_password); } RefreshLogin(); } void Update() { login_button.interactable = !clicked && !string.IsNullOrWhiteSpace(login_user.text); register_button.interactable = !clicked && !string.IsNullOrWhiteSpace(register_username.text) && !string.IsNullOrWhiteSpace(register_email.text) && !string.IsNullOrWhiteSpace(register_password.text) && register_password.text == register_password_confirm.text; if (login_panel.IsVisible()) { if (Input.GetKeyDown(KeyCode.Tab)) { if (login_user.isFocused) SelectField(login_password); else SelectField(login_user); } if (Input.GetKeyDown(KeyCode.Return)) { if (login_button.interactable) OnClickLogin(); } } if (register_panel.IsVisible()) { if (Input.GetKeyDown(KeyCode.Tab)) { if (register_username.isFocused) SelectField(register_email); else if (register_email.isFocused) SelectField(register_password); else if (register_password.isFocused) SelectField(register_password_confirm); else SelectField(register_username); } if (Input.GetKeyDown(KeyCode.Return)) { if (register_button.interactable) OnClickRegister(); } } } private async void RefreshLogin() { bool success = await Authenticator.Get().RefreshLogin(); if (success) { SceneNav.GoTo("Menu"); } #if STEAMWORKS_ENABLED else if (SteamManager.Initialized && SteamUser.GetSteamID().IsValid()) { string steamID = SteamUser.GetSteamID().ToString(); string personaName = SteamFriends.GetPersonaName(); Debug.Log("Steam User: " + personaName+"("+steamID+")"); bool success2 = await Authenticator.Get().SteamLogin(personaName+"@shenynet.com", personaName, steamID+"@shenynet.com"); if (success2) { Debug.Log("Steam User Success: " + personaName); } else { Debug.Log("Steam User Failure: " + Authenticator.Get().GetError()); } // 请求当前用户的统计信息 SteamUserStats.RequestUserStats(SteamUser.GetSteamID()); SceneNav.GoTo("Menu"); } #endif else { login_panel.Show(); BlackPanel.Get().Hide(); } } private async void Login(string user, string password) { clicked = true; error_msg.text = ""; bool success = await Authenticator.Get().Login(user, password); if (success) { PlayerPrefs.SetString("tcg_last_user", login_user.text); FadeToScene("Menu"); } else { clicked = false; error_msg.text = Authenticator.Get().GetError(); } } private async void Register(string email, string user, string password) { clicked = true; error_msg.text = ""; bool success = await Authenticator.Get().Register(register_email.text, register_username.text, register_password.text); if (success) { login_user.text = register_username.text; login_password.text = register_password.text; login_panel.Show(); register_panel.Hide(); } else { error_msg.text = Authenticator.Get().GetError(); } clicked = false; } public void OnClickLogin() { if (string.IsNullOrWhiteSpace(login_user.text)) return; if (clicked) return; Login(login_user.text, login_password.text); } public void OnClickRegister() { if (string.IsNullOrWhiteSpace(register_username.text)) return; if (string.IsNullOrWhiteSpace(register_email.text)) return; if (register_password.text != register_password_confirm.text) return; if (clicked) return; Register(register_email.text, register_username.text, register_password.text); } public void OnClickSwitchLogin() { login_panel.Show(); register_panel.Hide(); login_user.text = ""; login_password.text = ""; error_msg.text = ""; SelectField(login_user); } public void OnClickSwitchRegister() { login_panel.Hide(); register_panel.Show(); error_msg.text = ""; SelectField(register_username); } public void OnClickSwitchReset() { RecoveryPanel.Get().Show(); } public void OnClickGo() { FadeToScene("Menu"); } public void OnClickQuit() { Application.Quit(); } private void SelectField(InputField field) { if (!GameTool.IsMobile()) field.Select(); } public void FadeToScene(string scene) { StartCoroutine(FadeToRun(scene)); } private IEnumerator FadeToRun(string scene) { BlackPanel.Get().Show(); AudioTool.Get().FadeOutMusic("music"); yield return new WaitForSeconds(1f); SceneNav.GoTo(scene); } public static LoginMenu Get() { return instance; } } }