Kiến trúc: Mẫu Observer (Sự kiện & Delegate)
C# Code
using UnityEngine;
using System;
using UnityEngine.Events;
// ----- Publisher: Đối tượng phát ra sự kiện -----
public class PlayerHealth : MonoBehaviour
{
// Cách 1: Dùng C# Action (nhanh, linh hoạt, nhưng không thấy trong Inspector)
public static event Action<int> OnPlayerDamaged;
// Cách 2: Dùng UnityEvent (chậm hơn, nhưng có thể gán listener trong Inspector)
public UnityEvent<int> OnHealthChanged_UnityEvent;
public void TakeDamage(int damage)
{
// ... logic trừ máu
// Phát sự kiện đi, kèm theo lượng sát thương
OnPlayerDamaged?.Invoke(damage);
OnHealthChanged_UnityEvent?.Invoke(damage);
}
}
// ----- Subscriber: Các đối tượng lắng nghe sự kiện -----
// Ví dụ 1: UI lắng nghe sự kiện để cập nhật thanh máu
public class HealthUI : MonoBehaviour
{
void OnEnable()
{
// Đăng ký lắng nghe sự kiện từ Action
PlayerHealth.OnPlayerDamaged += UpdateHealthBar;
}
void OnDisable()
{
// Hủy đăng ký khi không cần nữa để tránh memory leak
PlayerHealth.OnPlayerDamaged -= UpdateHealthBar;
}
void UpdateHealthBar(int damageAmount)
{
Debug.Log("UI: Player mất " + damageAmount + " máu, cập nhật thanh máu!");
// Logic cập nhật Slider, Text...
}
}
// Ví dụ 2: AudioManager lắng nghe để phát âm thanh
public class PlayerAudioManager : MonoBehaviour
{
// Trong Inspector, kéo hàm PlayHurtSound vào sự kiện OnHealthChanged_UnityEvent của PlayerHealth
public void PlayHurtSound(int damageAmount)
{
Debug.Log("Audio: Player bị thương, phát âm thanh 'ouch'!");
// Logic phát âm thanh...
}
}Sử dụng mẫu Observer với C# events, Actions và UnityEvents để tạo ra các hệ thống giao tiếp với nhau mà không cần biết về sự tồn tại của nhau (decoupling), giúp code linh hoạt và dễ bảo trì.