CƠ SỞ LÝ THUYẾT
Unity
Unity là một game engine miễn phí mạnh mẽ, cung cấp nhiều công cụ đa dạng cho việc phát triển game, đặc biệt phù hợp với các studio indie Nó hỗ trợ triển khai trên 27 nền tảng khác nhau, bao gồm cả Android và iOS Công cụ xây dựng game 2D của Unity nổi bật hơn so với các engine khác như Unreal Hơn nữa, tài nguyên asset và plugin phong phú, cả miễn phí và có phí, giúp mở rộng khả năng sáng tạo cho người dùng.
Unity là công cụ phát triển trò chơi đa nền tảng do Unity Technologies tạo ra, cung cấp bộ công cụ và API tiên tiến giúp đơn giản hóa quá trình phát triển trò chơi cho các nhà phát triển Ngôn ngữ chính được sử dụng trong Unity là C# và JavaScript, với các thành phần của Unity được áp dụng chi tiết trong dự án này.
GameObject: Nó là một lớp cơ sở cho tất cả các đối tượng Unity có trong trò chơi.
Component là các thành phần có chức năng riêng biệt, gán vào một hoặc nhiều Game Object, giúp bổ sung và cấu thành chức năng cho Game Object Nhờ đó, chúng ta có thể xây dựng các Game Object theo yêu cầu của game Mỗi script kế thừa từ lớp MonoBehaviour đều được xem là một component.
Lớp Resources cho phép người dùng tìm kiếm và truy cập các đối tượng, bao gồm cả assets Trong trình chỉnh sửa, bạn có thể sử dụng hàm Resources.FindObjectsOfTypeAll để xác định vị trí nội dung và đối tượng trong Cảnh Tất cả nội dung trong thư mục "Resources" có thể được truy cập từ bất kỳ đâu trong thư mục Assets thông qua các hàm.
Resources.Load Nhiều thư mục "Resources" có thể tồn tại và khi tải các đối tượng, mỗi đối tượng sẽ được kiểm tra.
Prefab cho phép người dùng lưu trữ GameObject cùng với tất cả các thành phần và thuộc tính của nó, hoạt động như một khuôn mẫu từ đó có thể tạo ra các đối tượng mới với các thuộc tính sẵn có và được đưa vào cảnh trò chơi.
Scene: Nó chứa các đối tượng của trò chơi, ví dụ mỗi cấp độ trong trò chơi là một Scene.
Camera trong đồ họa máy tính được sử dụng để hiển thị nội dung của cảnh, với hai loại phép chiếu chính: orthographic và perspective Phép chiếu orthographic thường được áp dụng trong các trò chơi 2D, nơi các đối tượng không cần chiều sâu và trông phẳng Ngược lại, phép chiếu perspective mô phỏng cách mà chúng ta nhìn thấy thế giới thực, cho phép phân biệt độ sâu và khoảng cách giữa người quan sát và các đối tượng Trong phép chiếu perspective, các đối tượng gần hơn sẽ có kích thước lớn hơn so với các đối tượng xa hơn, trong khi ở phép chiếu orthographic, tất cả đều có kích thước giống nhau bất kể khoảng cách.
Hình 2.3 Sự khác biệt giữa phép chiếu perspective và phép chiếu orthographic
Transform: Nó xác định vị trí, góc quay và tỷ lệ của từng đối tượng trong Scene Lưu ý rằng mọi GameObject đều có thành phần Transform.
RigidBody và RigidBody2D là thành phần quan trọng trong Unity, cho phép GameObject chịu tác động của trọng lực và các lực khác Chúng cũng tích hợp với các lớp Collider và Collider2D, giúp phát hiện va chạm giữa các đối tượng trong môi trường game.
Collider và Collider2D: Chúng được sử dụng để phát hiện va chạm giữa các
GameObject có thể được gán thành phần RigidBody hoặc Rigidbody2D, cho phép nó tương tác vật lý trong môi trường 2D hoặc 3D Đặc biệt, một GameObject có khả năng chứa nhiều máy va chạm, mang lại các chức năng nâng cao cho trò chơi.
Script là thành phần quan trọng trong Unity, được sử dụng để kiểm soát logic trò chơi thông qua mã Người dùng có thể viết Script bằng ngôn ngữ lập trình C# hoặc JavaScript.
Texture: Đó là một hình ảnh bitmap, có thể ở các định dạng khác nhau, chẳng hạn như PNG, BMP hoặc JPG.
Sprite là hình ảnh 2D tương ứng với mô hình 3D trong môi trường 3D, nhưng đơn giản hơn vì nó chỉ là một Texture Một Sprite có thể bao gồm nhiều phần khác nhau của cùng một đối tượng, cho phép lắp ráp trong Scene Unity và tạo ra các hoạt ảnh động cho đối tượng đó.
SpriteRenderer là một đối tượng cần thiết để kết xuất mỗi Sprite trong một Scene Nó cung cấp API đặc biệt để kiểm soát Sprite, cho phép người dùng thay đổi màu sắc và chia Sprite thành nhiều phần.
Canvas là một đối tượng đại diện cho khu vực chứa tất cả các phần tử giao diện người dùng, bao gồm menu trò chơi và thông tin liên quan đến người chơi.
LineRenderer: Nó được sử dụng để tạo và vẽ một đường nối giữa hai hoặc nhiều điểm trong không gian 2D hoặc 3D.
Tag and Name: Để xác định GameObject trong tập lệnh, mỗi đối tượng có một Tag and Name.
PlayerPrefs là một lớp tĩnh dùng để lưu trữ và truy cập tùy chọn cũng như dữ liệu của người chơi giữa các phiên trò chơi Các giá trị được lưu trữ có thể là int, float hoặc string, và trong mã, chúng được truy xuất thông qua các từ điển.
Aseprite
Aseprite là phần mềm đồ họa chuyên nghiệp, lý tưởng cho việc tạo và chỉnh sửa Pixel Art Phát triển bởi David Capello, Aseprite mang đến nhiều công cụ và tính năng độc đáo, giúp người dùng dễ dàng làm việc với hình ảnh pixel.
Với Aseprite, bạn có thể dễ dàng tạo hình ảnh pixel độc đáo và hiệu ứng chuyển động cho game, hoạt hình và các dự án sáng tạo khác Giao diện trực quan và đơn giản của phần mềm giúp bạn thao tác với các công cụ một cách hiệu quả, mang đến những nội dung pixel tuyệt đẹp.
Một số tính năng chính của Aseprite bao gồm:
● Công cụ vẽ: Bạn có thể vẽ, tô màu và chỉnh sửa các hình ảnh pixel theo ý muốn.
● Công cụ animation: Aseprite hỗ trợ tạo và chỉnh sửa các khung hình để tạo hiệu ứng chuyển động mượt mà.
Sử dụng lớp và mask là cách hiệu quả để tạo ra các hiệu ứng phức tạp, đồng thời cho phép bạn dễ dàng chỉnh sửa từng thành phần riêng lẻ của hình ảnh.
Aseprite offers tools for working with color palettes and applying dithering techniques, enabling the creation of gradient effects and sharp visuals.
Bạn có thể xuất và nhập hình ảnh cùng animation ở nhiều định dạng khác nhau như GIF, PNG, và các định dạng phù hợp cho game và ứng dụng di động.
Aseprite đã trở thành một công cụ quan trọng trong cộng đồng Pixel Art và phát triển game, nhờ vào khả năng mạnh mẽ và linh hoạt của nó Công cụ này cho phép người dùng tạo ra nội dung pixel ấn tượng và chuyển động sinh động một cách dễ dàng.
C#
C# (C sharp) là ngôn ngữ lập trình hiện đại, đơn giản và hướng đối tượng, được phát triển bởi Microsoft vào năm 2000 Ngôn ngữ này được xây dựng dựa trên nền tảng của hai ngôn ngữ mạnh mẽ là C++ và Java.
Trong các ứng dụng Windows truyền thống, mã nguồn chương trình được biên dịch trực tiếp thành mã thực thi của hệ điều hành.
Trong các ứng dụng NET Framework, mã nguồn viết bằng C# hoặc VB.NET được biên dịch thành mã ngôn ngữ trung gian MSIL (Microsoft Intermediate Language) Mã này sau đó được biên dịch bởi Common Language Runtime (CLR) để chuyển đổi thành mã thực thi cho hệ điều hành.
C# offers robust support through the NET Framework, making it easy to develop Windows Forms and WPF applications, as well as games, web applications, and mobile apps.
Microsoft Visual Studio
Hình 2.6 Microsoft Visual Studio Logo
Microsoft Visual Studio là một môi trường phát triển tích hợp (IDE) nổi tiếng của Microsoft, được biết đến như "Trình soạn thảo mã nhiều người sử dụng nhất thế giới" Nó chủ yếu được sử dụng để lập trình bằng C++ và C#, phục vụ cho việc phát triển các chương trình máy tính trên hệ điều hành Microsoft Windows, cũng như các trang web, ứng dụng web và dịch vụ web Visual Studio tận dụng nền tảng phát triển phần mềm của Microsoft, bao gồm Windows API, Windows Forms, Windows Presentation Foundation, Windows Store và Microsoft Silverlight, cho phép sản xuất cả ngôn ngữ máy và mã số quản lý.
Visual Studio hỗ trợ đa dạng ngôn ngữ lập trình, cung cấp trình biên tập mã và gỡ lỗi cho hầu hết các ngôn ngữ Các ngôn ngữ tích hợp bao gồm C, C++ và C++/CLI thông qua Visual C++.
VB.NET, C# và F# là các ngôn ngữ lập trình chính được hỗ trợ bởi Visual Studio 2010 Ngoài ra, Visual Studio còn hỗ trợ các ngôn ngữ khác như J++, J#, Python và Ruby thông qua dịch vụ cài đặt riêng Nó cũng cung cấp hỗ trợ cho XML, XSLT, HTML, XHTML, JavaScript và CSS.
Microsoft cung cấp phiên bản "Express" (đối với phiên bản Visual Studio
2013 trở về trước) và "Community" (đối với bản Visual Studio 2015 trở về sau) là phiên bản miễn phí của Visual Studio.
THIẾT KẾ VÀ PHÁT TRIỂN
Tổng quan
Shoot 'Em Up, hay còn gọi là shmup, là thể loại trò chơi điện tử trong đó người chơi điều khiển nhân vật tham gia vào các trận chiến chống lại kẻ thù Trong quá trình chơi, người chơi cần phải tránh các cuộc tấn công từ kẻ địch, bao gồm đường đạn, chướng ngại vật trên bản đồ và cả những kẻ thù đang tấn công.
Hình 3.1 Spacewar! Trên hệ máy PDP-1
Thể loại bắn súng có nguồn gốc từ trò chơi máy tính sớm nhất, Spacewar!, được phát triển vào năm 1961 tại Viện Công nghệ Massachusetts (MIT) trên máy tính PDP-1.
Trong trò chơi DEC, hai người chơi điều khiển phi thuyền vũ trụ, nỗ lực tiêu diệt một chiếc phi thuyền đối thủ bằng cách bắn đạn Đồng thời, họ cũng phải tránh bị cuốn vào trường hấp dẫn của mặt trời.
Gameplay
Tiêu diệt tất cả kẻ thù xuất hiện trên màn hình bằng cách điều khiển phi thuyền thông qua việc trượt màn hình, đồng thời kích hoạt các kỹ năng có sẵn khi không trong thời gian hồi chiêu.
Một màn chơi sẽ gồm nhiều đợt tấn công nhỏ và một đợt tấn công lớn.
Thiết kế
GameManager là đối tượng quản lý trạng thái và mục đích của Game Logic trong dự án của chúng em Đối tượng này thực hiện nhiều chức năng quan trọng, bao gồm kiểm soát trạng thái trò chơi và cập nhật các yếu tố khi bắt đầu và kết thúc màn chơi Tất cả các chức năng này được triển khai thông qua các hàm cụ thể.
● LoadStartUp: khởi động màn dạo đầu khi vào Level.
● CheckOnLoseLevel: kiểm tra trạng thái khi người chơi thua.
● CheckOnWinLevel: kiểm tra trạng thái khi người chơi thắng.
● LevelWin: thực hiện luồng khi người chơi thắng.
● LevelLose: thực hiện luồng khi người chơi thua.
Hầu hết các tập lệnh đều cần GameController cho các chức năng khác nhau.
GameController cần phải là một đối tượng Singleton, được khởi tạo ngay khi bắt đầu Level và duy trì sự tồn tại trong suốt quá trình người chơi tham gia hành động.
Background là một yếu tố quan trọng, giữ vai trò là nền cho các hoạt ảnh Nó được thiết kế để hiển thị chuyển động liên tục với tốc độ xác định, tạo cảm giác như ShipPlayer đang di chuyển.
Trò chơi được thực hiện theo cách mà Camera luôn đứng yên và mọi thứ đang thực sự chuyển động là hậu cảnh.
Hình 3.2 Code di chuyển cho background
Tất cả các lớp trong Script đều kế thừa từ lớp chung GameMonoBehaviour, giúp hạn chế lặp lại code Lớp này tạo đối tượng kế thừa hàm LoadComponent, được gọi trong các phương thức Awake và Reset để tải các Component tương ứng của GameObject vào các lớp kế thừa.
Hình 3.3 Lớp cơ sở GameMonoBehaviour
Hình 3.4 Ảnh Ship_1 Đối tượng Ship (xem Hình 3.4), là đối tượng được điều khiển bởi người chơi.
Trong trò chơi, người chơi có thể thực hiện các hành động như bắn đạn và laser, di chuyển trong không gian camera, nhặt vật phẩm, sử dụng kỹ năng và chịu sát thương Trò chơi được cấu thành từ nhiều GameObject khác nhau, mỗi GameObject sẽ bao gồm một hoặc nhiều Component Script để xử lý các chức năng tương ứng.
● Model: dùng để hiển thị hình ảnh của Ship và các hiệu ứng di chuyển cũng như hiệu ứng bắn đạn.
● Movement: Quản lý điều khiển di chuyển của đối tượng Ship.
● Shooting: Quản lý việc tấn của Ship Mỗi Ship sẽ có loại đạn tương ứng.
Cấp độ quản lý của tàu (Ship) trong trò chơi đóng vai trò quan trọng, khi cấp độ càng cao, hỏa lực của tàu sẽ mạnh mẽ hơn và số lượng đường đạn cũng tăng lên.
● Looter: Quản lý việc nhặt vật phẩm khi Ship chạm vào vật phẩm trên màn hình.
● DamageReceiver: Quản lý việc nhận sát thương Tính toán để trừ máu của phi thuyền khi trúng đạn hoặc chạm phải kẻ địch.
● Ability: Quản lý kỹ năng của Ship Ship sẽ có hai kỹ năng là Shield và PowerUp.
Tất cả các Component Script của các GameObject được quản lý bởi ShipController, lớp này chịu trách nhiệm kết nối và làm trung gian cho các Component Script của tàu Mọi tương tác giữa các Component Script phải thông qua ShipController.
Hình 3.5 Cấu trúc của ShipController
Hình 3.6 Cấu trúc chung của GameObject Ship
Lớp Ability là lớp cơ sở đại diện cho các kỹ năng mà ShipPlayer có thể thực hiện Quản lý việc kích hoạt khả năng của ShipPlayer được thực hiện bởi AbilityController Mỗi Ability sẽ có hiệu ứng và trạng thái khác nhau, và tất cả thông tin về Ability đều được lưu trữ trong thư mục Resource.
Hình 3.7 Cấu trúc của Ability Các ShipPlayer được xây dựng bao gồm:
● HealAbility: Kích hoạt qua việc nhặt vật phẩm, hiệu ứng sẽ hồi máu người chơi.
● ShieldAbility: Kích hoạt qua kỹ năng và nhặt vật phẩm, hiệu ứng tạo khiên triệt tiêu đạn của Enemy
● PowerUpAbility: Kích hoạt qua kỹ năng, hiệu ứng tăng một lượng lớn tốc độ bắn của ShipPlayer.
● Missile: Kích hoạt qua việc nhặt vật phẩm, hiệu ứng bắn một loạt lên lửa theo dõi Enemy.
3.3.6 Spawner Đối tượng Spawner chứa Component Script Spawner là một Base Class dùng để quản lý việc khởi tạo các đối tượng nhiều và liên tục trên Scene.
Spawner là một lớp áp dụng mẫu thiết kế Holder và Object Pool, giúp quản lý bộ nhớ hiệu quả Object Pool hoạt động bằng cách tự động tạo đối tượng mới khi không có sẵn hoặc sử dụng các đối tượng đã có trong pool, tối ưu hóa việc lưu trữ và tái sử dụng tài nguyên.
Dùng 3 attribute là Prefabs, Pool Object và Holder
● Prefabs: chứa các đối tượng mà sẽ được khởi tạo trong tương lai.
● Pool Objects: chứa các đối tượng bị hủy.
● Holder: Quản lý các đối tượng được khởi tạo và chưa bị hủy.
Hình 3.8 Cấu trúc Component Script của một Spawner
Các lớp kế từ lớp Spawner này bao gồm:
● BulletSpawner: Quản lý việc khởi tạo Bullet.
● ItemDropSpawner: Quản lý việc khởi tạo Item.
● EnemySpawner: Quản lý việc khởi tạo Enemy.
● FXSpawner: Quản lý việc khởi tạo FX (hiệu ứng va chạm, hiệu ứng nổ, ).
● EnemyFormationSpawner: Quản lý việc khởi tạo EnemyFormation, đội hình Enemy.
3.3.7 Despawn Đây là một Base Class Quản lý việc hủy các đối tượng, các lớp kế thừa nó triển khai lại hàm Abstract CanDespawn() để xác định điều kiện hủy Mặc định mức độ hủy là sẽ hủy hoàn toàn đối tượng Các lớp kế thừa có thể viết lại hàmDespawnObject để điều chỉnh mức độ hủy đối tượng.
Các lớp kế thừa của lớp này bao gồm lớp DespawnByDistance và DespawnByTime:
● DespawnByDistance: Quản lý việc hủy đối tượng theo khoảng cách từ đối tượng này tới đối tượng mục tiêu được chọn.
Hình 3.10 Hàm CanDespawn được triển khai trong lớp DespawnByDistance
● DespawnByTime: Quản lý việc hủy đối tượng theo thời gian.
Hình 3.11 Hàm CanDespawn được triển khai trong lớp DespawnByTime
Hình 3.12 Bullet Shuriken Đối tượng Bullet (xem Hình 3.12), là đối tượng được tạo ra bởi đối tượng BulletSpawner Là nguồn gây sát thương chính của ShipPlayer cũng như Enemy.
Nó là một GameObject được xây dựng từ nhiều GameObject khác nhau, mỗi GameObject sẽ có một hoặc nhiều Component Script để xử lý tương ứng
● Model: dùng để hiển thị hình ảnh của Bullet và các hiệu ứng di chuyển.
● BulletFly: Quản lý điều khiển hướng di chuyển của Bullet.
● Despawn: Quản lý việc hủy của Bullet.
● DamageSender: Quản lý việc gây sát thương của Bullet.
● BulletImpact: Quản lý việc xác định va chạm và truyền sát thương của Bullet sang cho đối tượng có chứa Component DamageReceiver.
Tất cả các Component Script của GameObject được quản lý bởi BulletController, lớp này chịu trách nhiệm kết nối các Component Script của Bullet Mọi tương tác giữa các Component Script đều phải thông qua BulletController để đảm bảo hoạt động hiệu quả.
Hình 3.13 Cấu trúc của lớp BullerController
Hình 3.14 Cấu trúc của GameObject Bullet
Một số các loại đạn đặt biệt sẽ có được thêm các GameObject với các Component Script tương ứng, bao gồm:
● BulletBouncy: Kế thừa từ class Bounceable Loại đạn này sẽ bị phản xạ theo một góc bằng với góc tới khi va chạm vào hai bên màn hình
● BulletMissile: Loại đạn này sẽ tự động xác định Enemy và truy đuổi.
● BulletDisperse: Loại đạn này sẽ tự động đột ngột chuyển hướng khi di chuyển một khoảng thời gian.
● BulletSeparate: Loại đạn này sẽ tự động tách ra theo số lượng tùy chọn khi di chuyển một khoảng thời gian.
Laser là đối tượng được tạo ra bằng cách sử dụng thành phần LineRenderer kết hợp với script điều khiển, được sinh ra bởi đối tượng BulletSpawner Chúng sử dụng kỹ thuật Ray Casting để tạo ra tia laser theo hướng mong muốn và kiểm tra va chạm với các đối tượng khác Khi va chạm vào hai bên màn hình, laser sẽ phản xạ theo một góc bằng với góc tới.
Chỉ có duy nhất một GameObject với Component Script tương ứng:
● DamageSender: Quản lý việc gây sát thương của Laser.
Tất cả các Component Script của các GameObject được quản lý bởi lớp BulletLaser, có nhiệm vụ xóa tia cũ và vẽ lại tia mới mỗi khi tàu (Ship) di chuyển.
Đối tượng Enemy, như được minh họa trong Hình 3.16, được tạo ra bởi EnemySpawner và là kẻ thù chính của người chơi Enemy xuất hiện trong tất cả các màn chơi và thường được sinh ra theo đội hình Đây là một GameObject được cấu thành từ nhiều GameObject khác nhau, mỗi GameObject này có thể chứa một hoặc nhiều Component Script để xử lý các chức năng tương ứng.
● Model: dùng để hiển thị hình ảnh của Enemy và các hiệu ứng.
● Despawn: Quản lý việc hủy của Enemy.
● DamageReceiver: Quản lý việc chịu sát thương của Enemy.
● Movement: Quản lý việc di chuyển của Enemy.
● EnemyBehaviour: Quản lý các hành vi của Enemy như tấn công.
Tất cả các Component Script của GameObject được quản lý bởi EnemyController, lớp này chịu trách nhiệm kết nối và làm trung gian cho các Component Script của Enemy Mọi tương tác giữa các Component Script phải diễn ra thông qua EnemyController.
Hình 3.17 Cấu trúc của lớp BullerController
Hình 3.18 Cấu trúc của GameObject Bullet Một số các loại Enemy đặt biệt sẽ có các hành vi khác nhau:
● Asteroid: Enemy vật cản, hành động duy nhất là rơi về ShipPlayer
● Boss: Kẻ thù mạnh, luôn xuất hiện ở cuối mỗi level
THIẾT KẾ CLASS
Class Diagram
4.1.4 Level and Wave Class Diagram
Hình 4.4 Level and Wave Class Diagram
Danh sách class
4.2.1 Danh sách class thuộc ShipPlayer
ShipController Chứa liên kết trung gian của các Component liên quan đến ship
ShipAbtract Một lớp trừu tượng chứa ShipController để các lớp
Component có thể kế thừa để sử dụng các thuộc tính của component khác
ShipModel Quản lý hình dạng và hoạt ảnh của Ship
ShipShootPoint Quản lý các điểm bắn dựa vào cấp độ của Ship
ShipShooting Điều khiển cách bắn đạn chính của Ship
ShipSubShooting Điều khiển cách bắn đạn phụ của Ship
DamageReceiver Lớp cơ sở quản lý việc nhận sát thương
ShipDamageReceiver kế thừa từ lớp DamageReceiver, chịu trách nhiệm quản lý việc nhận sát thương của tàu ShipMovement đảm nhiệm việc điều khiển ShipPlayer của người chơi Level là lớp cơ sở dùng để xử lý cấp độ của GameObject.
ShipLevel Kết thừa từ lớp Level để quản lý cấp độ của Ship
Bảng 4.1 Bảng danh sách class thuộc ShipPlayer
4.2.2 Danh sách class thuộc Enemy
EnemyShootingBullet Một lớp cơ sở để điều khiển cách bắn đạn loại 1
EnemyShootingBullet1 Một lớp kế thừa EnemyShootingBullet để đa dạng cách bắn loại 1 theo kiểu đa góc.
EnemyShootingBullet2 Một lớp kế thừa EnemyShootingBullet để đa dạng cách bắn loại 1 theo kiểu liên tục vòng cung.
EnemyShootingMines Một lớp cơ sở để điều khiển cách bắn đạn loại 2
DamageReceiver Lớp cơ sở quản lý việc nhận sát thương
EnemyDamageReceiver Kế thừa từ lớp DamageReceiver quản lý việc nhận sát thương của Enemy EnemyModel Quản lý hình dạng và hoạt ảnh của Enemy
EnemyAbstract Một lớp trừu tượng chứa EnemyController để các lớp
Component có thể kế thừa để sử dụng các thuộc tính của component khác
EnemyController Chứa liên kết trung gian của các Component liên quan đến Enemy
EnemyDespawn Quản lý việc hủy Enemy
Bảng 4.2 Bảng danh sách class thuộc Enemy
4.2.3 Danh sách class thuộc Bullet
BulletAbstract Một lớp trừu tượng chứa BulletController để các lớp
Component có thể kế thừa để sử dụng các thuộc tính của component khác
BulletController Chứa liên kết trung gian của các Component liên quan đến Bullet BulletDespawn Quản lý việc hủy Bullet
BulletImpact Xử lý việc va chạm của Bullet với đối tượng khác DamageSender Lớp cơ sở quản lý việc truyền sát thương
BulletDamageSender Kế thừa từ lớp DamageSender quản lý việc truyền sát thương của Bullet
BulletSeparate Loại đạn tự động tách ra theo thời gian với số lượng tùy chọn BulletDisperse Loại đạn tự động đổi hướng theo thời gian
BulletBouncy là loại đạn có khả năng phản xạ theo một góc tương đương với góc tới khi va chạm với hai cạnh của màn hình BulletFly giúp quản lý và điều chỉnh chuyển động của đạn một cách hiệu quả.
BulletLaser Tia sáng theo một hướng chỉ định, sẽ bị phản xạ theo một góc phản xạ bằng với góc tới khi va chạm với hai cạnh màn hình
BulletMissile Loại đạn tự đuổi theo mục tiêu được chỉ định sẵn
Bảng 4.3 Bảng danh sách class thuộc Bullet
4.2.4 Danh sách class thuộc Level and Wave
FormationBase Lớp cơ sở quản lý thông tin từng vị trí trong
TriangleFormation Lớp kế thừa từ lớp Formation để xây dựng Formation dạng tam giác
BoxFormation Lớp kế thừa từ lớp Formation để xây dựng Formation dạng tứ giác vuông
RadialFormation is a subclass of Formation designed to create a flexible circular formation WaveManager is responsible for managing and controlling standard enemy waves, while FormationWaveManager oversees and directs enemy waves according to specific formations.
LevelManager Quản lý và điều khiển màn chơi
Bảng 4.4 Bảng danh sách class thuộc Level and Wave
4.2.5 Danh sách class thuộc Item
ItemController Chứa liên kết trung gian của các Component liên quan đến Item
ItemAbtract Một lớp trừu tượng chứa ItemController để các lớp
Component có thể kế thừa để sử dụng các thuộc tính của component khác
ItemPickupable Quản lý việc tương tác nhặt với các đối tượng khácItemProfileSO Quản lý thông tin của Item
ItemDespawn Quản lý việc hủy của Item
Bảng 4.5 Bảng danh sách class thuộc Item
4.2.6 Danh sách class thuộc Ability
AbilityController Chứa liên kết trung gian của các Component liên quan đến Ability Ability Lớp cơ sở quản lý việc bật/tắt kỹ năng
AbilityProfileSO Chứa thông tin của kỹ năng
FireMissileAbility Kỹ năng bắn một loạt đạn theo dõi
HealAbility Kỹ năng hồi máu cho Ship
SustentiveAbility Lớp cơ sở quản lý các kỹ năng có thời gian duy trì
PowerUpAbility Kế thừa lớp SustentiveAbility, tăng tốc độ bắn và sát thương cho Ship ShieldAbility Kế thừa lớp SustentiveAbility, lá chắn triệt tiêu đạn
Bảng 4.6 Bảng danh sách class thuộc Ability
USE CASE
Sơ đồ USE CASE
Hình 5.1 Player Use Case Diagram
Hình 5.2 Enemy Use Case Diagram
Danh sách tác nhân
STT Tác nhân Mô tả/Ghi chú
1 Người chơi Phi thuyền do người chơi điều khiển Được xem như người chơi trong các use case.
2 Enemy Kẻ địch do hệ thống điều khiển
3 Event System Hệ thống quản lý event chính, hoạt động dựa trên logic game do người phát triển lập trìnhBảng 5.1 Bảng danh sách tác nhân
Danh sách USE CASE
STT Use case Mô tả/Chi chú
1 Trở về Màn hình chính Người chơi nhấn nút thoát
2 Chọn phi thuyền Người chơi ấn vào biểu tượng trên Màn hình chính và tiến hành lựa chọn phi thuyền sẽ sử dụng khi chơi
3 Chọn màn chơi Người chơi ấn vào biểu tượng trên Màn hình chính, tiến hành lựa chọn màn chơi và bắt đầu chơi
4 Xem thông tin nhà phát triển Người chơi ấn vào biểu tượng trên Màn hình chính để xem thông tin của các lập trình viên
5 Di chuyển của Người chơi Người chơi trượt ngón tay trên màn hình điện thoại để điều khiển phi thuyền di chuyển theo ý muốn
6 Sử dụng kỹ năng Người chơi ấn vào biểu tượng kỹ năng ở góc trái dưới màn hình để kích hoạt kỹ năng tương ứng
7 Gây sát thương Khi đạn của người chơi hoặc của enemy trúng đối phương và trừ máu của đối phương
8 Nhận sát thương Khi bản thân người chơi hoặc enemy bị đối phương gây sát thương và sẽ bị trừ máu
9 Nhặt vật phẩm Khi di chuyển phi thuyền chạm vào vật phẩm sẽ tiến hành nhặt vật phẩm
10 Rơi vật phẩm Khi enemy bị tiêu diệt có thể rơi ra vật phẩm
11 Di chuyển của Enemy Do hệ thống quản lý
Bảng 5.2 Bảng danh sách USE CASE
Mô tả chi tiết USE CASE
5.4.1 Trở về màn hình chính
Mô tả - Bắt đầu game khi người chơi nhấn thoát
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút thoát trong các
Yêu cầu đặt biệt Không Điều kiện trước Không Điều kiện sau Ứng dụng chuyển sang MenuScene
Bảng 5.3 Bảng mô tả chi tiết use case trở về màn hình chính
Mô tả - Người chơi vào màn hình chọn phi thuyền
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút chọn danh sách phi thuyền trong MenuScene
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang mở
- Ứng dụng đang trong MenuScene Điều kiện sau - Ứng dụng chuyển sang SelectShipScene
Bảng 5.4 Bảng mô tả chi tiết use case chọn phi thuyền
Mô tả - Người chơi vào màn hình chọn màn chơi
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút “Start” trong
2 Người chơi lựa chọn màn chơi
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang mở
- Ứng dụng đang trong MenuScene Điều kiện sau - Ứng dụng chuyển sang GamePlayScene tương ứng
Bảng 5.5 Bảng mô tả chi tiết use case chọn màn chơi
5.4.4 Xem thông tin nhà phát triển
Mô tả - Người chơi vào màn hình xem thông tin nhà phát triển
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút xem thông tin nhà phát triển trong MenuScene
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang mở
- Ứng dụng đang trong MenuScene Điều kiện sau - Ứng dụng chuyển sang CreditsScene
Bảng 5.6 Bảng mô tả chi tiết use case xem thông tin nhà phát triển
5.4.5 Di chuyển của người chơi
Mô tả - Người chơi di chuyển phi thuyền
Luồng sự kiện Luồng chính 1 Người chơi trượt trên màn hình
2 Phi thuyền bắt đầu di chuyển theo hướng chỉ định
Yêu cầu đặt biệt Không thể di chuyển ra khỏi màn hình Điều kiện trước - Ứng dụng đang mở
- Ứng dụng đang trong GamePlayScene Điều kiện sau - Vị trí của phi thuyền thay đổi
Bảng 5.7 Bảng mô tả chi tiết use case di chuyển của người chơi
Mô tả - Người chơi sử dụng kỹ năng
Luồng sự kiện Luồng chính 1 Người chơi ấn vào nút kỹ năng
2 Kỹ năng tương ứng sẽ được thi triển
Kỹ năng đặc biệt sẽ được tự động thi triển khi không còn thời gian hồi chiêu và ứng dụng đang hoạt động trong GamePlayScene.
Mở rộng Nếu sử dụng kỹ năng gây sát thương: USE
Bảng 5.8 Bảng mô tả chi tiết use case sử dụng kỹ năng
Mô tả - Người chơi hoặc enemy bắn đạn vào đối phương
Luồng sự kiện Luồng chính 1 Đạn được bắn ra tự động từ cả phi thuyền lẫn enemy
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang mở
- Ứng dụng đang trong GamePlayScene Điều kiện sau - Đạn sẽ biến mất khi bay ra khỏi màn hình mà chưa chạm vào vật cản nào
Mở rộng - Nếu đạn chạm vào enemy hoặc phi thuyền chạm phải đạn của enemy: Use Case ‘Nhận sát thương’
Bảng 5.9 Bảng mô tả chi tiết use case gây sát thương
Mô tả - Người chơi hoặc enemy bị trúng phải sát thương đối phương.
Luồng sự kiện Luồng chính 1 Enemy hoặc Người chơi bị trúng phải sát thương của đối phương
2 Chỉ số HP của đối tượng nhận sát thương giảm đi một lượng tương ứng, sau khi giảm HP > 0
Luồng phụ 1 Enemy hoặc người chơi bị trúng phải đạn của đối phương
2 Chỉ số HP của đối tượng nhận sát thương giảm đi một lượng tương ứng, sau khi giảm HP = 0
3 Nếu đối tượng nhận sát thương sau đó HP = 0 là Enemy thì Enemy sẽ bị hủy trên màn hình chơi
4 Nếu đối tượng nhận sát thương sau đó HP = 0 là Người chơi thì màn chơi kết thúc, chuyển qua GameOverScene
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang trong GamePlayScene
- Các đối tượng người chơi hoặc Enemy còn sống
- Các đối tượng người chơi hoặc Enemy bị tấn công trúng Điều kiện sau - Chỉ số HP của đối tượng nhận sát thương giảm đi một lượng tương ứng
Mở rộng khi Enemy chết có tỷ lệ xảy ra Use Case
Bảng 5.10 Bảng mô tả chi tiết use case nhận sát thương
Mô tả - Người chơi di chuyển phi thuyền chạm vào vật phẩm để nhặt
Luồng sự kiện Luồng chính 1 Vật phẩm sau khi xuất hiện sẽ từ từ di chuyển xuống
2 Người chơi di chuyển phi thuyền chạm vào vật phẩm để nhặt trước khi nó biến mất
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang trong GamePlayScene Điều kiện sau - Vật phẩm sẽ được tự động kích hoạt
Mở rộng Một số vật phẩm sẽ kích hoạt : USE
CASE ‘Sử dụng kỹ năng’
Bảng 5.11 Bảng mô tả chi tiết use case nhặt vật phẩm
Mô tả - Enemy rơi vật phẩm khi chết
Luồng sự kiện Luồng chính 1 Enemy chết
3 Vật phẩm rơi sẽ di chuyển xuống
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang trong GamePlayScene
- Enemy bị nhận sát thương bị chết Điều kiện sau - Vật phẩm rơi ra từ chỗ Enemy bị chết
Mở rộng Nếu người chơi nhặt vật phẩm bị rơi: USE
Bảng 5.12 Bảng mô tả chi tiết use case rơi vật phẩm
Mô tả - Enemy di chuyển liên tục
Luồng sự kiện Luồng chính 1 Enemy xuất hiện ở mỗi Wave
2 Enemy di chuyển lên xuống liên tục
3 Enemy di chuyển theo đội hình liên tục
Yêu cầu đặt biệt Không Điều kiện trước - Ứng dụng đang trong GamePlayScene
- Enemy phải còn sống Điều kiện sau - Enemy thay đổi vị trí
Mở rộng Nếu sử dụng kỹ năng gây sát thương: USE
Bảng 5.13 Bảng mô tả chi tiết use case di chuyển của Enemy
TỔNG KẾT
Kết quả đạt được
- Thành công xây dựng một trò chơi 2D bắn phi thuyền vũ trụ sử dụng nền tảng Unity.
- Thiết kế giao diện người dùng thân thiện.
- Triển khai hệ thống gameplay phong phú với đa dạng các loại đạn, các loại kẻ địch và màn chơi.
- Học hỏi được nhiều kiến thức về công nghệ UnityEngine cũng như các kỹ thuật lập trình hướng đối tượng.
- Tìm hiểu và áp dụng được một số mẫu kiến trúc, và triển khai nó trong lúc làm dự án.
Hạn chế
- Chưa có nhiều nét riêng biệt so với các sản phẩm khác trên thị trường.
Do thời gian thực hiện đồ án có hạn, chúng tôi không thể phát triển và hoàn thiện tất cả các tính năng cũng như yếu tố của trò chơi như mong muốn.
Chúng em đang thiếu kiến thức và kinh nghiệm trong việc phát triển trò chơi, điều này ảnh hưởng tiêu cực đến chất lượng và hiệu suất của sản phẩm.
- Vì vấn đề kỹ năng, nên đồ họa của trò chơi không thể đẹp mắt và chuyên nghiệp.
Hướng phát triển
Dự án này còn nhiều tiềm năng phát triển trong tương lai Dưới đây là một số hướng nghiên cứu tiếp theo mà có thể được thực hiện:
Để nâng cao trải nghiệm người chơi, việc mở rộng nội dung và cấp độ là rất quan trọng, bao gồm việc xây dựng thêm các cấp độ và nhiệm vụ mới Đồng thời, việc bổ sung vật phẩm và kẻ địch mới sẽ giúp tăng tính thử thách và đa dạng hóa trò chơi, tạo điều kiện cho người chơi khám phá và chinh phục những thử thách hấp dẫn hơn.
Nâng cao chất lượng đồ họa và hiệu ứng âm thanh để tạo ra trải nghiệm trực quan tốt hơn, từ đó tăng cường hứng thú cho người chơi.
Xây dựng một hệ thống lưu trữ điểm số và xếp hạng giúp người chơi dễ dàng so sánh thành tích của mình với những người khác, từ đó tạo động lực và sự cạnh tranh trong trò chơi.
Mong muốn của nhóm trong tương lai là có thể đưa trò chơi lên cửa hàng ứng dụng CHPlay.