TẠO ĐỊA HÌNH Để tạo địa hình trong Unity, ta chọn menu GameObjects | Create Others | Terrain Chọn Terrain vừa tạo, ta thấy cửa sổ Inspector như sau Trong đó • Paint Terrain: Bao gồm nh
Trang 1NHÓM 6: ực hành lập trình Unity Th
Thành viên:
1 Lê Thành An 20235631 (leader)
2 Đinh Ngọc Khánh 20235752
3 Nguyễn Thế Thành 20235831
4 Nguyễn Anh Tuấn 20235860
1 TẠO ĐỊA HÌNH
Để tạo địa hình trong Unity, ta chọn menu GameObjects | Create Others | Terrain
Chọn Terrain vừa tạo, ta thấy cửa sổ Inspector như sau
Trong đó
• Paint Terrain: Bao gồm nhiều công cụ để có thể ẽ” địa hình Chẳng hạ“v n như:
o (Stamp Terrain): Sử dụng để đóng dấu một o (Raise / Lower Terrain): Sử
dụng để nâng cao bề mặt địa hình Sử dụng kết hợp với phím Shift để hạ địa hình
Trang 2o (Paint Holes): Sử dụng để ẩn các phần của địa hình Công cụ này cho
phép tạo ra khoảng trống trong đị hình Có thể dùng để tạo hang động a
và vách đá
o (Paint Texture): Vẽ texture lên địa hình
o (Set Height): Sử dụng phím Shift và ấn vào một độ cao nào đó để lấy
mẫu, sau đó ta có thể sử dụng công cụ này để nâng độ cao đến bằng mẫu đó
o (Smooth Height): Làm mịn bề mặt địa hình, giúp địa hình các vùng lân
cận có độ cao tương đồng hơn hình dạng brush lên trên Heightmap hiện tại Hữu ích khi tạo một brush tùy chỉnh bằng cách sử dụ Texture.ng
• (Place Trees): Đặt cây lên bề mặt địa hình
• (Paint Details): Đặt các chi tiết nhỏ như cỏ cây hoa lá lên bề mặt địa hình
• (Terrain Settings): Thay đổi các thiết lập của địa hình
2 THIẾT KẾ HÒN ĐẢO
Để làm quen với các công cụ thiết kế địa hình của Unity, chúng ta sẽ tiến hành thiết kế một hòn đảo
Dựng địa hình
Trước tiên chúng ta tạo ra một địa hình mới, vào Terrain Settings chọn Terrain Width và Terrain Length là 200 (tương đương với 200m x 200m)
Trang 3Sau đó chúng ta sử dụng công cụ Raise / Lower Terrain, Smooth Terrain và Paint Height và tạo hình một hòn đảo dạng như hình vẽ ới đâydư
3 VẼ TEXTURE
Unity ở các phiên bản gần đây không còn cung cấ ẵn cho chúng ta một số các p s texture và các tài nguyên khác cho việc thiết kế địa hình nữa Chúng ta cũng có thể
sử dụng các texture tự tạo hoặc tìm các terrain texture / terrain asset trên Unity
Store
ọn công cụ Ch Paint Texture ấn vào button , Edit Textures và chọn Add Texture…
Sau đó chúng ta lần lượt thêm vào các texture Grass (Hill), Good Dirt, Grass & Rock và Cliff (Layered Rock) Mục Normal map chúng ta để ống vì ở đây chúng ta tr không sử dụ Normal map Chúng ta để nguyên giá trị size của texture là (15, ng
Trang 415), trừ Cliff (Layered Rock) chúng ta chọn size là (70, 70).
Ngay sau khi chúng ta vừa thêm vào texture đầu tiên thì toàn bộ địa hình của chúng ta sẽ được phủ texture đó Vì địa hình của chúng ta phần lớn là cỏ xanh nên
để cho dễ dàng các bạn nên thêm texture Glass (Hill) đầu tiên
Tiếp theo các bạn chọn texture Good Dirt để tô vào những vùng xung quanh hòn đảo bằ Brush thích hợp Lưu ý là các bạn có ể ỉnh Brush size, Opacity và ng th ch Target Strength của Brush
Trang 5Kết quả thu được tương tự như hình sau:
Tiếp theo, chúng ta sẽ sử dụng texture Grass&Rock để vẽ ở nhưng vùng núi cao, theo tư tưởng là ở các vùng núi cao cỏ sẽ khó mọc hơn vùng đồng bằng
Cuối cùng, chúng ta sẽ dùng texture Cliff (Layered Rock) để vẽ lên đỉnh núi cao nhất
Trang 6Chúng ta có được một hòn đảo (tương đối) hoàn chỉnh như sau
4 ĐI DẠO QUANH HÒN ĐẢO
Như vậy hòn đảo của chúng ta đã tương đối hoàn tất Giờ chúng ta có thể đi dạo một vòng quanh hòn đảo để ểm tra những gì chúng ta đã xây dựng.ki
Chúng ta có thể thay đổi vị trí của Main Camera để xem các góc khác nhau tại hòn
đảo
Các khác là chúng ta có thể download một gói character controller bất kỳ (ví dụ Starter Asset – First Person Character) sau đó thêm prefab FPS Controller vào địa hình
Chi tiết xem thêm tại Phụ lục 1 - Hư ớng dẫn cài đặt Starter Assets – First Person Character Controller
5 ĐẶT CÂY
Chọn địa hình vừa tạo, ấn vào công cụ Place Tree
Ấn vào Edit Trees… và chọn Add Tree
Trong cửa sổ Add Tree hiện ra, ấn vào vòng tròn bên cạnh mục Tree và chọn mô
hình cây bất kỳ Ở đây ta chọn mô hình Palm có sẵn trong Terrain Asset Ta cũng có
Trang 7thể thay đổi giá trị Bend Factor, là độ tác động của gió lên độ nghiêng của cây (ví
dụ: 2)
Việc đặt cây lên địa hình cũng tương tự như việ ẽ texture lên địa hình Chú ý khi c v
vẽ nếu zoom quá xa thì Unity sẽ tự động không hiển thị lên cửa sổ Scene, do đó là khi đặt cây lên địa hình nên zoom vào một khoảng cách nhất định
Trang 86 VẼ CÁC CỎ CÂY HOA LÁ LÊN ĐỊA HÌNH
Chọn công cụ Paint Details trong thanh công cụ của địa hình Cũng tương tự như
vẽ cây, chúng ta có thể dùng công cụ này để vẽ các chi tiết nhỏ như cỏ, hoa, lá… lên bề mặt địa hình Các chi tiết này sử dụng công nghệ billboarding, thực chất là các texture 2D nhưng luôn quay về phía người chơi tạo cảm giác 3D
Tương tự, ta ấn vào Edit Details… và chọn Add Grass Texture
Tiếp theo, ta chọn Detail Texture là Grass, chọn màu sắc Healthy Color và Dry Color
cho phù hợp với màu sắ ủa địa hìnhc c
Để cỏ mọc rải rác và đồng thời cũng giảm thiểu tiêu tốn tài nguyên của máy tính,
ta nên ọn Brush thưa hơn khi vẽ cỏ lên địa hình Tương tự như khi vẽ cây cối, ch
Trang 9Unity sẽ không ển thị các chi tiết này trừ phi chúng ta zoom vào thật gầhi n.
7 SKYBOX
Chọn menu Assets | Import Package | Skyboxes
Trang 10Chọn menu Edit | Render Settings… Ở cửa sổ Inspector ấn vào Skybox Material và
chọn skybox phù hợp
8 ÁNH SÁNG
Địa hình của chúng ta vừa tạo là cảnh ngoài trời, do đó chúng ta sẽ sử dụng
Directional Light để làm nguồn ánh sáng chính cho khung cảnh Với các loại ánh
sáng khác chúng ta cũng làm tương tự
Mặc định, khi tạo ra Project mới, Unity đã tạo ra một Directional Light Nếu chưa
có, chúng ta chọn menu GameObject | Create Other | Directional Light
Ta có thể chọn đối tượng ánh sáng này và rotate hướng ánh sáng cho phù hợp Mặc dù ta cũng có thể thay đổi vị trí của đối tượng này nhưng việc này không có
Trang 11tác dụng trong game vì ánh sáng chiếu của Directional Light là ánh sáng song song.
9 NƯỚC
Nước, water thực chất chỉ là một mặt phẳng bình t ờng, tuy nhiên các hiệ ứng hư u tạo bóng bề mặt (shader) khiến cho nhìn vào có cảm giác 3 chiều
Để tạo ra nước để sử dụng trong Unity, có thể tìm trên Unity Asset Store với từ khóa “water shader” Đối với các phiên bản Unity cũ hơn, Unity có tích hợp Basic water shader trong Standard Asset
Các bạn download một asset water shader bất kỳ và add vào Scene Chỉnh vị trí sao cho độ cao y cao hơn mặt đất và tâm đặt tại chính giữa địa hình Sau đó phóng to đối tượ Water để bao trùm cả địa hình.ng
Trang 12Kết quả thu được như hình dưới
Luyện tập:
Sử dụng Unity Asset Store để download các tài nguyên tĩnh như nhà cửa, đất đá, cây cố để thêm vào mô hìnhi…
Các tài nguyên trên store có thể có tỉ lệ không chuẩn, các bạn có thể cần phải phóng to/thu ỏ để phù hợnh p với khung cảnh
Tham khảo video hướng dẫ ạo địa hìnhn t
Trang 13BÀ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ậ ở cách vị trí ban đầ ủa nhân vật một khoảng cách t u c
đủ 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
Trang 14Sau 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ó ể ểu là một “bảth hi 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 đượ ật Mặc địc b 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,
Trang 15các bạ ẽ n s phải bake lại Navigation Mesh.
Sau khi bake xong, trên cửa sổ Scene sẽ ển thị một lưới màu xanh trên bề mặhi t môi trường (khi cửa sổ Navigation đang đượ ật) Lưới màu xanh này thể c b 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)
(Nâng cao) Đố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 dung 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ố ủa prefab, có thể ải Unpack prefab để xóa nế ần c c ph u c Kéo mô hình nhân vật mới vào thay thế
Trang 16Bướ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
Duplicate
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ầ ử dụng Box Collider Trong những n s game phứ ạp hơn, cần chi tiết hơn trong việ ử lý va chạm (ví dụ game đốc t c x 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 Để them 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 ọn Add Components, tìm và thêm collider tương ứng Ví dụ trong ch bài này ta chọn BoxCollider 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
Trang 17giá trị Center và Size.
Để có thể xử lý va chạm, đánh dấu chọ ở mục Is Trigger Khi đó, mỗi khi mô hình n
có va ạm, phương thức OnTriggerEnter của game object đó sẽ ch đượ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
Để ực hiện, trướ ết ta chọth c h 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
public class Player : MonoBehaviour
{
private Vector3 defaultPosition;
// Start is called before the first frame update
void Start() {
// Update is called once per frame
Trang 18void 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" )
{
// …
}
Gợi ý một số tính năng có thể cài đặt:
- Cho nhân vật chuyển vị trí đến một địa điểm khác trên bản đồ
- Cho nhân vật dừng di chuyển (Gợi ý: Disable component Character Controller
của nhân vật bằng lệnh GetComponent<CharacterController>().enabled = false; )
- Từ từ zoom camera ra xa
…
-Hết -