Files
BABA_YAGA/Assets/Scripts/Cho mon AI/FinishGate.cs

139 lines
4.8 KiB
C#
Raw Normal View History

2026-06-02 23:14:19 +07:00
using UnityEngine;
using UnityEngine.SceneManagement;
2026-06-03 04:32:58 +07:00
using System.Collections;
2026-06-06 00:00:27 +07:00
using Hallucinate.Audio; // Import namespace hệ thống âm thanh của bạn
2026-06-02 23:14:19 +07:00
public class FinishGate : MonoBehaviour
{
2026-06-03 04:32:58 +07:00
[Header("Cài đặt UI Chính")]
2026-06-04 17:49:04 +07:00
public GameObject winPanel;
2026-06-06 00:00:27 +07:00
public GameObject warningUI; // THÔNG BÁO: "Bạn chưa nhặt rương nào!"
2026-06-03 04:32:58 +07:00
2026-06-06 00:00:27 +07:00
[Header("Cài đặt Sao trên HUD (Giao diện chính lúc đang chạy)")]
2026-06-04 17:49:04 +07:00
public GameObject hudStar1;
public GameObject hudStar2;
public GameObject hudStar3;
2026-06-06 00:00:27 +07:00
[Header("Cài đặt Sao trên Bảng Win (Kết thúc game)")]
2026-06-04 17:49:04 +07:00
public GameObject winStar1;
public GameObject winStar2;
public GameObject winStar3;
2026-06-02 23:14:19 +07:00
2026-06-04 23:01:39 +07:00
[Header("Cài đặt Âm thanh")]
public string winSound = "UI_Win";
public string warningSound = "UI_Warning";
public string clickSound = "UI_Click";
2026-06-06 00:00:27 +07:00
[Header("Cấu hình Tag Hệ thống")]
[Tooltip("Tag của Người chơi/NPC dùng để kích hoạt Gate")]
public string playerTag = "Player";
2026-06-02 23:14:19 +07:00
private void Start()
{
2026-06-06 00:00:27 +07:00
// Đảm bảo thời gian chạy bình thường khi load màn
2026-06-03 04:32:58 +07:00
Time.timeScale = 1f;
2026-06-06 00:00:27 +07:00
// Ẩn các bảng UI khi vừa vào game
2026-06-03 04:32:58 +07:00
if (winPanel != null) winPanel.SetActive(false);
if (warningUI != null) warningUI.SetActive(false);
2026-06-06 00:00:27 +07:00
// Reset trạng thái sao về 0 lúc bắt đầu
2026-06-04 17:49:04 +07:00
UpdateStarsUI(0);
UpdateWinStarsUI(0);
2026-06-02 23:14:19 +07:00
}
2026-06-03 04:32:58 +07:00
2026-06-02 23:14:19 +07:00
private void OnTriggerEnter(Collider other)
{
2026-06-06 00:00:27 +07:00
// KIỂM TRA 1: Phải đúng Tag quy định (Nên để là "Player")
if (other.CompareTag(playerTag))
2026-06-02 23:14:19 +07:00
{
2026-06-06 00:00:27 +07:00
// KIỂM TRA 2: Tìm linh hoạt component PlayerInventory ở cả con và cha
2026-06-04 17:49:04 +07:00
PlayerInventory player = other.GetComponentInChildren<PlayerInventory>();
if (player == null) player = other.GetComponentInParent<PlayerInventory>();
if (player != null)
2026-06-03 04:32:58 +07:00
{
2026-06-06 00:00:27 +07:00
// TRƯỜNG HỢP 1: Đã đi đến cuối bản đồ nhặt được ít nhất 1 cổ vật -> CHIẾN THẮNG
2026-06-04 17:49:04 +07:00
if (player.treasuresCollected > 0)
{
2026-06-06 00:00:27 +07:00
Debug.Log($"<color=green>[Gate]</color> VỀ ĐÍCH HỢP LỆ! Hoàn thành với {player.treasuresCollected} cổ vật.");
2026-06-04 17:49:04 +07:00
WinGame(player.treasuresCollected);
}
2026-06-06 00:00:27 +07:00
// TRƯỜNG HỢP 2: Đi qua cổng lúc bắt đầu game (chưa nhặt được gì) -> HIỆN CẢNH BÁO
2026-06-04 17:49:04 +07:00
else
{
2026-06-06 00:00:27 +07:00
Debug.Log("<color=yellow>[Gate]</color> NPC/Player chưa nhặt cổ vật! Hãy chạy đến cuối map.");
2026-06-04 17:49:04 +07:00
StopAllCoroutines();
StartCoroutine(ShowTempUI(warningUI));
}
2026-06-03 04:32:58 +07:00
}
2026-06-02 23:14:19 +07:00
}
}
2026-06-06 00:00:27 +07:00
// Hàm public được gọi từ TreasureItem để cập nhật HUD ngay lập tức khi vừa nhặt đồ
2026-06-04 17:49:04 +07:00
public void UpdateStarsUI(int count)
{
2026-06-06 00:00:27 +07:00
if (hudStar1 != null) hudStar1.SetActive(count >= 1);
if (hudStar2 != null) hudStar2.SetActive(count >= 2);
if (hudStar3 != null) hudStar3.SetActive(count >= 3);
2026-06-04 17:49:04 +07:00
}
2026-06-06 00:00:27 +07:00
// Hàm nội bộ cập nhật số sao trên bảng kết quả tổng kết
private void UpdateWinStarsUI(int count)
2026-06-03 04:32:58 +07:00
{
2026-06-06 00:00:27 +07:00
if (winStar1 != null) winStar1.SetActive(count >= 1);
if (winStar2 != null) winStar2.SetActive(count >= 2);
if (winStar3 != null) winStar3.SetActive(count >= 3);
2026-06-03 04:32:58 +07:00
}
2026-06-06 00:00:27 +07:00
private void WinGame(int count)
2026-06-02 23:14:19 +07:00
{
2026-06-04 17:49:04 +07:00
if (winPanel != null)
{
winPanel.SetActive(true);
2026-06-06 00:00:27 +07:00
UpdateWinStarsUI(count);
2026-06-04 17:49:04 +07:00
}
2026-06-04 23:01:39 +07:00
2026-06-06 00:00:27 +07:00
// Phát âm thanh thắng cuộc toàn cục
AudioManager.PlayGlobal(winSound);
2026-06-02 23:14:19 +07:00
2026-06-06 00:00:27 +07:00
// Dừng thời gian game và mở khóa chuột
2026-06-02 23:14:19 +07:00
Time.timeScale = 0f;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
2026-06-06 00:00:27 +07:00
private IEnumerator ShowTempUI(GameObject ui)
2026-06-04 17:49:04 +07:00
{
if (ui == null) yield break;
2026-06-06 00:00:27 +07:00
2026-06-04 17:49:04 +07:00
ui.SetActive(true);
2026-06-04 23:01:39 +07:00
2026-06-06 00:00:27 +07:00
// Chỉ phát âm thanh cảnh báo nếu đây là UI cảnh báo thiếu đồ
if (ui == warningUI)
{
AudioManager.PlayGlobal(warningSound);
}
2026-06-04 23:01:39 +07:00
2026-06-04 17:49:04 +07:00
yield return new WaitForSeconds(3f);
ui.SetActive(false);
}
2026-06-06 00:00:27 +07:00
// --- CÁC HÀM ĐIỀU HƯỚNG UI BUTTONS ---
2026-06-02 23:14:19 +07:00
public void RestartGame()
{
2026-06-06 00:00:27 +07:00
AudioManager.PlayGlobal(clickSound);
2026-06-02 23:14:19 +07:00
Time.timeScale = 1f;
2026-06-03 04:32:58 +07:00
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
2026-06-02 23:14:19 +07:00
}
public void QuitGame()
{
2026-06-06 00:00:27 +07:00
AudioManager.PlayGlobal(clickSound);
2026-06-03 04:32:58 +07:00
Application.Quit();
2026-06-06 00:00:27 +07:00
2026-06-02 23:14:19 +07:00
#if UNITY_EDITOR
2026-06-03 04:32:58 +07:00
UnityEditor.EditorApplication.isPlaying = false;
2026-06-02 23:14:19 +07:00
#endif
}
2026-06-06 00:00:27 +07:00
}