-
Thông tin
-
Hỏi đáp
Bài 3 - Phát triển trò chơi - Bài giảng Cấu trúc dữ liệu và giải thuật | Trường Đại học Bách khoa Hà Nội
Tạo một số đường đi cho màn chơi: Sử dụng texture đất để vẽ lên cỏ. Có thể dùng công cụ Lower terrain làm đường đi thấp hơn một chút so với xung quanh. Lưu ý xóa hết cây và cỏ trên đường đi, có thể hiểu là nó tỉ lệ thuận (1 cách tương đối) với thời gian chạy. Tài liệu được sưu tầm, giúp bạn ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!
Môn: Cấu trúc dữ liệu và giải thuật (ET2100)
Trường: Đại học Bách Khoa Hà Nội
Thông tin:
Tác giả:
Preview text:
BÀI 3 – PHÁT TRIỂN TRÒ CHƠI TỪ CÁC TÀI NGUYÊN CÓ SẴN 1. Ý TƯỞNG TRÒ CHƠI
- Người chơi điều khiển một nhân vật, chạy trốn khỏi đám zombie. Mục tiêu là người chơi
cần phải đến nơi trú ẩn. 2. THIẾT KẾ MÀN CHƠI A) THIẾT KẾ LEVEL
Tiếp tục phát triển môi trường từ Bài 2, bổ sung thêm mô hình nhà với mục đích làm nơi
trú ẩn cho nhân vật ở cách vị trí ban đầu của nhân vật một khoảng cách đủ xa.
Tùy chọn: Tạo một số đường đi cho màn chơi: Sử dụng texture đất để vẽ lên cỏ. Có thể
dùng công cụ Lower terrain làm đường đi thấp hơn một chút so với xung quanh. Lưu ý
xóa hết cây và cỏ trên đường đi. B) TẠO NAVIGATION MESH
Sau khi đã hài lòng với màn chơi, chúng ta cần phải tạo một Navigation Mesh. Cái này có
thể hiểu là một “bản đồ” xác định những vị trí mà các nhân vật có thể di chuyển trên bề
mặt của môi trường được (Không áp dụng cho người chơi, nhưng sẽ áp dụng cho các nhân
vật máy điều khiển, vd. các đối tượng sử dụng script AIThirdPersonController).
Đầu tiên, chúng ta vào menu Window | AI | Navigation để bật cửa sổ Navigation lên nếu
chưa được bật. Mặc định cửa sổ này sẽ nằm bên tab bên trái của cửa sổ Inspector.
Ấn vào tab Bake trong cửa sổ Navigation, sau đó thiết lập các thông số như sau:
- Radius: Bán kính của agent. Đặt là 0.5 (tương đương với 0.5 mét)
- Height: Chiều cao. Đặt là 2
- Step Height: Bước chân của agent. Nếu con số này đủ lớn thì agent có thể di chuyển
qua các địa hình (vd. bậc) có khoảng cách nhỏ hơn giá trị này. Đặt là 0.5.
- Max Slope: Góc tối đa của địa hình mà agent có thể di chuyển được. Đặt là 45 độ.
Sau đó ấn vào nút Bake để Unity tính toán và sinh ra lưới di chuyển cho các agent trên địa
hình. Quá trình này có thể mất nhiều phút, các bạn vẫn có thể làm các thao tác khác trên
Unity. Lưu ý: Nếu các bạn thay đổi bất kỳ đối tượng tĩnh nào, các bạn sẽ phải bake lại Navigation Mesh.
Sau khi bake xong, trên cửa sổ Scene sẽ hiển thị một lưới màu xanh trên bề mặt môi
trường (khi cửa sổ Navigation đang được bật). Lưới màu xanh này thể hiện những khu
vực mà các agent có thể di chuyển được.
3. TẠO CÁC NHÂN VẬT VÀ QUÁI VẬT A) NHÂN VẬT
Các bạn có thể sử dụng Third Person Controller hoặc First Person Controller tùy ý bằng
cách download các gói Starter Pack tương ứng trên Unity Asset Store (xem thêm mục 4, bài 2)
Tùy chọn: Đối với Third Person Controller, các bạn có thể thay thế mô hình nhân vật khác theo các bước như sau:
Bước 1: Thêm vào một Third Person Controller vào Scene.
Bước 2: Download nhân vật mới. Có thể download trên Unity Asset store hoặc dùng
một mô hình bất kỳ (ví dụ download từ Mixamo). Chọn Animation Type của mô hình đó là Humanoid.
Bước 3: Xóa mô hình gốc của prefab, có thể phải Unpack prefab để xóa nếu cần. Kéo
mô hình nhân vật mới vào thay thế.
Bước 4: Chọn prefab Third Person Controller, đổi Avatar của nhân vật mới.
Tham khảo thêm chi tiết đối với các mô hình download tại Mixamo tại Phụ lục 2 - Sử
dụng mô hình từ Mixamo B) QUÁI VẬT
Thêm AI Character Controller vào màn chơi, sau đó kéo Game Object người chơi vào mục
Target ở trong AI Character Controller trên cửa sổ Inspector của quái vật. Việc này sẽ
khiến cho các đối tượng này tự động di chuyển đến người chơi. Để giảm độ khó của trò
chơi, ta giảm Speed của các đối tượng này còn 0.1.
Việc thay đổi mô hình của quái vật cũng tương tự như thay đổi mô hình của người chơi. 4. TƯƠNG TÁC
A) GIỮA NHÂN VẬT VÀ QUÁI VẬT
Ý tưởng là khi nhân vật có va chạm với quái vật thì trò chơi kết thúc. Do đó, cần phải xét
xử lý va chạm giữa 2 đối tượng (ở đây là quái vật và nhân vật). Việc này trong Unity được
xử lý bằng các thành phần Collider. Trong các game đơn giản, hoặc cần tối ưu hiệu năng,
chúng ta chỉ cần sử dụng Box Collider. Trong những game phức tạp hơn, cần chi tiết hơn
trong việc xử lý va chạm (ví dụ game đối kháng), chúng ta có thể sử dụng Mesh Collider.
Mặc định, các game object trong Unity không có collider để tối ưu hiệu năng. Để thêm
collider cho một đối tượng, các bạn chọn đối tượng game cần thêm, tại cửa sổ Inspector
chọn Add Components, tìm và thêm collider tương ứng. Ví dụ trong bài này ta chọn
BoxCollder. Nhìn sang mô hình trên cửa sổ Scene, có thể thấy Collider được hiển thị màu
xanh lá cây bao xung quanh mô hình. Chọn Edit Collider nếu thấy đường bao không khớp
với mô hình, hoặc chỉnh sửa trực tiếp giá trị Center và Size.
Để có thể xử lý va chạm, đánh dấu chọn ở mục Is Trigger. Khi đó, mỗi khi mô hình có va
chạm, phương thức OnTriggerEnter của game object đó sẽ được gọi.
Ý tưởng trò chơi là khi nào nhân vật có va chạm với quái vật, người chơi sẽ bị reset về vị
trí ban đầu. Để thực hiện ý tưởng này, ta cần có một biến lưu trữ tọa độ của người chơi
lúc mới bắt đầu. Mỗi khi có va chạm với đối tượng được đánh dấu, tọa độ của người chơi
sẽ chuyển về vị trí ban đầu này.
Để thực hiện, trước hết ta chọn đối tượng quái vật. Trong cửa sổ Inspector, dưới tên của
đối tượng game chọn Tag → Add Tag… và thêm vào một tag nào đó, ví dụ “Zombie”.
Sau đó, viết mã nguồn cho nhân vật (xem lại cách tạo script và thêm vào đối tượng game ở Bài 1) như sau
public class Player : MonoBehaviour {
private Vector3 defaultPosition;
// Start is called before the first frame update void Start() {
defaultPosition = this.transform.position; }
// Update is called once per frame void Update() { }
void OnTriggerEnter(Collider obj) { if (obj.tag == "Zombie") {
this.transform.position = defaultPosition; } } }
B) GIỮA NHÂN VẬT VÀ SAFE HOUSE
Tương tự, ta cũng thêm một đối tượng ngôi nhà vào khung cảnh, thêm tag cho ngôi nhà (ví dụ “Goal”). else if (obj.tag == "Goal") { PHỤ LỤC
PHỤ LỤC 1 – HƯỚNG DẪN CÀI ĐẶT STARTER ASSETS – FIRST PERSON CHARACTER CONTROLLER
Bước 1: Truy cập vào đường link Starter Asset – First Person Character
Tiếp theo nhấn vào nút ở Add to my Asset. Sau khi thêm vào thành công thì nút đó sẽ thay
bằng Open in Unity như hình trên. Sau đó nhấn vào Open in Unity, cửa sổ Package
Manager trên Unity sẽ hiện ra và trỏ tới asset mình vừa thêm vào
Bước 2: Download và Import:
Tại package manager, khi trỏ tới asset mình vừa thêm sẽ có nút Download để tải asset
đó về. Sau khi tải xong, nút download sẽ thành nút Import như hình dưới
Nhấn vào nút Import, cửa sổ Import sẽ hiện lên, ta nhấn tiếp vào Import
(Lưu ý, nếu có thông báo này hiện ra, nhấn Yes, khi đó Unity sẽ khởi động lại)
Bước 3: Cho nhân vật vào game và trải nghiệm
Ở cửa sổ project, truy cập theo đường dẫn sau:
Assets\StarterAssets\FirstPersonController\Prefabs
Sau khi vào thư mục Prefabs, kéo 3 prefabs vào scene game, đó là:
- MainCamera (Nếu trong scene đã có một MainCamera trước đó thì hãy xóa cái đấy trước) - PlayerCapsule
- PlayerFollowCamera
(Lưu ý: Khi kéo PlayerCapsule vào Scene thì hãy để lên trên địa hình, nếu không sau khi
chạy game nhân vật sẽ lọt xuống dưới địa hình và rơi tự do)
Tiếp theo, nhấn vào PlayerFollowCamera trên Scene, trong cửa sổ Inspector sẽ thấy một
Component tên là CinemachineVirtualCamera
Tại phần Follow hiện tại đang là None chúng ta sẽ kéo PlayerCameraRoot nằm trong
PlayerCapsule ở trong cửa sổ Hierarchy vào
Chú ý: Do asset mới thêm vào sử dụng hệ thống Input mới nên chúng ta cần phải thay thế
lại hệ thống Input như sau:
Click chuột phải vào cửa sổ Hierarchy, kéo xuống Ui, chọn Event System, một Object mới
có tên Event System sẽ được tạo.
Nhấn vào Event System, ở cửa sổ Inspector kéo đến Component Standalone Input
Module và nhấn vào nút Replace with InputSystemUIInputModule.
PHỤ LỤC 2 - SỬ DỤNG MÔ HÌNH TỪ MIXAMO
Để sử dụng mô hình từ Mixamo: Truy cập vào link https://www.mixamo.com
Đăng nhập vào mixamo sau đó chọn cho mình nhân vật mình muốn sử dụng và nhấn
Download. Chọn nơi tải về là folder Assets của project
Chọn định dạng như hình:
Nhân vật sau khi tải xong:
Nhấn vào file nhân vật vừa tải xong, trong cửa sổ Inspector nhấn vào Materials. Tại
Location, chuyển thành Use External Materials (Legacy) sau đó nhấn Apply,
Material của nhân vật sẽ được cập nhật
Nếu có thông báo này, hãy nhấn Fix Now
Tiếp theo, chuyển sang Rig, tại mục Animation Type chuyển sang Humanoid rồi nhấn Apply
Bước 3: Thay thế nhân vật
Trong cửa sổ Hierarchy, nhấn chuột phải vào PlayerAmature rồi chọn Prefab → Unpack
Tiếp theo, mở các object con của PlayerAmature ra sẽ thấy object tên là
Amature_Mesh, hãy xóa object đó đi bằng cách nhấn chuột vào object đó rồi nhấn phím Del.
Kéo file nhân vật vừa tải vào object Geometry, nhân vật mới sẽ được thay thế
Cuối cùng, nhấn lại vào PlayerAmature, trong cửa sổ Inspector có Component
Animator, tại phần Avatar hãy thay Avatar của nhân vật mới vào
Document Outline
- BÀI 3 – PHÁT TRIỂN TRÒ CHƠI TỪ CÁC TÀI NGUYÊN CÓ SẴN
- 1. Ý tưởng trò chơi
- 2. Thiết kế màn chơi
- a) Thiết kế level
- b) Tạo Navigation Mesh
- 3. Tạo các nhân vật và quái vật
- a) Nhân vật
- b) Quái vật
- 4. Tương tác
- A) Giữa nhân vật và quái vật
- b) Giữa nhân vật và safe house
- PHỤ LỤC
- Phụ lục 1 – Hướng dẫn cài đặt Starter Assets – First Person Character Controller
- Phụ lục 2 - Sử dụng mô hình từ Mixamo