logo
Khóa học lập trình game server - smartfox - game đa người chơi Học lập trinh game online 3dvietpro Sửa chữa và thiết kế website .net
Welcome Guest! To enable all features please Đăng nhập or Đăng ký.

Thông báo

Icon
Error

Tùy chọn
Xem
Xem bài viết cuối Go to first unread
JungJinHyuk  
#1 Đã gửi : 14/09/2014 lúc 03:13:31(UTC)
JungJinHyuk

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
UserPostedImage
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
UserPostedImage
– 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)
UserPostedImage
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.
UserPostedImage
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
UserPostedImage
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
UserPostedImage
ở mỗi script của A và B, ta viết thêm các hàm sự kiện sau:

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”
UserPostedImage
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”
UserPostedImage
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-enter

tá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õ

Bạn bình luận ngay tại đây
minh3d  
#2 Đã gửi : 28/09/2014 lúc 02:28:47(UTC)
minh3d

Danh hiệu: Newbie

Nhóm:
Gia nhập: 28-09-2014(UTC)
Bài viết: 2

Được cảm ơn: 1 lần trong 1 bài viết
Hi bạn, Khi bạn copy bài từ nơi khác vui lòng bạn ghi rõ nguồn nhé. Hơn chục bài bạn post trong forum này đều từ http://unityviet.com. Công sức của tác giả khác viết, mong bạn tôn trọng nó 1 chút. Cám ơn bạn
Guest  
#3 Đã gửi : 29/09/2014 lúc 10:40:41(UTC)
Guest

Danh hiệu: Guest

Nhóm:
Gia nhập: 19-08-2014(UTC)
Bài viết: 46

Được cảm ơn: 1 lần trong 1 bài viết
ok thanks bạn nhắc.
Bạn bình luận ngay tại đây
Ai đang xem chủ đề này?
Guest (2)
Di chuyển  
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

Powered by YAF 2.1.0 | YAF © 2003-2024, Yet Another Forum.NET
Thời gian xử lý trang này hết 0.159 giây.