Expression Trees: Xây dựng logic động trong Unity
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.