Files
tcg-client/Assets/TcgEngine/Scripts/Menu/LoginMenu.cs
2025-08-11 15:00:21 +08:00

406 lines
13 KiB
C#

#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
{
/// <summary>
/// Main script for the login menu scene
/// </summary>
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<GameOverlayActivated_t> m_GameOverlayActivated;
private Callback<UserStatsReceived_t> m_UserStatsReceived;
private Callback<UserStatsStored_t> m_UserStatsStored;
private Callback<SteamServersConnected_t> m_SteamServersConnected;
private Callback<SteamServersDisconnected_t> m_SteamServersDisconnected;
private Callback<ValidateAuthTicketResponse_t> m_ValidateAuthTicketResponse;
#endif
void Awake()
{
instance = this;
#if STEAMWORKS_ENABLED
// 确保SteamManager存在
if (SteamManager.Initialized)
{
// 注册 Steam 回调
m_GameOverlayActivated = Callback<GameOverlayActivated_t>.Create(OnGameOverlayActivated);
m_UserStatsReceived = Callback<UserStatsReceived_t>.Create(OnUserStatsReceived);
m_UserStatsStored = Callback<UserStatsStored_t>.Create(OnUserStatsStored);
m_SteamServersConnected = Callback<SteamServersConnected_t>.Create(OnSteamServersConnected);
m_SteamServersDisconnected = Callback<SteamServersDisconnected_t>.Create(OnSteamServersDisconnected);
m_ValidateAuthTicketResponse = Callback<ValidateAuthTicketResponse_t>.Create(OnValidateAuthTicketResponse);
Debug.Log("Steam initialized through SteamManager");
}
// 初始化Steam货币系统
if (SteamCurrencyManager.instance == null)
{
GameObject steamCurrencyGO = new GameObject("SteamCurrencyManager");
SteamCurrencyManager currencyManager = steamCurrencyGO.AddComponent<SteamCurrencyManager>();
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;
}
}
}