Tiếp đó tạo các thao tác trong InPut Action trong folder Input để lưu cácthao tác của nhân vậtTiếp đó generate PlayerInput Script của InputAction.PlayerInput Script này sẽ nêu lại tên củ
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN 1
BÁO CÁO THỰC TẬP CƠ SỞ
Tên đê tài: Tào mot gàmê FPS 3D cơ bàn
bàng Unity
Giảng viên hướng dẫn: Nguyên Hoàng Anh Sinh viên thực hiện: Nguyên Giàng Linh
Mã sinh viên: B21DCCN483 Lớp: D21CQCN03-B
Trang 2I Lý do chọn đề tài và đặt yêu cầu……… 3
1,Lý do chọn đề tài………3
2.Yêu cầu………3
II.Các giải đoạn phát triển game………6
Giai đoạn 1……… 6
Giai đoạn 2……….11
Giai đoạn 3……….26
Giai đoạn 4……….36
III.Những điểm chưa hoàn thiện của game……….39
IV.Các khó khăn khi hoàn thiện game……….39
Trang 3I.Lý do chọn đề tài và đặt yêu cầu
Yêu cầu cho báo cáo:
Tổng quan về trò chơi FPS: Giới thiệu về thể loại game FPS, các đặcđiểm cơ bản và yếu tố quan trọng cần có trong một trò chơi FPS
2.1.Unity và công nghệ liên quan:
2.1.1.Unity Engine:
-Unity là một nền tảng phát triển trò chơi mạnh mẽ, được sử dụng rộngrãi trên toàn cầu
-Nó cung cấp một loạt các công cụ và tài nguyên để phát triển trò chơi
từ các công cụ dựng hình cho đến hệ thống lập trình và quản lý tàinguyên
-Unity hỗ trợ nhiều nền tảng, từ máy tính đến di động, console và thậmchí cả các thiết bị thực tế ảo (VR) và thực tế tăng cường (AR)
Trang 4C# thường được ưa chuộng hơn do tính hiệu quả và tính chất mạnh mẽcủa nó
2.1.3.Tài nguyên trực tuyến:
-Unity Asset Store cung cấp một kho tàng lớn các tài nguyên miễn phí
và trả phí, bao gồm các mô hình 3D, texture, script, và các gói assetkhác giúp tăng tốc quá trình phát triển
-Cộng đồng Unity cũng là một nguồn tài nguyên lớn, với các diễn đàn,blog, và video hướng dẫn để hỗ trợ trong việc giải quyết các vấn đề kỹthuật và tạo ra các tính năng mới.Cụ thể e đã fix được bug vòng lặp củaanimation và lỗi taskbar của input system
-Enemies: Các đối thủ hoặc quái vật mà người chơi phải đối mặt
và tiêu diệt trong suốt trò chơi
-Game Over: Màn hình hiển thị khi người chơi thất bại rồi quay lạimenu
-Hệ thống điểm số: Điểm số được tính dựa trên việc tiêu diệt đốithủ và hoàn thành các mục tiêu
Trang 52.2.3.Môi trường:
Môi trường trong trò chơi FPS thường là các bản đồ 3D được thiết
kế với các vật cản, cấu trúc và địa hình đa dạng
Các môi trường có thể là các cấp độ khác nhau như một thànhphố bị tàn phá, một cơ sở quân sự hoặc một khu rừng bí ẩn
Trong game này bản đồ của e được import trên Unity Asset Store:
fps-game-assets-for-pc-mobile-industrial-set-v3-0-101429
https://assetstore.unity.com/packages/3d/environments/industrial/rpg-2.2.4 Nhân vật:
Người chơi: Một nhân vật được điều khiển bởi người chơi(Bean player)
Trang 6Mỗi loại vũ khí có các đặc điểm và sức mạnh riêng, thích hợp cho cáctình huống chiến đấu khác nhau.
ở đây gồm 3 loại súng: akm, m416, pistol1977
II Các giai đoạn phát triển game
1.Giai đoạn 1
1.1 Tạo player và chức năng di chuyển trong Player
Player được tạo là 1 capsule gồm các component cơ bản như MeshRenderer và Capsule Colider
Trang 7Tiếp đó tạo các thao tác trong InPut Action trong folder Input để lưu cácthao tác của nhân vật
Tiếp đó generate PlayerInput Script của InputAction
PlayerInput Script này sẽ nêu lại tên của các Action
Tiếp đó tạo Script Input Manager quản lý input đầu vào của game
Trang 8Về cơ bản thì việc chuyển động của nhân vật sẽ diễn ra trong khônggian 2D
Nên trong FixedUpDate của Input manager sẽ nhập input từ bàn phímcủa người chơi và trả về là vector 2 với tọa độ lần lượt là input.x vàinput y qua đó biết được hướng của nhân vật di chuyển là hướng củavector MoveDirection Do trục y là hướng lên trong 3D map nênmoveDirection.z sẽ nhận giá trị input.y trong vector 2
Qua đó thực hiện điều khiển nhân vật qua Charracter Controller
Trang 9Đến đây em đã hoàn thành tương đối thao tác di chuyển nhân vật bằngWASD
1.2.Tiếp đó đến thao tác nhảy của Player
Bước 1: check Player còn trên mặt đất không bằng biến boolisGrounded, biến gravity và biến jumpheight
Bước 2:Kiểm tra điều kiện và để tránh cho việc vector luôn hướngxuống với tốc độ tăng dần cta thực hiện vòng if để khi đang đứng trênđất playervelocity.y chỉ bẳng 2 thay vì tăng dần như PlayerV.y +=gravity*Time.deltaTime
Bước 3: Tạo hàm Jump để tính quãng đường tối đa và Khởi tạo Jumptrong Input action Playerinput và gọi nó trong Input Manager
Trang 10Khởi tạo trong Input Manager
1.3 Thao tác nhìn xung quanh của nhân vật
Đơn giản thực hiện việc xoay góc nhìn camera (do là game gócnhìn thứ nhất nên player sẽ ở chung 1 tọa độ với camera, do đó xoaycamera chính là làm thay đổi góc nhìn của người chơi) Việc này sẽthực hiện xoay camera theo hướng trục x để nhìn ngang và trục y nhìnthẳng đứng( trục z là trục hướng di chuyển thẳng nên thao tác xoaykhông dùng tới trục này)
1.4.tương tác của người chơi
Về cơ bản bước này sử dụng rayCast từ người chơi vào khẩu súnghoặc băng đạn
Trang 12Khởi tạo đạn và hướng bắn cho đạn và tạo lực đẩy cho viên đạn
Tiếp đó tạo 1 GameObject bulletSpawn chính là điểm bắt đầu củanhững viên đạn và cung cấp vận tốc đầu bằng biến bullet Velocity vàdưới tác dụng của trọng lực do rigitbody tác dụng lên prefab bullet viênđạn sẽ có quỹ đạo cong như trong thực tế(trước đó đã được kiểm thửbằng bulletTrail component cho phép hiện rõ viên đạn qua đó cho thấyquỹ đạo của viên đạn)
Tiếp đó là add thêm hiệu ứng khi đạn gặp vào 1 vật cản sẽ tạo ra lỗ đạn
Trang 13Đầu tiên sẽ đưa hiệu ứng lỗ đạn vào PreFab và khi viên đạn bắn trúng 1đối tượng colision thì sẽ hiện hiệu ứng đó ra
2.2 Tạo vũ khí
Trang 14ở đây e tạo 3 vũ khí lần lượt là AKM,M416 và pistol
Trong đối tượng khẩu súng chưa 1 empty GameObject là BulletSpawn
là nơi mà các Bullet được bắt đầu Spawn
Trong prefab ở screen tạo 1 prefab bullet với các thuộc tính của 1viênđạn như tốc độ ban đầu trọng lượng và ảnh hưởng của viên đạn bởitrọng lực sẽ được làm bằng cách thêm Component Rigitbody vào prefabBullet
Trang 15a) Kỹ thuật RayCasting
Raycast trong Unity, nói nôm na là bắn một tia từ một ví trí A(x1,y1, z1), theo một vector hướng (x2, y2, z2), trong một khoảng cách nhấtđịnh sẽ bắn trúng một Collider tại một điểm giao nhau là hit(x3, y3, z3)
Raycast có rất nhiều ứng dụng, ví dụ như tìm đích của viên đạn,xác định vật thể sắp va chạm khi rơi, …Nhưng đó là trong môi trườnggame, còn ở bài giới thiệu này, tôi sẽ giới thiệu cách dùng Raycast đểchọn đối tượng trong game bằng cách nhấp chuột (hay chạm vào mànhình chạm) khi chơi game
Trang 16Đoạn mã trên sử dụng raycast để kiểm tra xem tia ray từ vị trí vàhướng của camera có va chạm với bất kỳ vật thể nào không, và nếu có,kiểm tra xem vật thể đó có phải là một “Interactable”(Tag củagameObject) hay không.
Trang 17Tiếp đến là các hàm thao tác với vũ khi
Sau khi add Script vào weapon thì weapon sẽ hiện ra các thuộc tính
Trang 18Đây chính là các thuộc tính mà mình đã khai báo ở trên sau đó addthêm âm thanh mỗi lần bắn qua 1 component quản lý âm thanh SoundManager(đây là 1 singleTon)
c)Thao tác nạp đạn
Các hàm nạp đạn
Hàm check xem nạp đạn đã hoàn thành thì thao tác trừ đạn
Các điều kiện để có thể reload và bắn nếu trong súng không còn đạn thì
sẽ không thể bắn được
Trang 19Phần này sẽ cần tạo 1 gameobject và script để quản lý việc đổi vũ khí
Về đơn giản script này sẽ chứa list các vũ khí ở đây hiện tại có 2 vũ khí
Và gameObject activeWeapon sẽ check xem vũ khí nào đang đượcdùng
Trang 20cách đổi vị trí của vũ khí trên tay và vũ khí đó sẽ ở vị trí của vũ khí đượcnhặt
d) Tạo hoạt ảnh cho súng và các UI cơ bản cần thiết
Điểm cốt yếu cho tính thực tế của 1 game Fps là nhờ các hiệu ứng củakhẩu súng
Hoạt ảnh tia lửa đầu nòng của 1 khẩu súng đơn giản chỉ là thêm hiệuứng nổ mỗi khi có đạn được bắn ra
Chỉ đơn giản là gọi đến gameObject muzzleEffect và play nó mỗi khichúng ta bắn
Hiệu ứng đầu nòng được tham khảo thử từ
73777
https://assetstore.unity.com/packages/vfx/particles/legacy-particle-pack-Bên cạnh đó, âm thanh cũng là thứ không thể thiếu của mỗi trò chơi Fps
để tạo sự sống động
Trong game này, em có làm những âm thanh như âm thanh reload băngđạn, âm thanh lúc không còn đạn, âm thanh lúc reload nhưng không cònđạn dự trữ
Về âm thanh mỗi lần bắn thì giống như hiệu ứng muzzleEffect.Mỗi lầnbắn vũ khí sẽ qua SoundManager đóng vai trò quản lý âm thanh của
Trang 21Animation cho súng cũng là 1 yếu tố cần thiết của game.Đây là 1 sơ đồanimation cơ bản của 1 khẩu súng e tạo gồm các trigger để kích hoạtanimation và 1 biến bool isADS để chuyển súng về dạng aim
Trang 22Tiếp đó, em bổ sung thêm UI để cho biết loại súng và loại đạn đangđược dùng
Đây là Ui cơ bản cho phép hiển thị súng dự phòng và súng đang sửdụng
Các tạo UI thì là tổ hợp của nhiều image và text-textmeshpro trong UnityViệc hiển thị các Ui ra trên màn hình sẽ do 1 GameObject ManagerHudManager quản lý
Trong script HudManager sẽ quản lý việc hiển thị ra các UI cơ bản trêne) Tạo băng đạn cho súng và thao tác nhặt đạn cho súng
Trang 23Trong game này e sẽ chỉ tạo 2 loại băng đạn của súng trường và súnglục mỗi băng đạn sẽ chứa 200 viên đạn và trong mỗi băng đạn sẽ chứascript AmmoBox để chứa thông tin và loại băng đạn
Trang 24Và cũng giống như vũ khí khi nhặt việc nhặt băng đạn cũng dùng kỹthuật RayCasting để chỉ đến băng đạn và nhặt chúng Số lượng đạn mỗibăng sẽ được thêm vào tổng số đạn hiện có của súng
Tiếp đó sẽ chỉnh lại script Weapon và hàm ReloadCompleted để trừ đạnkhi nạp đạn
f) Tạo động tác Aim cho súng
Về đơn giản chỉ là thay đổi tọa độ của súng về hướng thẳng mắt vớingười nhìn Tiếp đó trong hàm Update của script Weapon.cs
Trang 25Chúng ta thêm đoạn code sau để khi ấn giữ chuột trái để vào trạng thái aim và khi thả sẽ đưa sung về trạng thái bình thường
EnterADS và ExitADS là 2 hàm để kích hoạt animation aim và thoát animation
3.Giai đoạn 3: Tạo kẻ địch (Trong game là zombie)
Việc thiết kế địch sẽ được thiết kế bằng State Machine
3.1.Giới thiệu về State Machine
State Machine là một khái niệm quan trọng trong lập trình game và được
sử dụng rộng rãi trong Unity để quản lý hành vi của các đối tượng, đặcbiệt là các nhân vật hoặc các đơn vị AI State Machine giúp tổ chức mãnguồn một cách rõ ràng và dễ bảo trì bằng cách chia hành vi phức tạpthành các trạng thái đơn giản hơn
3.1.1.Khái niệm State Machine
State Machine (Máy trạng thái) là một mô hình toán học dùng để thiết kếcác hệ thống có hành vi phức tạp thông qua việc xác định các trạng thái
và chuyển đổi giữa chúng Một State Machine bao gồm:
Trang 26-Sự kiện (Event): Những yếu tố kích hoạt sự chuyển đổi giữa cáctrạng thái.
3.1.2.State Machine trong Unity
Trong Unity, State Machine thường được sử dụng để quản lýhành vi của các nhân vật, đặc biệt là AI Có nhiều cách để triển khaiState Machine trong Unity, từ việc viết mã thủ công cho đến việc sửdụng các công cụ và thư viện có sẵn
Cách triển khai State Machine
Sử dụng Animator Controller: Unity cung cấp sẵn công cụAnimator Controller để tạo và quản lý các State Machine cho hoạt ảnh.Điều này rất hữu ích cho việc tạo các trạng thái hoạt ảnh khác nhau chonhân vật
Tạo Animator Controller: Tạo một Animator Controller trong Unity
và liên kết nó với nhân vật của bạn
Tạo các trạng thái (State): Thêm các trạng thái vào AnimatorController, mỗi trạng thái sẽ đại diện cho một hoạt ảnh hoặc hành vi củanhân vật
Thiết lập chuyển đổi (Transition): Định nghĩa các điều kiện đểchuyển từ trạng thái này sang trạng thái khác, ví dụ như khi một biến sốbool chuyển từ false sang true
3.2 Tạo Zombie bằng State Machine
Mô hình đầy đủ của animation Zombie và các trạng thái của zombie
Trang 27Hai trạng thái mà không thể đưa và state Machine đó là trạng thái nhậndamage và trạng thái chết của zombie.Ở đây em tạo 2 trạng thái chếtkhác nhau để game đỡ bị nhàm chán
Đây là hàm xử lý và gọi animation khi zombie nhận damge và khizombie chết đồng thời cũng gọi âm thanh khi zombie nhận damge vàzombie chết
Hai trạng thái này cũng là 2 trạng thái được cơ bản của zombiecòn các trạng thái như di chuyển hoặc tấn công và đuổi theo player sẽ làcác trạng thái được làm trong state
Tuy nhiên ở đây sẽ có 1 vấn đề là zombie sẽ không ước lượngđược không gian mà mình có thể di chuyển trên map nên chúng ta sẽphải làm AI cho Zombie để cho biết không gian và zombie có thể dichuyển.Và trong Unity có 1 Registry hỗ trợ cho việc này đó làNavmeshAgent
Trang 28Tiếp đó cấu hình lại bản đồ và khoanh vũng những vùng zombie
có thể đi qua Những vùng màu xanh là nơi zombie có thể đi qua
Tới đây,quá trình chuẩn bị thiết kế zombie theo mô hình statemachine đã được hoàn thành
3,2.1.Idle State
Là trạng thái mà zombie sẽ đứng im và thực hiện animation cử độngđứng im
Trang 29Animation cho trạng thái Idle
Trang 30Animation cho trạng thái Patrolling3.2.3.Trạng thái ChaseState
Đơn giản trạng thái này khiến zombie luôn hướng về phía người chơi và
sẽ chuyển trạng thái thành tấn công nếu người chơi ở trong phạm vi tấn công và khi đã quá phạm vi đuổi thì quay lại Patrolling state
Trang 31Animation cho trạng thái Chasing State3.2.4.Attacking State
Attacking State quản lý việc tấn công của người chơi, Nếu đã quá phạm
vi tấn công thì sẽ chuyển về trạng thái Chasing Ở đây zombie sẽ luôn tì
vị trí hướng của player để chuyển hướng tấn công
Trang 32Animation cho trạng thái Attack3.2.5.Animation nhận damage, chết và damage của zombie
Về animation nhận damage và chết sẽ được tạo vào gọi qua Trigger trong animation của game khi zombie nhận damage hoặc chết
Trang 33Phần damage của zombie sẽ được khai báo trong script của zombie là zombie.cs tuy nhiên damage của zombie sẽ gây lên người chơi khi và chỉ khi tay zombie đánh trúng người chơi nên để ý chi tiết này rất quan trọng
Trang 34Trong Prefab zombie sẽ tao 1 sphare ở bàn tay zombie và script
zombieHand sẽ đóng vai trò kiểm tra sự va chạm với Player và trừ máu với mỗi lần va chạm
Cuối cùng là thêm một số âm thanh và hiệu ứng có liên quan đến
Trang 35Đơn giản sau khi chạy game sẽ Spawn ra số lượng zombie và chia theonhiều đợt tấn công Player
Giai đoạn 4 : Làm Ui cho Player và Scene cho game
4.1.Player Heathbar
Làm thanh máu cho Player (cơ bản là tạo từ image).Dưới đây là hàm khiPlayer nhận damage và sẽ trừ theo lượng máu tương ứng của nhân vật với thanh Hp(game sẽ không có cơ chế tự hồi máu và vật phẩm hồi máu)
Trang 364.2.Player Death
Khi Hp nhân vật tụt về 0 thì sẽ khiến nhân vật chế và quay camera về góc độ khiến nhân vật như đã ngã xuống và lưu điểm bằng playerPref
Trang 374.3 Tạo các Scene mới để hoàn thiện game
Trang 38Scene DirectionTới đây đa phần đã xong được 1 con game FPS với các chức năng cơ bản
III.Những điểm chưa hoàn thiện của game
1.Còn quá nhiều góc bug trên map
Trang 39Player có thể đứng trên mái nhà mà không bị zombie chạm tới
2.Chức năng nạp đạn chưa thực sự được tối ưu
3.Chuyển động của zombie còn quá cứng nhắc
4.Nhân vật có thể nhặt súng từ khoảng cách xa
IV.Các khó khăn khi hoàn thiện game
Khó khăn 1: Lần đầu tiên làm game 3D em đã gặp nhiều khó khắn tronglúc xử lý va chạm và vật lý của không gian 3 chiều
Khó khăn 2: vị trí của sung lúc chuyển trạng thái hay bị lỗi khiến em giánđoạn quá trì làm game
Khó khăn 3: Việc thiết kế các State đòi hỏi mội khoảng thời gian khá dài
để nắm vững kiến thức và thiết kế của các state
Khó khan 4: việc link các UI với các biến còn rất nhiều trở ngại vì vấn đềscale và gõ nhầm dòng lệnh khiến cái prefab bị spawn ra liên tục khiến
em phải xóa phần UI của player và code lại từ đầu