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”.
Player
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.
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 object của Player
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 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);
}
}
}
}
}
Khi bạn đăng nhập lần đầu tiên bằng nút Đăng nhập Xã hội, chúng tôi thu thập thông tin hồ sơ công khai tài khoản của bạn được chia sẻ bởi nhà cung cấp Đăng nhập Xã hội, dựa trên cài đặt quyền riêng tư của bạn. Chúng tôi cũng nhận được địa chỉ email của bạn để tự động tạo tài khoản cho bạn trong trang web của chúng tôi. Khi tài khoản của bạn được tạo, bạn sẽ đăng nhập vào tài khoản này.
Không đồng ýĐồng ý
Kết nối với
Tôi cho phép tạo tài khoản
Khi bạn đăng nhập lần đầu tiên bằng nút Đăng nhập Xã hội, chúng tôi thu thập thông tin hồ sơ công khai tài khoản của bạn được chia sẻ bởi nhà cung cấp Đăng nhập Xã hội, dựa trên cài đặt quyền riêng tư của bạn. Chúng tôi cũng nhận được địa chỉ email của bạn để tự động tạo tài khoản cho bạn trong trang web của chúng tôi. Khi tài khoản của bạn được tạo, bạn sẽ đăng nhập vào tài khoản này.
Không đồng ýĐồng ý
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận
Tôi đã may mắn vì tôi không bao giờ từ bỏ việc tìm kiếm. Rất vui nếu bạn tìm được thông tin từ Gini Webseo.