Expression Trees: Xây dựng logic động trong Unity

Tags:
Architecture
Algorithm
Optimization
C#

C# Code

// Expression Trees cho phép bạn phân tích, sửa đổi và thực thi code một cách linh hoạt.
// Trong Unity, nó ít được dùng trong gameplay hàng ngày nhưng lại cực kỳ mạnh mẽ cho các hệ thống nền.

using System;
using System.Linq.Expressions;
using UnityEngine;

public class ExpressionTreeExample : MonoBehaviour
{
    void Start()
    {
        // Mục tiêu: Xây dựng một biểu thức tương đương với: (num > 5) && (num < 10)

        // 1. Tạo tham số đầu vào cho biểu thức (giống như 'num => ...')
        ParameterExpression numParam = Expression.Parameter(typeof(int), "num");

        // 2. Tạo các hằng số để so sánh
        ConstantExpression five = Expression.Constant(5, typeof(int));
        ConstantExpression ten = Expression.Constant(10, typeof(int));

        // 3. Tạo các biểu thức so sánh
        // num > 5
        BinaryExpression greaterThanFive = Expression.GreaterThan(numParam, five);
        // num < 10
        BinaryExpression lessThanTen = Expression.LessThan(numParam, ten);

        // 4. Kết hợp chúng lại bằng toán tử 'AND' (&&)
        BinaryExpression andExpression = Expression.AndAlso(greaterThanFive, lessThanTen);

        // 5. Tạo Lambda Expression từ biểu thức đã xây dựng
        // Đây là một object đại diện cho code, chưa phải là code có thể thực thi
        Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(
            andExpression,
            new ParameterExpression[] { numParam }
        );

        Debug.Log("Cấu trúc biểu thức: " + lambda.ToString());

        // 6. Biên dịch (Compile) biểu thức thành một delegate có thể thực thi
        Func<int, bool> compiledLambda = lambda.Compile();

        // 7. Thực thi với các giá trị khác nhau
        bool resultFor7 = compiledLambda(7);   // True
        bool resultFor3 = compiledLambda(3);   // False
        bool resultFor12 = compiledLambda(12); // False

        Debug.Log("Kết quả với số 7: " + resultFor7);
        Debug.Log("Kết quả với số 3: " + resultFor3);
    }
}

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.

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

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

Hiểu cách C# và Unity quản lý hai vùng nhớ Stack và Heap là chìa khóa để tối ưu hiệu năng. Việc sử dụng sai `class` (Heap) thay vì `struct` (Stack) cho các dữ liệu nhỏ có thể tạo ra hàng ngàn 'rác' (garbage), khiến Garbage Collector (GC) phải hoạt động và gây giật, lag game.

Optimization
Performance
C#
Architecture

Boxing là quá trình chuyển một Value Type (như int, float) lên Heap bằng cách 'gói' nó trong một object. Unboxing là quá trình ngược lại. Trong Unity, việc này xảy ra âm thầm và thường là nguyên nhân gây ra các vấn đề về Garbage Collection và sụt giảm FPS mà không ai ngờ tới.

Optimization
Performance
C#

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

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

Architecture
Design Pattern
Event
Optimization

Giới thiệu triết lý Thiết kế Hướng Dữ liệu (Data-Oriented Design) và cách nó được hiện thực hóa qua kiến trúc ECS (Entity Component System) trong DOTS của Unity để đạt được hiệu năng xử lý dữ liệu vượt trội.

Architecture
Optimization
Performance
DOTS
ECS

Sử dụng ScriptableObject để tạo các asset dữ liệu có thể tái sử dụng, giúp quản lý cấu hình cho vật phẩm, kẻ địch hoặc các cài đặt game một cách linh hoạt và độc lập với scene.

Data Persistence
Architecture
ScriptableObject
Optimization

Ví dụ về cách dùng UniTask để viết code bất đồng bộ một cách gọn gàng và hiệu quả hơn Coroutine, với hỗ trợ async/await đầy đủ và không cần MonoBehaviour.

Optimization
Architecture
UniTask
Coroutine