Update Audio

This commit is contained in:
2026-04-30 17:47:29 +07:00
parent 4709fa0c55
commit 56c35ad1c6
157 changed files with 2138 additions and 8 deletions

View File

@@ -19,6 +19,9 @@ namespace Hallucinate.UI
// Đảm bảo ban đầu ẩn hết
Hide();
// Tự động gán âm thanh phản hồi cho các UI elements
UIAudioHelper.BindFeedback(root);
}
public virtual void Show()

View File

@@ -10,6 +10,11 @@ namespace Hallucinate.UI
private Label _rank;
private ProgressBar _winRateBar;
private Label _winRateText;
private Button _logoutBtn;
// Future authentication schema placeholders
private string _googleIdPlaceholder = "";
private string _avatarUrlPlaceholder = "";
public override void Initialize(VisualElement uxmlRoot, UIManager manager)
{
@@ -19,19 +24,60 @@ namespace Hallucinate.UI
_rank = root.Q<Label>("Rank");
_winRateBar = root.Q<ProgressBar>("WinRateBar");
_winRateText = root.Q<Label>("WinRateText");
_logoutBtn = root.Q<Button>("LogoutBtn");
root.Q<Button>("BackBtn").clicked += async () => await uiManager.Pop();
if (_logoutBtn != null)
{
_logoutBtn.clicked += Logout;
}
LoadProfileData();
}
public override async Task PlayTransitionIn()
{
LoadProfileData(); // Refresh data every time we show the profile
await base.PlayTransitionIn();
}
private void LoadProfileData()
{
// Dummy data for now
_username.text = "GamerPro_2026";
// Load saved username or fallback
string savedName = PlayerPrefs.GetString("Username", "Unknown Player");
_username.text = savedName.ToUpper();
// Future schema mockup (Google Sign-In)
_googleIdPlaceholder = PlayerPrefs.GetString("GoogleID", "NOT_LINKED");
_avatarUrlPlaceholder = PlayerPrefs.GetString("AvatarURL", "");
// Mock progression data for now
_rank.text = "DIAMOND II";
_winRateBar.value = 72;
_winRateText.text = "72%";
}
private async void Logout()
{
// Clear local save data
PlayerPrefs.DeleteKey("Username");
PlayerPrefs.DeleteKey("GoogleID");
PlayerPrefs.DeleteKey("AvatarURL");
PlayerPrefs.Save();
Debug.Log("[Profile] User logged out.");
// Disconnect from network if currently running
var runner = Object.FindFirstObjectByType<Fusion.NetworkRunner>();
if (runner != null && runner.IsRunning)
{
await runner.Shutdown();
}
// Redirect to Login Screen
await uiManager.Push<LoginController>();
}
}
}

View File

@@ -0,0 +1,111 @@
using UnityEngine;
using UnityEngine.UIElements;
using Hallucinate.Audio;
using System.Collections.Generic;
namespace Hallucinate.UI
{
public static class UIAudioHelper
{
public static void BindFeedback(VisualElement root)
{
if (root == null) return;
// Bind Buttons (Click & Hover)
var buttons = root.Query<Button>().ToList();
foreach (var btn in buttons)
{
btn.RegisterCallback<PointerEnterEvent>(OnButtonHover);
btn.RegisterCallback<ClickEvent>(OnButtonClick);
}
// Bind Toggles
var toggles = root.Query<Toggle>().ToList();
foreach (var tgl in toggles)
{
tgl.RegisterValueChangedCallback(OnToggleChanged);
}
// Bind TextFields (Focus & Typing)
var textFields = root.Query<TextField>().ToList();
foreach (var tf in textFields)
{
tf.RegisterCallback<FocusEvent>(OnTextFieldFocus);
tf.RegisterCallback<KeyDownEvent>(OnTextFieldKeyDown, TrickleDown.TrickleDown);
}
}
private static void OnButtonHover(PointerEnterEvent evt)
{
var target = evt.target as VisualElement;
string sound = "menuclick"; // Default hover
string name = target.name.ToLower();
if (name.Contains("back")) sound = "menu-back-hover";
else if (name.Contains("play")) sound = "menu-play-hover";
else if (name.Contains("option") || name.Contains("setting")) sound = "menu-options-hover";
else if (name.Contains("exit") || name.Contains("quit")) sound = "menu-exit-hover";
AudioManager.PlayGlobal(sound, 0.5f, 1.05f);
}
private static void OnButtonClick(ClickEvent evt)
{
var target = evt.target as VisualElement;
string sound = "menuclick"; // Default click
string name = target.name.ToLower();
if (name.Contains("back")) sound = "menu-back-click";
else if (name.Contains("close")) sound = "click-close";
else if (name.Contains("confirm") || name.Contains("start") || name.Contains("create")) sound = "click-short-confirm";
else if (name.Contains("play")) sound = "menu-play-click";
else if (name.Contains("option") || name.Contains("setting")) sound = "menu-options-click";
else if (name.Contains("exit") || name.Contains("quit")) sound = "menu-exit-click";
else if (name.Contains("retry") || name.Contains("restart")) sound = "pause-retry-click";
float randomPitch = Random.Range(0.98f, 1.02f);
AudioManager.PlayGlobal(sound, 1f, randomPitch);
}
private static void OnToggleChanged(ChangeEvent<bool> evt)
{
string sound = evt.newValue ? "check-on" : "check-off";
AudioManager.PlayGlobal(sound, 0.8f);
}
private static void OnTextFieldFocus(FocusEvent evt)
{
AudioManager.PlayGlobal("UI_Focus", 0.6f);
}
private static void OnTextFieldKeyDown(KeyDownEvent evt)
{
// Osu style typing feedback
switch (evt.keyCode)
{
case KeyCode.Return:
case KeyCode.KeypadEnter:
AudioManager.PlayGlobal("key-confirm", 0.8f);
break;
case KeyCode.Backspace:
case KeyCode.Delete:
AudioManager.PlayGlobal("key-delete", 0.7f);
break;
case KeyCode.Space:
case KeyCode.CapsLock:
AudioManager.PlayGlobal("key-caps", 0.7f);
break;
case KeyCode.UpArrow:
case KeyCode.DownArrow:
case KeyCode.LeftArrow:
case KeyCode.RightArrow:
AudioManager.PlayGlobal("key-movement", 0.6f);
break;
default:
// Play random variation for normal keys (key-press-1 to 4)
AudioManager.PlayRandomGlobal("key-press", 4, 0.5f, Random.Range(0.95f, 1.1f));
break;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 28373d86c046d8248b3788daaa019217