406 lines
13 KiB
C#
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;
|
|
}
|
|
}
|
|
} |