Actor component là gì ?

Actor component có thể hiểu đơn giản là một thành phần có thể tái sử dụng ở nhiều actor khác nhau, cùng thực thi một hay nhiều hành động và lưu trữ các biến giống nhau. Có thể hiểu actor component như là 1 linh kiện của một bộ máy, chúng đều có 1 đặc tính cụ thể, thực hiện một số hành động nhất định và có thể gắn ở những bộ máy khác nhau.

Lợi ích của Actor component

  • Có thể tái sự dụng một hay nhiều biến và logic, luồng xử lí giống nhau ở các actor khác nhau mà không cần dựng lại
  • Giảm bớt sự rối rắm của dây dợ blueprint ở actor chính
  • Tiện lợi hơn trong thay đổi logic, thay đổi một chỗ và sẽ được áp lên tất cả actor đang sử dụng

Cách tạo Actor component

Để tạo một actor component, các bạn chuột phải vào content browser, Blueprint Class -> Actor Component

Ảnh 1. Tạo class thừa kế actor component

Trong ví dụ ở bài viết này, mình sẽ tạo một Actor component tên là BP_HealthComponent để quản lí máu và damage.

Ảnh 2. Giao diện của Actor component editor

Có thể thấy rằng Actor component khá giống Actor, đều có sự kiện BeginPlay và Tick.

Chúng ta hãy bắt đầu tạo một biến lưu máu người chơi (CurrentHealth), một biến máu tối đa (MaxHealth) và một sự kiện xử lí khi Actor bị gây damage (OnAnyDamage)

Ảnh 3. Tạo biến và gắn sự kiện

Nếu các bạn thắc mắc tại sao mình không gọi thẳng Event AnyDamage như dưới

Ảnh 4. Event AnyDamage ở Actor

thì lí do đơn giản là Actor component không phải là một thực thể hữu hình nên bản thân nó không thể nhận damage được, chỉ có người sở hữu nó (Actor) có thể.
Chính vì thế mà mình thực hiện thao tác gắn delegate nhận damage từ Actor để từ đó xử lí thông tin Damage mà Actor phát đi. Nếu bạn nào không biết delegate là gì, có thể check bài viết này https://jakesto.com/index.php/2020/04/23/delegate-va-cach-thuc-hoat-dong/

Tiếp theo đó, hãy xử lí luồng thông tin về damage được phát đi bởi Actor

Ảnh 5. Xử lí thông tin từ sự kiện nhận damage

Giải thích đơn giản là ta sẽ trừ máu đi với lượng damage nhận được, sau đó clamp giá trị trong khoảng từ 0 -> Max Health để đảm bảo máu không âm hay là máu vượt quá máu tối đa.

Còn bước cuối cùng của khâu setup, đó là ta phải set lượng máu người chơi lúc đầu bằng máu tối đa, nếu không khi bắt đầu chơi máu người chơi sẽ bằng 0 :v

Ảnh 6. Set máu ban đầu

Như vậy ta đã hoàn thành mọi khâu chuẩn bị, hãy cùng bước qua việc sử dụng Actor component!

Sử dụng Actor component

Để thêm BP_HealthComponent ta vừa tạo vào một actor bất kì, trong trường hợp này là BP_MyCharacter ta tạo từ trước, chỉ cần vào mục Add Component và kiếm BP_HealthComponent:

Ảnh 7. Thêm BP_HealthComponent vào BP_MyCharacter

Sau khi thêm vào, lúc này, bảng details sẽ hiện ra cho ta tùy chỉnh thông số ở BP_HealthComponent

Ảnh 8. Tùy chỉnh thông số BP_HealthComponent

Mình chỉ cần quan tâm tới MaxHealth tại giá trị CurrentHealth sẽ là giá trị sẽ bị thay đổi thường xuyên.
Như vậy, với mỗi Actor mới, thay vì phải dựng lại biến máu để xử lí, ta có thể tái sử dụng lại BP_HealthComponent để xử lí tác vụ liên quan tới máu cho Actor.

Để thử xem mọi thứ có thể hoạt động không, mình đặt một Pain Causing Volume vào level, chỉnh cho nó gây 10 damage một giây, sau đó in ra màn hình kết quả máu hiện tại của player khi bị dính damage:

Ảnh 9. Test BP_HealthComponent

Kết luận

Đó là tất cả những cơ bản về Actor component. Rõ ràng là nó sẽ rất tiện lợi và gọn gàng hơn nếu bạn biết cách gom logic và bỏ chúng vào các Actor component tương ứng 😀 Hẹn gặp lại các bạn ở bài viết sau.