4/13/2014

ProjectGame 1.2 - Platform Game Đơn Giản - Tạo nhân vật 2D




Trong bài này, chúng ta sẽ tạo nhân vật 2D và vật liệu từ các file ảnh đã download ở bài viết 1.1. Chúng ta sẽ có nhân vật với 3 kiểu hành động khác nhau: đứng yên, đi bộ và nhảy.



Mục tiêu

1.1 - Tạo Camera và Level
>> 1.2 - Tạo nhân vật 2D
1.3 - Tạo class (lớp) CharacterController và SpriteManager
1.4 - Nhảy và yếu tố vật lý
1.5 - Tạo chìa khóa và mở cửa
1.6 - Chèn âm thanh và nút Replay

Kiểm tra tài nguyên

Tại thẻ Project, các bạn vào thư mục Game Project 1 | Characters sẽ thấy 3 thư mục là Stay, Walk và Jump. Mở từng thư mục và kiểm tra xem đã có đủ các file như hình dưới đây chưa:



Bắt tay vào làm việc

Nhân vật của chúng ta chỉ bao gồm các hình ảnh 2D nên chỉ cần sử dụng plane để tạo nhân vật là đủ.

B1. Tại thẻ Project, vào thư mục Game Project 1 | FBX và kéo thả prefab Plane vào thẻ Hierarchy.


B2. Nhấp chọn Plane ở thẻ Hierarchy, qua thẻ Inspector, nhấp phải vào Animator và chọn Remove Component.



B3. Vẫn ở thẻ Inspector, điều chỉnh các giá trị như hình sau:


B4. Tại thẻ Hierarchy, nhấp phải vào Plane và chọn Rename, gõ tên lại thành Player như hình sau:


B5. Tại thẻ Project, nhấp chọn nút Create | Material và đặt tên là M_Character.


B6. Nhấp chọn M_Character ở thẻ Project, qua thẻ Inspector và điều chỉnh như sau:
  • Shader: Transparent| Cutout| Soft Edge Unlit
  • Base (RGB) Alpha (A)
  • Kéo thả s_set.png trong thư mục Characters | Stay vào texture thumbnail
  • X: Tiling: 0.5, Offset: 0
    ‰Y: Tiling: 1, Offset: 0
  • Base Alpha cutoff: Kéo về tận cùng bên phải


B7. Tại thẻ Project, kéo thả M_Character vào Player ở thẻ Hierarchy.


B8. Nhấp chọn Player ở thẻ Hierarchy, vào Component | Physics | Box Collider, và qua thẻ Inspector điều chỉnh như sau:
  • Size: x = 0.4, y = 0.875, z = 1
  • Center: x = 0, y = -0.06275, z = 0


B9. Tiếp theo, chúng ta sẽ tạo Rigid body để hỗ trợ việc tính toán tốc độ di chuyển, nhảy và phát hiện va chạm với địa hình. Nhấp chọn Player ở thẻ Hierarchy, Component | Physics | RigidBody. Qua thẻ Inspector điều chỉnh như hình sau:



Hoàn thành mục tiêu 1.2

Chúng ta vừa tạo plane để mô phỏng nhân vật 2D cho người chơi. Chúng ta cũng vừa tạo vật liệu cho nhân vật bằng cách sử dụng  Transparent | Cutout | Soft Edge Unlit Shader. Shader này sẽ loại bỏ kênh Alpha và làm nó trong suốt. Trong khi đó, cũng sử dụng tính năng làm mượt đường viền của bức ảnh. Chúng ta có thể điều chỉnh việc phần nào được loại bỏ và độ mượt của đường nét dựa vào tính năng của thanh trượt Base Alpha Cutoff.

Chúng ta cũng đã điều chỉnh Tiling của trục X = 0.5 bởi vì file ảnh chứa 2 khung hình, như chúng ta chỉ cần sử dụng 1 khung hình cho một thời điểm. Chúng ta đã sử dụng Box Collider thay vì Mesh Collider. Cũng đã thêm RigidBody cho nhân vật và điều chỉnh đóng băng các góc xoay, để không sử dụng các tính năng xoay quanh các trục tọa độ mà sử dụng đến Engine Vật lý của Unity. Vì vậy Player của chúng ta không thể xoay tròn được. Rigid Body sẽ cung cấp cho nhân vật các tính chất để kích hoạt Engine Vật lý trong Unity, như lực hút (gravity) hoặc vận tốc (velocity), và các hoạt động vật lý như trong đời thực. Chúng ta sẽ hiểu rõ hơn trong bài viết sau.


Kiến thức bổ sung

Tại sao lại đóng băng các trục xoay và vị trí trong RigidBody?

Chúng ta cần đóng băng góc xoay vì chúng ta sử dụng các sprite để mô phỏng việc di chuyển của nhân vật. Vì vậy chúng ta không cần nhân vật phải xoay hướng nhìn khi di chuyển. Chúng ta cũng đóng băng việc di chuyển trên trục Z bởi nhân vật chỉ di chuyển trên trục X và Y. Trong trường hợp này, chúng ta có thể tiết kiệm được chu trình xử lý của CPU bởi Unity sẽ vô hiệu hóa các tính toán không cần thiết và tập trung vào thực hiện những phần cần thiết khác.

Box Collider và Mesh Collider

Vậy tại sao chúng ta lại dùng Box Collider thay vì Mesh Collider? Cả hai collider này hầu hết đều tương tự nhau. Mỗi bề mặt của vật thể điều có các trục vuông góc đặt ở mỗi đỉnh để kiểm tra có va chạm với các vật thể khác hay không. Với vật thể plane chúng ta dùng để tạo nhân vật thì chỉ có một bề mặt hướng thẳng đến camera. Vì thế nếu chúng ta dùng Mesh Collider, chúng ta sẽ không nhận được giá trị nào phát hiện việc va chạm của các bề mặt trên, dưới, trái, phải và phía sau cả. Đơn giản là bởi vì plane chỉ có bề mặt phía trước mà thôi.

 

Bên cạnh đó, Box Collider sử dụng hình khối để kiểm tra phát hiện va chạm. Kết quả này sẽ nhanh hơn nhiều so với Mesh Collider. Trong trường hợp này, chúng ta kiểm tra hình khối của nhân vật với địa hình để xem phần nào va chạm, phần nào không.

Box Collider sẽ tiết kiệm nhiều bộ nhớ và CPU hơn Mesh Collider.


Kế tiếp, chúng ta sẽ bàn về Tiling của vật liệu, tương tự như các phần mềm 3D khác. Mỗi Texture đều được áp vào vật liệu vì thế chúng sẽ được kéo dãn ra để phủ kín vật thể.


Tiling rất giống với scaling, và cơ bản là việc lặp lại texture theo trục X và Y. Vì vậy nếu chúng ta đặt Tiling X = 0.5 và Y = 1.0, chúng ta sẽ thấy kết quả ở hình bên trên trục X chỉ bằng phân nữa và trục Y vẫn giữ nguyên. Chúng ta sẽ thấy, hình bên phải chỉ hiển thị khung hình thứ nhất (hình đứng yên bên trái trong khối hộp bên trái). Vậy để hiển thị hình bên phải trong khối hộp bên trái thì làm như thế nào? Chúng ta sẽ cần dùng đến tính năng Offset.Offset sẽ cho phép chúng ta điều chỉnh vị trí bắt đầu của texture. Nếu chúng ta điều chỉnh Offset là X = 0, Y = 0 thì đồng nghĩa với việc sẽ bắt đầu hiển thị texture từ góc trên bên trái. Và nếu điều chỉnh X = 0.5 thì texture sẽ hiển thị bắt đầu từ điểm giữa góc trên, đồng nghĩa với việc hiển thị hình ảnh bên phải của khối hộp bên trái. Xem hình dưới đây sẽ rõ:


Chúng ta có thể điều chỉnh Tiling thông qua hàm material.mainTextureScale và sử dụng hàm material.mainTextureOffset để điều chỉnh Offset.

Sau khi đã hiểu về nguyên lý làm việc ở phần này, chúng ta sẽ có thể tiến hành xử lý sprite ảnh của chúng ta bằng cách thay đổi trị số Tiling và Offset của vật liệu ở bài viết tiếp theo.







No comments:

Post a Comment