Hướng dẫn chi tiết cho lập trình viên game Hitbox và Hurtbox trong Unity3D
Nếu bạn đang phát triển một trò chơi hành động hoặc đối kháng trong Unity3D, chắc chắn bạn sẽ gặp câu hỏi: Làm thế nào để kiểm soát va chạm và sát thương chính xác? Đây là lúc hai khái niệm Hitbox và Hurtbox phát huy vai trò quan trọng. Trong bài viết này, Gini Webseo sẽ giúp bạn hiểu rõ hitbox, hurtbox là gì, cách thiết lập trong Unity, cũng như những mẹo tối ưu để đảm bảo hệ thống va chạm hoạt động mượt mà và chính xác.
Hitbox và Hurtbox là gì?
Để giải quyết triệt để những vấn đề trên, chúng ta cần nắm được những khái niệm cơ bản về hitbox, hurt box và Layer Collision Matrix trong Unity.
Hitbox là gì?
Hitbox là một vùng ảo trong game, có thể là hình hộp, hình cầu hoặc hình trụ, được dùng để xác định phạm vi tác động của đòn đánh. Khi nhân vật thực hiện một đòn tấn công, Unity sẽ kiểm tra xem có đối tượng nào nằm trong hitbox để gây sát thương hay không.
Hurtbox là gì?
Ngược lại, Hurtbox là vùng nhận sát thương. Nó được gắn trên các nhân vật hoặc vật thể để xác định xem khi nào chúng bị trúng đòn. Một hurtbox có thể lớn hơn, nhỏ hơn hoặc có hình dạng khác so với hitbox, tùy vào mục đích thiết kế của trò chơi.
Để cho các bạn dễ hình dung trực quan hơn thì hãy tham khảo video dưới đây:
Trong Unity
Khái niệm thì chỉ có như thế thôi, vậy trong Unity chúng ta sẽ làm gì để tạo được Hitbox và Hurtbox. Unity có cung cấp cho chúng ta một API gọi là PhysicOverlap, nếu bạn muốn hiểu kĩ hơn về API này có thể tham khảo tại đây.
Setup Layer, Object tag và Box Collider
Điều đầu tiên cần lưu ý khi các bạn sử dụng đến vật lý và va chạm trong Unity đó là layer. Khi bạn muốn phân loại các object nào va chạm với nhau và object nào không, thì đó là lúc sử dụng Layer Matrix.
Đầu tiên mình sẽ tạo 2 object tương ứng với Player và Enemy. Hai object này đều mang layer là hurtbox. Tag của object Player là “Player”, còn của object Enemy là “Enemy”.
Tiếp theo là vào Edit -> Project Settings -> Physics 2D (Ở đây mình hướng dẫn trường hợp game 2D). Và setup như sau:
Trong trường hợp này, mình không muốn bất kỳ layer nào tương tác với layer “Hurtbox” nên mình sẽ bỏ hết tick đi.
Các bạn cần lưu ý là nếu project của các bạn sử dụng đến vật lý và va chạm của các collider thì nên bỏ tick hết các layer tương tác mặc định chỉ giữ lại layer nào bạn muốn chúng tương tác với nhau.
Vậy là xong phần Layer và Tag, tiếp theo chúng ta sẽ add BoxCollider2D vào 2 object vừa tạo. Kích thước của collider chính là kích thước của các unit trong game hay chính xác hơn là khoảng có thể đánh trúng trên mỗi unit.
Cuối cùng là tạo hitbox, thực chất khi một đòn đánh được thực hiện chúng ta sẽ gọi API Physic Overlap để vẽ ra một “cái hộp”. Để vẽ được một hitbox sẽ cần đến vị trí, kích thước, góc quay và layer tương tác. Những thông số đó đều có thể lấy từ Collider, vậy để trực quan hơn khi xử lý hitbox, chúng ta sẽ tạo child object cho cả player và enemy rồi gán Collider vào đó sau đó ẩn nó đi.
Lưu ý: Khi bạn điều chỉnh kích thước của Box Collider hãy luôn chắc răng Offset của nó là (0,0) .
Viết Script để kiểm tra va chạm
Khi thiết lập xong hitbox và hurtbox, bước tiếp theo là xử lý logic kiểm tra va chạm. Unity cung cấp API Physics2D.OverlapBoxNonAlloc
để quét các đối tượng nằm trong vùng hitbox mà không gây ảnh hưởng đến hiệu suất.
Chúng ta sẽ tạo một class MonoBehaviour là Unit như sau:
public class BaseUnit : MonoBehaviour
{
public BoxCollider2D hitbox;
public LayerMask layerHurtbox;
public string tagEnemy;
public void TakeDamage(float damage)
{
Debug.Log("unit take " + damage + "damage");
}
private void ActiveHitbox()
{
BoxCollider2D[] hurtboxes = new BoxCollider2D[20];
int hurtboxesCount = Physics2D.OverlapBoxNonAlloc(hitbox.transform.position, hitbox.size, hitbox.transform.eulerAngles.z, hurtboxes, layerHurtbox);
if (hurtboxesCount > 0)
{
for (int i = 0; i < hurtboxesCount; i++)
{
if (hurtboxes[i].transform.root.CompareTag(tagEnemy))
{
BaseUnit unit = hurtboxes[i].GetComponent<BaseUnit>();
unit.TakeDamage(5f);
}
}
}
}
}
Áp dụng đúng các phương pháp trên, bạn sẽ có một hệ thống va chạm mượt mà, chính xác, đảm bảo trải nghiệm chơi game tốt nhất. Bạn đang gặp vấn đề gì khi triển khai hitbox và hurtbox trong game của mình? Hãy để liên hệ ngay với Gini Webseo để được hỗ trợ bạn nhé!