+4

Va chạm trong Unity 2D

Va chạm trong Unity, thêm đối tượng máy bay địch và xử lí va chạm.

I. Va chạm trong Unity

Va chạm và xử lí va chạm là những thành phần không thể thiếu khi lập trình game. Va chạm trong game là xảy ra khi chúng ta có 2 object đi vào không gian của nhau. Ví dụ như : trúng đạn, trúng bom, chạm phải quái vật, xuất phát, tới đích, trúng mũi tên ….. đều là các sự kiện va chạm và khi lập trình game chúng ta cần phải xử lí các va chạm đó. Chúng ta sẽ có 2 quá trình xử lí với va chạm như sau :

Quá trình 1 : phát hiện và thông báo sự kiện va chạm.

Qúa trình 2 : xử lí sự kiện va chạm.

Trong Unity có 2 loại va chạm đó là : Collision : là loại va chạm mà 2 đối tượng sẽ không đi xuyên qua nhau, khi đối tượng này gặp đối tượng kia thì sẽ bị cản lại, bật lại tùy theo tính chất vật lý mà chúng ta xét cho đối tượng. Ví dụ : Qủa bóng rơi từ trên cao rơi xuống sân cỏ sẽ bật lên … Trigger : là loại va chạm mà các đối tượng này có thể đi xuyên qua đối tượng kia, chúng ta sẽ sử dụng trigger trong các hoạt cảnh như làm cho tiếng nhạc bật lên khi đối tượng đi qua loa hay làm cho cây đổ khi người chơi đi tới, hay lửa …

Để hiểu rõ hơn ta đi vào ví dụ va chạm nhỏ trong Unity 2D.

alt

Với ví dụ này thì chúng ta sẽ không xét tới chiều không gian z, vì đây là môi trường 2D. Để thực hiện chúng ta sẽ gồm có 3 bước : Bước 1 : tạo không gian Collider Ta có 2 đối tượng là hình tròn A và hình vuông B. Ta sẽ thêm collider 2D cho 2 đối tượng này bằng cách :

  • Chọn đối tượng (hình tròn và hình vuông)

  • Nhấn vào Add Component và search “Collider 2D” hoặc nhấn vào Component > Collider 2D Sau đó chọn 1 trong các loại collider 2d dưới đây :

    • Circle collider 2D: collider dạng hình tròn
    • Box collider 2D: collider dạng hình vuông
    • Edge collider 2D: collider dạng đoạn thẳng
    • Polygon collider 2D: collider dạng đa giác tùy biến

alt

Khi chọn xong thì không gian xung quanh của đối tượng sẽ được bao quanh bởi một khung mầu xanh lá, là không gian Collider. Chú ý : 1 đối tượng có thể có nhiều Collider 2D hoặc 3D nhưng không được phép đồng thời có cả Collider 2D lẫn Collider 3D

  • Trên thanh Ispector của đối tượng lúc này sẽ xuất hiện thêm component collider 2D mà bạn vừa chọn.
  • Bạn có thể tùy chỉnh các thông số của component, và đặc biệt chú ý tới Gravity Scale bởi vì nó sẽ thiết lập lực hút khiến cho đối tượng tự động rơi xuống.

alt

Bước 2 : Viết code xử lí va chạm. (Chú ý ở đây là 2D nên bạn phải thêm chứ 2D vào sau hàm hay class)

using UnityEngine;
using System.Collections;

public class Collision_Box_B : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter2D(Collision2D col1) {
print(gameObject.name + " OnCollisionEnter2D voi " + col1.gameObject.name);
}

void OnTriggerEnter2D(Collider2D col2) {
print(gameObject.name + " OnTriggerEnter2D voi " + col2.gameObject.name);
}

void OnTriggerExit2D(Collider2D col2) {
print(gameObject.name + " OnTriggerExit2D voi " + col2.gameObject.name);
}
}

Tương tự với hình tròn A. Tham khảo thêm tại http://docs.unity3d.com/ScriptReference/Collider2D.html

Bước 3: Chạy thử demo.

alt

Để có ColliderEnter ở Object A:

Object A:

  • Có Collider Component
  • Is Trigger = False
  • Ít nhất 1 object có Rigibody component
  • Is Kinematic không được = True ở cả hai object

Object B:

  • Có Collider Component
  • Is Trigger = False

alt

Để có TriggerEnter hoặc TriggerExit ở Object A:

  • Cả 2 object có Collider Component
  • Ít nhất 1 object có Is Trigger = True
  • Ít nhất 1 object có Rigibody component

II. Thêm đối tượng máy bay địch và xử lí va chạm

Như demo game bắn máy bay đã hướng dẫn lần trước về phần xử lí âm thanh, trong phần này mình sẽ tiếp tục xử lí va chạm cho game bắn máy bay.

Hướng dẫn add thêm đối tượng máy bay địch. Hướng dẫn xử lí va chạm.

Đầu tiên chúng ta sẽ thêm một đối tượng Spawn

alt

Thêm file script là Spawn.cs sau vào thư mục Assets>Scripts

using UnityEngine;
using System.Collections;
public class Spawn : MonoBehaviour {
public float dichBegin;
public float dichDelay;
public GameObject dich;

// Use this for initialization
void Start () {
dichBegin = Random.Range (3f, 5f);
dichDelay = Random.Range (3f, 5f);
InvokeRepeating ("SpawnDich",dichBegin, dichDelay);
}
// Update is called once per frame
void Update () {
}
void SpawnDich(){
Instantiate (dich, transform.position, transform.rotation);
}
}

Sau đó add Spawn.cs cho đối tượng Spawn

alt

Để có nhiều đối tượng địch ra cùng lúc thì bạn copy và paste Spawn thành 3 đối tượng Spawn và để ở 3 ví trí xuất hiện khác nhau trên màn hình.

alt

Với đối tượng địch thì ta thêm 2 Component mới là Box Collider 2D và Rigidbody 2D để bắt và xử lí va chạm với đạn.

alt

Bạn cần phải kéo đối tượng địch ở bên menu tay trái vào thư mục Perfabs để tạo ra perfabs mới là dich.perfab và xóa đối tượng địch ở menu bên tay trái đi.

alt

Chúng ta cũng cần phải add thêm Component là Box Collider 2D cho đối tượng đạn.

alt

Sau đó update thêm code xử lí va chạm cho đối tượng đạn, khi xảy ra va chạm thì nếu đối tượng va chạm là “dich” thì cả đối tượng địch lẫn đối tượng đạn đều destroy.

File : danController.cs

using UnityEngine;
using System.Collections;
public class DanController : MonoBehaviour {
public float speed = 5;
// Use this for initialization
void Start () {
transform.position = new Vector3(transform.position.x,transform.position.y + 1,transform.position.z);
}
// Update is called once per frame
void Update () {
transform.Translate(Vector3.up * speed * Time.deltaTime);
if(transform.position.y > 6.2f){
Destroy(this.gameObject);
}
}
void OnCollisionEnter2D(Collision2D coll){
if(coll.gameObject.tag == "dich"){
Destroy(coll.gameObject);
Destroy(this.gameObject);
}
}
}

Như vậy lúc này chúng ta đã có thể tạo ra nhiều đối tượng địch và khi địch chạm phải đạn của chúng ta bắn ra thì địch và đạn sẽ biến mất.

alt


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí