Bài viết hôm nay mình nói về chủ đề về Co-reaction có thể nghe thì hơi lạ lẫm nhưng nó là 1 biến thể của state machine
- Vậy state machine là gì?.
- Theo như wiki thì state machine là một máy trừu tượng luôn có trạng thái nằm trong tổng hữu hạn các trạng thái tại bất kỳ thời điểm nào. Máy trạng thái hữu hạn có thể chuyển từ trạng thái này sang trạng thái khác để phù hợp với đầu vào; sự thay đổi này được gọi là quá trình chuyển đổi. Máy trạng thái hữu hạn được xác định bởi danh sách các trạng thái của nó, trạng thái khởi đầu, và các điều kiện cho từng sự chuyển đổi trạng thái.
- Lấy ví dụ trong game thì việc kết hợp các Animation với nhau cũng có thể coi là 1 hệ thống state machine ở trạng thái bất kì nào đó khi thỏa mãn điều kiện thì sẽ được chuyển sang trạng thái khác.
- Mô tả rõ hơn thì mình sẽ lấy ví dụ cho việc Input và chuyển động của nhân vật, nhân vật sẽ gốm 3 trạng thái là Idle, Walk, Jump và các giá trị input của user là horizontal, vertical, jump. Mình sẽ giả sử các trường hợp
- Khi không có input tức là horizontal = 0 và vertical = 0 thì và jump = false ==> trạng thái Idle.
- Khi input có horizontal hoặc vertical khác 0 và jump = true ==> Walk
- Còn khi jump thì sẽ ghi đè lên horizontal & vertical ==> jump.
- Vậy statemachine chính là việc phân luồng cho các trường hợp giá trị input khác nhau và đưa ra output phù hợp.
- Nhìn thì cũng đơn giản dễ hiểu đó, nhưng nếu áp dụng vào hệ thống lớn, có nhiều trạng thái thì nó sẽ kiểu như này này, chắc không ai muốn thiết kế 1 hệ thống như vậy
- Các nhân mình cũng đã sử dụng statemachine rồi và mình có đánh giá là statemachine là đơn luồng (chỉ có 1 trạng thái hoạt động ở 1 thời điểm)
- Khó maintain : khi mà thêm vào 1 option nữa thì mình phải tạo lại các node liên quan của nó nên việc chỉnh sửa khá là mất công sức.
- Giải pháp thay thế: Tạm thời gọi nó là co-reaction (theo tên mà tác giả đặt)
- Statemachine là việc hệ thống đưa ra các output phù hợp với các input được định nghĩa trước đó. Vậy thì ta sẽ tách nó ra các thành phần theo chức năng
- Param: Nó là một cái biến bình nguyên thủy có nhận giá trị để kiểm tra
- Condition: là các câu lệnh kiểm tra giá trị của Parameter có đúng theo yêu cầu được quy định hay không. Mỗi reaction có thể cần nhiều condition, và reaction chỉ active khi TẤT CẢ condition đều thõa mãn
- Action: Khi thõa mãn các condition, nó sẽ thực hiện action
- Co-reaction hỗ trợ đa luồng ( chỉ cần thỏa mãn condition là action được thực hiện, có khi nhiều action được thực hiện cùng lúc
- Dễ mở rộng: việc thêm 1 reaction hoặc hơn nữa là thêm 1 parameter dễ dàng hơn việc thêm 1 state vào mớ hỗn độn ( nhiều state ). nó cũng khá trực quan cho việc viết code cũng như hỗ trợ design hoặc viết tool độc lập
- Nhược điểm : là code sẽ phải viết nhiều hơn =)))
Link demo : https://github.com/ThinhHB/UnityDemoCoReaction
Nhấn để đánh giá bài viết!
[Số đánh giá: 0 Trung bình: 0]