Kiến trúc: Mẫu Observer (Sự kiện & Delegate)

Tags:
Architecture
Design Pattern
Event
Optimization

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ì.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Giới thiệu về mẫu thiết kế Dependency Injection (DI) và tại sao nó giúp code của bạn dễ bảo trì, dễ test và giảm sự phụ thuộc cứng (hard dependencies).

Architecture
Design Pattern
Optimization

Hướng dẫn cài đặt và sử dụng Zenject, một framework Dependency Injection phổ biến cho Unity, để quản lý các phụ thuộc trong dự án một cách hiệu quả.

Architecture
Design Pattern
DI
Zenject
Optimization

Giới thiệu về Clean Architecture, một triết lý thiết kế phần mềm giúp tách biệt các mối quan tâm thành các lớp riêng biệt (Entities, Use Cases, Adapters, Frameworks), tạo ra một hệ thống độc lập, dễ kiểm thử và bảo trì.

Architecture
Design Pattern
DI
Optimization

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization

Một hệ thống Object Pool đơn giản để tái sử dụng các đối tượng thay vì tạo và hủy liên tục, giúp tối ưu hiệu năng đáng kể, đặc biệt khi cần tạo nhiều đối tượng như đạn, kẻ địch.

Design Pattern
Object Pool
Optimization
Performance

Một mẫu Singleton cơ bản trong Unity để đảm bảo chỉ có một thực thể của một lớp tồn tại trong game. Hữu ích cho các hệ thống toàn cục như GameManager, AudioManager.

Design Pattern
Singleton
Architecture

Expression Trees là một tính năng C# nâng cao cho phép bạn biểu diễn code dưới dạng cây dữ liệu. Trong Unity, nó mở ra khả năng xây dựng các hệ thống phức tạp như trình tạo truy vấn động, hệ thống AI có thể sửa đổi hành vi tại runtime, hoặc các công cụ editor tùy chỉnh mà không cần sinh mã code mới.

Architecture
Algorithm
Optimization
C#

Một cấu trúc Finite State Machine (FSM) đơn giản sử dụng enum và switch-case để quản lý các trạng thái khác nhau của AI, như đi tuần, truy đuổi và tấn công.

AI
Architecture
Design Pattern
Gameplay

Áp dụng mẫu MVP để tách biệt logic game (Model), UI (View), và phần điều khiển trung gian (Presenter). Giúp code dễ dàng unit test và quản lý các luồng dữ liệu phức tạp trong UI.

Architecture
Design Pattern
UI
MVP

Triển khai mẫu Service Locator, một cách đơn giản để các phần khác nhau của game có thể truy cập vào các hệ thống toàn cục (services) như AudioManager, GameManager mà không cần tham chiếu trực tiếp.

Architecture
Design Pattern
Singleton
DI