Để xử lý va chạm giữa hai con dao trong game Knife Hit bằng C# trong Unity, bạn sẽ sử dụng hệ thống va chạm (Collision System) của Unity. Cụ thể, bạn cần kiểm tra xem con dao được ném có va chạm với một con dao khác đã găm trên mục tiêu hay không.
Cấu hình GameObject
Trước hết, bạn cần đảm bảo các đối tượng (GameObject) có cấu hình phù hợp:
* Con dao (Knife): GameObject này cần có một Rigidbody2D và một Collider2D (ví dụ: BoxCollider2D). Collider của con dao phải được đặt là Is Trigger để nó không bị vật lý tác động nhưng vẫn có thể phát hiện va chạm.
* Mục tiêu (Log): Tương tự, nó cũng cần một Collider2D.
* Các con dao đã găm trên mục tiêu (Stuck Knives): Các con dao này cũng cần có Collider2D, nhưng không nên có Rigidbody2D nếu chúng đã được "găm chặt" vào mục tiêu.
Script xử lý va chạm
Bạn sẽ viết một script C# (ví dụ: KnifeController.cs) và gắn nó vào Prefab của con dao. Trong script này, bạn sẽ sử dụng hàm OnTriggerEnter2D để phát hiện va chạm.
Dưới đây là một ví dụ script đơn giản:
using UnityEngine;
public class KnifeController : MonoBehaviour
{
private bool hasCollided = false;
void OnTriggerEnter2D(Collider2D other)
{
// Kiểm tra xem đã va chạm với con dao nào chưa để tránh xử lý nhiều lần
if (hasCollided)
return;
// Kiểm tra tag của đối tượng va chạm
if (other.CompareTag("Knife"))
{
// Xử lý va chạm với con dao khác
hasCollided = true;
// Kích hoạt hiệu ứng Game Over
Debug.Log("Game Over! Va chạm với con dao khác!");
// Gọi hàm hoặc sự kiện để kết thúc trò chơi
// Ví dụ: FindObjectOfType<GameManager>().GameOver();
}
else if (other.CompareTag("Log"))
{
// Xử lý va chạm với khúc gỗ (mục tiêu)
hasCollided = true;
// Dừng di chuyển con dao
GetComponent<Rigidbody2D>().velocity = Vector2.zero;
// Gắn con dao làm con của khúc gỗ để nó xoay theo
transform.SetParent(other.transform);
// Vô hiệu hóa Collider để tránh va chạm với các con dao khác khi đang di chuyển
GetComponent<Collider2D>().enabled = false;
}
}
}
Giải thích code
* using UnityEngine;: Thư viện cơ bản của Unity để sử dụng các lớp như MonoBehaviour, Rigidbody2D, v.v.
* hasCollided: Một biến boolean để đảm bảo logic va chạm chỉ chạy một lần duy nhất cho mỗi lần ném dao.
* OnTriggerEnter2D(Collider2D other): Hàm này được gọi tự động khi Collider của con dao đi vào một Collider khác. Đối tượng other chính là đối tượng mà con dao va chạm vào.
* other.CompareTag("Knife"): Dòng code này kiểm tra xem đối tượng va chạm có tag là "Knife" hay không. Bạn cần đặt tag "Knife" cho prefab của con dao đã găm trên mục tiêu. Nếu đúng, tức là va chạm với một con dao khác, bạn có thể thực hiện các hành động như kết thúc trò chơi.
* other.CompareTag("Log"): Tương tự, nếu va chạm với khúc gỗ (có tag "Log"), con dao sẽ dừng lại và trở thành một phần của khúc gỗ, xoay cùng với nó.
* transform.SetParent(other.transform): Đây là một kỹ thuật quan trọng. Nó làm cho con dao trở thành con (child) của khúc gỗ, giúp nó tự động xoay theo khúc gỗ mà không cần thêm code phức tạp.
* GetComponent<Collider2D>().enabled = false;: Sau khi con dao đã găm vào khúc gỗ, bạn nên vô hiệu hóa collider của nó để nó không gây ra va chạm không mong muốn với các con dao khác khi đang xoay cùng với khúc gỗ.
Bạn có thể tùy chỉnh các hành động trong script này, ví dụ như phát âm thanh, hiệu ứng va chạm (particle effect), hoặc gọi một hàm trong GameManager để xử lý logic game over.
No comments:
Post a Comment