Compare commits
2 Commits
948a338191
...
7e45faec11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e45faec11 | ||
|
|
763f933c2e |
@@ -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.");
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user