Hitbox và Hurtbox trong Unity3D (Phần 2)

Phần 1 mình đã giới thiệu khái quát về hitbox và hurtbox và cơ chế để dùng chúng trong Unity, các bạn có thể theo dõi tại đây.

Bài viết này sẽ hướng dẫn chi tiết hơn cách tạo và sử dụng hitbox và hurtbox.

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

Hitbox và Hurtbox trong Unity3D (Phần 2)
Player
Hitbox và Hurtbox trong Unity3D (Phần 2)
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:

Hitbox và Hurtbox trong Unity3D (Phần 2)

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.

Hitbox và Hurtbox trong Unity3D (Phần 2)
Hurtbox

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.

Hitbox và Hurtbox trong Unity3D (Phần 2)
Hitbox object của Player
Hitbox và Hurtbox trong Unity3D (Phần 2)
Object chưa thông tin hitbox

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

Hitbox và Hurtbox trong Unity3D (Phần 2)
Hitbox một cú đấm

Scripts

Cuối cùng là scripts, tuy là phần cốt lõi nhưng để code hitbox thì cũng không quá khó khăn vì API của Unity đã hỗ trợ gần hế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);
                    }
                }
            }
        }

    }

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

Hãy để Gini Webseo tư vấn cho bạn