Compare commits

2 Commits

Author SHA1 Message Date
manhduyhoang90
7e45faec11 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:02:35 +07:00
manhduyhoang90
763f933c2e update UI 2026-06-06 00:00:27 +07:00
4 changed files with 132 additions and 211 deletions

View File

@@ -45,7 +45,18 @@ public class LaserProjectile : MonoBehaviour
return; return;
} }
// KIỂM TRA LAYER "GROUND"
if (other.gameObject.layer == LayerMask.NameToLayer("Ground"))
{
Debug.Log("<color=yellow>Laser hit GROUND layer.</color>");
Impact();
return;
}
// Phá hủy đạn nếu trúng tường, sàn nhà (mọi thứ không phải trigger khác)
// 2. Phá hủy đạn nếu trúng Ground, Tường, hoặc bất kỳ vật thể đặc nào (không phải Trigger) // 2. Phá hủy đạn nếu trúng Ground, Tường, hoặc bất kỳ vật thể đặc nào (không phải Trigger)
if (!other.isTrigger) if (!other.isTrigger)
{ {
Debug.Log($"Laser hit solid object: {other.name} (Ground/Obstacle). Destroying."); Debug.Log($"Laser hit solid object: {other.name} (Ground/Obstacle). Destroying.");

View File

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

View File

@@ -1,69 +1,117 @@
using UnityEngine; using UnityEngine;
using System.Collections; using System.Collections;
using Hallucinate.Audio; using Hallucinate.Audio;
public class TreasureItem : MonoBehaviour public class TreasureItem : MonoBehaviour
{ {
[Header("Cài đặt UI thông báo")] [Header("Cài đặt UI thông báo")]
public GameObject notificationText; // Text "Đã nhặt Cổ vật" public GameObject notificationText; // Kéo Text "Đã nhặt Cổ vật" vào đây
[Header("Cài đặt Âm thanh")] [Header("Cài đặt Âm thanh")]
public string pickupSound = "Item_Pickup"; public string pickupSound = "Item_Pickup";
[Header("Cấu hình Tag")]
public string playerTag = "Player";
// Biến cờ để tránh việc va chạm 2 lần trong cùng 1 frame
private bool isCollected = false;
private void Start()
{
// Đảm bảo UI thông báo luôn tắt khi bắt đầu game
if (notificationText != null)
{
notificationText.SetActive(false);
}
}
private void OnTriggerEnter(Collider other) private void OnTriggerEnter(Collider other)
{ {
if (other.CompareTag("Player")) // 1. Chỉ xử lý khi chạm đúng Player và rương chưa bị nhặt
if (!isCollected && other.CompareTag(playerTag))
{ {
PlayerInventory player = other.GetComponentInChildren<PlayerInventory>(); PlayerInventory player = other.GetComponentInChildren<PlayerInventory>();
if (player == null) player = other.GetComponentInParent<PlayerInventory>(); if (player == null) player = other.GetComponentInParent<PlayerInventory>();
if (player != null) if (player != null)
{ {
// 1. Tăng số lượng rương đang giữ // Khóa lại để không bị kích hoạt nhiều lần
isCollected = true;
// 2. Tăng số lượng rương đang giữ
player.treasuresCollected++; player.treasuresCollected++;
Debug.Log($"<color=cyan>[Chest]</color> NHẶT THÀNH CÔNG! Số rương hiện tại: {player.treasuresCollected}"); Debug.Log($"<color=cyan>[Chest]</color> NHẶT THÀNH CÔNG! Số rương hiện tại: {player.treasuresCollected}");
// 2. Cập nhật sao trên HUD ngay lập tức (Tìm FinishGate để mượn hàm update) // 3. Cập nhật sao trên HUD (Sử dụng hàm Unity 6: FindAnyObjectByType)
FinishGate gate = Object.FindAnyObjectByType<FinishGate>(); FinishGate gate = Object.FindAnyObjectByType<FinishGate>();
if (gate != null) if (gate != null)
{ {
gate.UpdateStarsUI(player.treasuresCollected); gate.UpdateStarsUI(player.treasuresCollected);
} }
// 3. Kích hoạt trạng thái truy đuổi cho toàn bộ Enemy AI // 4. Kích hoạt trạng thái truy đuổi cho toàn bộ Enemy AI
SetEnemiesAlertState(true); SetEnemiesAlertState(true);
// 4. Chạy âm thanh nhặt đồ // 5. Chạy âm thanh nhặt đồ
if (AudioManager.Instance != null) if (AudioManager.Instance != null)
{ {
AudioManager.Instance.Play(pickupSound, position: transform.position); AudioManager.Instance.Play(pickupSound, position: transform.position);
} }
if (notificationText != null) // 6. Xử lý hiện UI và làm biến mất rương an toàn
{ StartCoroutine(HandlePickupRoutine());
StopAllCoroutines();
StartCoroutine(ShowNotification());
}
// Biến mất rương
gameObject.SetActive(false);
} }
} }
} }
private void SetEnemiesAlertState(bool state) private void SetEnemiesAlertState(bool state)
{ {
// Sử dụng hàm chuẩn Unity 6+
EnemyAI[] allEnemies = Object.FindObjectsByType<EnemyAI>(FindObjectsSortMode.None); EnemyAI[] allEnemies = Object.FindObjectsByType<EnemyAI>(FindObjectsSortMode.None);
foreach (EnemyAI enemy in allEnemies) foreach (EnemyAI enemy in allEnemies)
{ {
enemy.playerHasArtifact = state; if (enemy != null)
{
enemy.playerHasArtifact = state;
}
} }
} }
IEnumerator ShowNotification() private IEnumerator HandlePickupRoutine()
{ {
notificationText.SetActive(true); // Ẩn rương đi trước (tắt hiển thị và va chạm)
HideTreasureModel();
// Bật UI thông báo "Đã nhặt Cổ vật"
if (notificationText != null)
{
notificationText.SetActive(true);
}
// Chờ 2 giây
yield return new WaitForSeconds(2f); yield return new WaitForSeconds(2f);
notificationText.SetActive(false);
// Tắt UI thông báo
if (notificationText != null)
{
notificationText.SetActive(false);
}
// Khi UI đã xử lý xong, mới chính thức tắt hoàn toàn GameObject rương
gameObject.SetActive(false);
} }
}
private void HideTreasureModel()
{
// Tắt va chạm chính của rương
Collider col = GetComponent<Collider>();
if (col != null) col.enabled = false;
// Tắt model hiển thị 3D của rương (bao gồm cả object cha và con)
MeshRenderer[] renderers = GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer r in renderers)
{
r.enabled = false;
}
}
}