Header ads

Header ads
» » » PHÁT TRIỂN GAME VỚI UNITY Bài 2. Collision, Trigger, Input

Giới thiệu: Loạt clips của Unity3Dstudent.com này khá dài – gồm 28 clip, tuy nhiên nội dung truyền tài nhiều nhưng ngắn và không khó. Cho nên kể từ bài này về sau, tôi sẽ gom nhiều nội dung có tương quan lại với nhau thành một bài.

Hôm nay chúng ta sẽ đi sâu hơn về “va chạm”, sau đó tìm hiểu về một vấn đề liên quan đến Collider là Trigger. Cuối cùng là nội dung xoay quanh Input.

1.       Collision:

Collision nghĩa là sự va chạm – khái niệm này gắn liền với Component Collider trong Unity. Unity cung cấp cho chúng ta một Class Collider trong đó có 3 Messages Sent (một kiểu event - sự kiện) để kiểm soát trạng thái của Collision như sau:

1
2
3
4
5
function OnCollisionEnter (collisionInfo : Collision) : void // OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.
 
function OnCollisionExit (collisionInfo : Collision) : void // OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.
 
function OnCollisionStay (collisionInfo : Collision) : void // OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.

 *Lưu ý: Thật sự Class này cung cấp 6 Messages Sent về Collision, tuy nhiên chúng ta khảo sát trước về 3 Messages Sent trên, 3 Messages Sent còn lại sẽ được nêu ngay sau đây (ở phần nói về Trigger).

Ví dụ: Cách đơn giản nhất để làm quen với code là khảo sát ví dụ, chúng ta sẽ khảo sát thử OnCollisionEnter – một Messages Sent thường dùng nhất:

Chuẩn bị một Scene như sau:

 

*Attach Rigitbody vào Cube và check Use Gravity.

Click phải ở cửa sổ Project và chọn Create -> Javascript

Đặt tên tùy ý rồi double click để mở file, viết đoạn Code sau:

1
2
3
4
function OnCollisionEnter(colInfo : Collision)
{
        Debug.Log("Phat hien va cham voi: " + colInfo.gameObject.name);
}

Kéo thả tập tin code vừa tạo vào Cube để attach, nhấn play và theo dõi:

 

Hình trên là kết quả sau khi Cube rơi và va chạm với Floor. Điều này chứng tỏ OnCollisionEnter đã phát hiện sự va chạm giữa Collider của nó (Cube) và Floor và thực thi lệnh in ra Debug. colInfo với type là Collision là biến nắm giữ thông tin của sự va chạm, bên trên viết colInfo.gameObject.name nghĩa là tên của GameObject có collider va chạm với collider của Cube.

Tương tự với OnCollisionEnter, OnCollisionStay và OnCollisionExit sẽ bắt sự kiện Stay(ở lại) hoặc Exit(ra khỏi, thoát ra) khi có một collider nào thực hiện những tương tác này với collider của GameObject được attach code.

*Lưu ý: Các Message Sent trên sẽ không có tác dụng khi attach vào đối tượng không có collider, Unity sẽ không báo lỗi vấn đề này.

2.       Trigger:

Vừa trên chúng ta đã khảo sát về code xoay quanh Collision, như vậy chúng ta đã phần nào suy ra được những khả năng ứng dụng của chúng. Bây giờ chúng ta sẽ khảo sát về một ứng dụng khác và rất phổ biến của Collider và Collision đó là Trigger.

Trigger theo Google Translate nghĩa là “Kích hoạt” hay “Cò súng”. Trong Unity, Trigger là một loại Collider có thể xuyên qua, nếu Collider thông thường dùng để phát hiện va chạm và ngăn chặn mọi tác động xuyên qua Object của một Collider khác thì Trigger chỉ đóng vai trò phát hiện ra sự va chạm nhưng vẫn cho Collider tạo nên sự va chạm đó đi xuyên qua Object.

Thao tác tạo Trigger cũng giống như tạo Collider, tuy nhiên sau khi tạo ra Collider, chúng ta check chọn giá trị “Is Trigger”  trong Component Collider đó.

Như vậy Trigger cũng không khác mấy, thế Unity cho chúng ta khái niệm Trigger để làm gì?

Thử nhớ lại khi chơi game chúng ta thường thấy điều này: “đến một nơi nào đó và có một sự kiện nào đó diễn ra!” – vậy tại sao hệ thống biết được người chơi đã đến đó để cho sự kiện đó xảy ra đúnh lúc họ đến? Phải có một thứ gị thông báo cho hệ thống biết chứ? Vâng! Đó chính là Triger. Để dễ hiểu nhất, tôi có chuẩn bị một video minh họa sau:


Dưới đây là đoạn code được attach vào Object được dùng làm Triger:

1
2
3
4
5
6
var OldTree : GameObject; //Kéo thả Object OldTree vào slot ở cửa sổ Inspector sau khi attach vào Object
 
function OnTriggerEnter () {
        OldTree.animation.Play("Falling");
 
}

Như vậy chúng ta thấy, Triger gần như hoàn toàn giống Collider nhưng có tính ứng dụng khác ở chỗ Triger có thể xuyên qua. Dưới đây là 2 Message Sent khác cùa Trigger, 3 Message Sent này hợp cùng 3 Message Sent chúng ta đã khảo sát ở phần 1 tạo nên 6 Message Sent gắn liền với Class Collider, chuyên đảm nhận các vấn đề xoay quanh Collision Của Collider.

1
2
function OnTriggerExit (other : Collider) : void // OnTriggerExit is called when the Collider other has stopped touching the trigger.
function OnTriggerStay (other : Collider) : void // OnTriggerStay is called almost all the frames for every Collider other that is touching the trigger.

*Lưu ý: Để xây dựng Trigger bắt sự kiện ở một vị trí nào đó như trên, chúng ta có thể tạo đơn giản bằng một cube, check “Is Trigger” sau đó Disbale Mesh Renderer của Cube.
Nhắc lại tính ứng dụng của Collider, ngoài ứng dụng xoay quanh va chạm, ta có thể lợi dụng khả năng ngăn cản các đối tượng có collider xuyên qua bằng cách tạo ra các Collider vô hình cho “trấn thủ” ở những nơi mà chúng ta không muốn cho người chơi đi qua!

3.       Input:
Không liên quan đến 2 vấn đề trên, hôm nay chúng ta đẩy tiến độ học Unity của mình nhanh hơn chút để nhanh có thể làm được game, khảo sát thêm một ít về Input nhé!
Ở đây tôi chỉ nêu về Input trên PC, vì chưa có điều kiện “rờ” đến các anh em nhà mobile! ^^
Input trên PC thì có Mouse và Keyboard, tất cả được Unity cung cấp trong class Input và công cụ Input Manager.
Đầu tiên để define các phím nào có chức năng gì, chúng ta vào menu: Edit -> Project Setting -> Input.

 


Chúng ta lưu ý nhất ở Input qua Name và Positive Button, Name đơn giản là một label cho biết chức năng của input đó, Positive Button cho biết đó là  “nút nhấn nào”?
Để bắt sự kiện Input, thông thường chúng ta sẽ code trong Function Update. Nói sơ về Update, đây là một Function cơ bản nhất thường dùng để kiểm soát đa số các sự kiện trong game, nó luôn luôn được gọi ở mỗi khung hình (frame). Nếu nói rõ về Update thì chúng ta sẽ phải đề cập đến nhiều hàm, khái niệm liên quan mật thiết khác, nên tôi sẽ không xoáy sâu vào nó, chúng ta sẽ có một bày riêng hẳn cho vấn đề này! ^^
Class Input có các Function sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GetAxis  //Returns the value of the virtual axis identified by axisName.
GetAxisRaw  //Returns the value of the virtual axis identified by axisName with no smoothing filtering applied.
GetButton  //Returns true while the virtual button identified by buttonName is held down.
GetButtonDown  //Returns true during the frame the user pressed down the virtual button identified by buttonName.
GetButtonUp //Returns true the first frame the user releases the virtual button identified by buttonName.
GetKey //Returns true while the user holds down the key identified by name. Think auto fire.
GetKeyDown  //Returns true during the frame the user starts pressing down the key identified by name.
GetKeyUp  //Returns true during the frame the user releases the key identified by name.
GetJoystickNames  //Returns an array of strings describing the connected joysticks.
GetMouseButton  //Returns whether the given mouse button is held down.
GetMouseButtonDown  //Returns true during the frame the user pressed the given mouse button.
GetMouseButtonUp  //Returns true during the frame the user releases the given mouse button.
ResetInputAxes  //Resets all input. After ResetInputAxes all axes return to 0 and all buttons return to 0 for one frame.
GetAccelerationEvent  //Returns specific acceleration measurement which occurred during last frame. (Does not allocate temporary variables)
GetTouch //Returns object representing status of a specific touch. (Does not allocate temporary variables)

*Tham khảo chi tiết về Input tại: http://docs.unity3d.com/Documentation/ScriptRefere...

BÀI TẬP: Hehe, hôm nay tôi xin phép bài vẻ một tí, nếu mọi người để ý thì trong những bài vừa qua, đặc biệt là bài này, cách tôi truyền tải kiến thức với mọi người khá lấp lửng (không đến nơi đến chốn), lý do là tôi muốn để mọi người tự tìm hiểu, tự khám phá là chính, turtorial của tôi chỉ nhằm giới thiệu một cái sườn cơ bản cho mọi người dựa vào đó mà tìm hiểu. Thế nên hôm nay tôi xin phép đưa ra một bài tập nhỏ để xem mọi người có thật sự đang tìm hiểu nó hay không. Bài tập hôm nay chỉ gói gọn trong nội dung bài này, cụ thể là để mọi người tìm hiểu kỹ và rõ hơn về phần Input mà tôi bỏ dỡ.
Đề bài: Dựng một scene tương tự như ở ví dụ trong phần 1, cho Cube ở cao hon chút nhé! Viết code cho phép người chơi nhấn một phím bất kỳ thì cửa sổ Debug sẽ hiển thị dòng chữ cho biết Cube đã rơi chạm Floor hay vẫn đang rơi.

About Học viện đào tạo trực tuyến

Xinh chào bạn. Tôi là Đinh Anh Tuấn - Thạc sĩ CNTT. Email: dinhanhtuan68@gmail.com .
- Nhận đào tạo trực tuyến lập trình dành cho nhà quản lý, kế toán bằng Foxpro, Access 2010, Excel, Macro Excel, Macro Word, chứng chỉ MOS cao cấp, IC3, tiếng anh, phần mềm, phần cứng .
- Nhận thiết kế phần mềm quản lý, Web, Web ứng dụng, quản lý, bán hàng,... Nhận Thiết kế bài giảng điện tử, số hóa tài liệu...
HỌC VIỆN ĐÀO TẠO TRỰC TUYẾN:TẬN TÂM-CHẤT LƯỢNG.
«
Next
Bài đăng Mới hơn
»
Previous
Bài đăng Cũ hơn