Danh hiệu: Administration
Nhóm: Gia nhập: 20-08-2014(UTC) Bài viết: 60
Cảm ơn: 2 lần Được cảm ơn: 2 lần trong 2 bài viết
|
Collision detection in Unity (part 1)
Va chạm trong game, là sự kiện xảy ra khi hai vật thể (object) đi vào không gian của nhau, là một trong những sự kiện thường gặp nhất khi lập trình game. Đụng quái vật, đụng bom, đụng tường, trúng mũi tên, đi qua mốc, đi tới đích, … đều cần sự kiện va chạm và xử lý va chạm. Vậy tình huống là: khi hai vật thể va chạm, chúng sẽ thông báo sự kiện hàm va chạm và ta cần xử lý sự kiện trong hàm này.
Có 2 loại va chạm: Collision và Trigger Phân biệt nhau rất dễ: – Collision là va chạm mà hai object không đi xuyên qua được, hay nói cách khác là “đụng”, khi object này đụng object kia thì bị cản lại. Ví dụ: quả bóng đụng tường bị dội lại – Trigger là va chạm mà object này có thể đi xuyên qua object kia. Ví dụ: quả bóng bay ngang qua ngọn lửa.
Xử lý va chạm có thể ứng dụng cho việc tạo hiệu ứng vật lý hay đơn thuần chỉ là gọi hàm để xử lý sự kiện, trong bài này, Unity Việt chỉ giới thiệu cách gọi hàm xử lý va chạm, hiệu ứng vật lý sẽ để bài tiếp theo. [Ví dụ được thực hiện trên bản Unity 4.]
Phần 1: va chạm trong môi trường 3D có 3 bước để nhận sự kiện va chạm
Bước 1: Tạo không gian Collider
Ví dụ, bạn có 2 object là Hinh Cau A và Hinh Khoi B, để A và B có thể xảy ra va chạm, thì hai object này phải được “bao” lại bằng 1 không gian va chạm Collider, khi hai không gian Collider này “đụng” nhau, thì xảy ra va chạm.
Vậy đầu tiên ta phải tạo ra không gian va chạm bao quanh object bằng cách thêm một component Collider cho object đó
Cách làm: – chọn object – vào Menu Component > Physics > (hoặc nhấn Add Component, search “collider”) và chọn 1 kiểu Collider trong số các kiểu sau: o Box Collider: không gian va chạm bao quanh object là 1 hình khối vuông o Sphere: … hình khối cầu o Capsule: … hình viên nhộng o Mesh: … hình dạng tương ứng với hình dạng của vật thể (do vậy sẽ làm nặng game nhất) o Wheel: … hình đĩa tròn o Terrain: …hình bề mặt, thường dùng cho mặt đất
– Lúc này object sẽ xuất hiện 1 component Collider tương ứng, và vật thể cũng sẽ có 1 khung màu xanh lá bao quanh tượng trưng cho không gian Collider (gọi tắt là Collider)
Các thông số trong Component Collider: – Is Trigger: xác định là loại va chạm nào, giá trị True là va chạm trigger, False là va chạm collision – Material: bề mặt va chạm đề tạo hiệu ứng vật lý, ví dụ như hiệu ứng đàn hồi cần bề mặt đàn hồi, … có thể bỏ qua – Center: vị trí tương đối của Collider so với object – Ngoài ra, mỗi loại Collider sẽ có vài thông số riêng như: Box có Size, Sphere có Radius (bán kính), Capsule có Height và Direction, …
Ở ví dụ này, ta tạo cho hình Cầu A một Sphere Collider và tạo cho hình Khối B một Box Collider, thực tế thì bạn cần chọn loại Collider phù hợp nhất với yêu cầu game và hình dạng của object.
Mẹo: để thay đổi kích thước nhanh chóng cho Collider, bạn có thể nhấn Shift và kéo thả các núm trên khung xanh lá Ngoài ra, để có thể nhận sự kiện va chạm, bạn cũng cần add component Rigibody cho từng object
Mẹo: bỏ chọn Use Gravity để object không bị rơi
Bước 2: Viết Code xử lý va chạm Hàm sự kiện va chạm phải được đặt trong đoạn script là component của object có Collider (xem hình) Ở ví dụ này, ta tạo mới script Xu_Ly_Va_Cham_Hinh_Cau_A cho hình cầu A và Xu_Ly_Va_Cham_Hinh_Khoi_B cho hình khối B
ở mỗi script của A và B, ta viết thêm các hàm sự kiện sau:
using System.Collections; public class Xu_Ly_Va_Cham_Hinh_Cau_A : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnCollisionEnter (Collision col1) { print(gameObject.name + " OnCollisionEnter voi " + col1.gameObject.name); } void OnTriggerEnter(Collider col2) { print(gameObject.name + " OnTriggerEnter voi " + col2.gameObject.name); } void OnTriggerExit(Collider col2) { print(gameObject.name + " OnTriggerExit voi " + col2.gameObject.name); } }
Giải thích:
OnCollisionEnter: Hàm sự kiện ứng với va chạm loại collision, khi hai Collider đều thuộc loại collision bắt đầu va chạm, hay nói cách khác là collider của object tiếp xúc với collider của object kia OnTriggerEnter: Hàm sự kiện ứng với va chạm loại trigger, khi hai Collider thuộc loại trigger bắt đầu va chạm, hay nói cách khác là collider của object này đi vào collider của object kia OnTriggerExit: Hàm sự kiện ứng với va chạm loại trigger, khi hai Collider thuộc loại trigger thoát khỏi va chạm, hay nói cách khác là collider của object này thoát khỏi collider của object kia Đây là ba hàm thường dùng nhất, ngoài bạn có thể tham khảo thêm các hàm khác tại đây http://docs.unity3d.com/...Reference/Collider.html, phần Messages
Bước 3: chạy thử Test va chạm loại collision: Chắc rằng tại component Collider, mục Is Trigger không được chọn Chạy thử, dùng chuột kéo di chuyển hình cầu A lại đụng vào hình khối B, bạn sẽ thấy hình khối B bị đẩy đi và kết quả in ra tại cửa sổ Console: “Hinh Khoi B OnCollisionEnter voi Hinh Cau A” “Hinh Cau A OnCollisionEnter voi Hinh Khoi B”
Test va chạm loại trigger: Chắc rằng tại component Collider, mục Is Trigger được chọn Chạy thử, dùng chuột kéo di chuyển hình cầu A lại đụng vào hình khối B, bạn sẽ thấy hình cầu A đi xuyên vào rồi xuyên qua hình khối B và kết quả in ra tại cửa sổ Console: “Hinh Cau A OnTriggerEnter voi Hinh Khoi B” “Hinh Khoi B OnTriggerEnter voi Hinh Cau A” “Hinh Cau A OnTriggerExit voi Hinh Khoi B” “Hinh Khoi B OnTriggerExit voi Hinh Cau A”
Trong phần tiếp theo, UnityViet.com sẽ trình bày va chạm trong môi trường 2D và các điều kiện để xảy ra va chạm, xin chào và hẹn gặp lại!
Tham khảo thêm video hướng dẫn về OnTriggerEnter tại:
http://unity3d.com/learn...ysics/on-collision-entertác giả bài viết : Đậu Tài Sửa bởi người viết 29/09/2014 lúc 10:41:35(UTC)
| Lý do: Chưa rõ
|