GIỚI THIỆU CHUNG
Tổng quan đề tài
Tên đề tài: Xây dựng game 2D platform với unity
Nền tảng công nghệ: Unity Engine
Môi trường phát triển: Desktop - Windows 10
Lý do chọn đề tài
Hiện nay video game là một trong những hình thức giải trí phổ biến nhất của giới trẻ trong thời gian rảnh Do ngày nay gần như ai cũng sở hữu máy tính cá nhân và các hệ thống phân phối game rất phổ biến nên các game do những nhóm phát triển nhỏ dễ đến được tay người chơi hơn Dựa theo nhu cầu giải trí của mọi người, nhóm quyết định chọn đề tài phát triển một game 2D nhỏ.
Đối tượng sử dụng
Tất cả người chơi có độ tuổi từ 7 tuổi trở lên.
Phạm vi nghiên cứu
Phạm vi môi trường: Ứng dụng máy tính
Phạm vi thiết kế game : thể loại game platform.
● Game 2D đơn màn chơi xuyên suốt
● Một nhân vật do người chơi điều khiển với hệ thống di chuyển cơ bản - đi trái phải và nhảy – và khả năng chiến đấu cơ bản – nhấn chuột để tấn công
● Nhiều enemy NPC (quái vật) tự di chuyển và hành động theo AI được cài đặt sẵn, phản ứng theo hành vi của người chơi
● Màn chơi được thiết kế thủ công, sử dụng asset có sẵn, với độ rộng thấp
● Một menu chính khi mở ứng dụng game lên và kết thúc game với các nút cơ bản
CƠ SỞ LÝ THUYẾT
Unity Engine
Unity là một game engine đa nền tảng được phát triển bởi Unity Technologies, lần đầu tiên được công bố và phát hành vào tháng 6 năm 2005 tại Apple Worldwide Developers Conference dưới dạng game engine cho Mac OSX
Unity Engine đã dần dần được mở rộng để hỗ trợ các loại nền tảng desktop, mobile, console và Virtual Reality Nó đặc biệt phổ biến trên IOS, Android và được coi là dễ sử dụng cho người mới bắt đầu phát triển game và các nhà phát triển indie. Công cụ có thể được sử dụng để tạo ra game 3D và 2D, cũng như mô phỏng tương tác và các trải nghiệm khác Engine đã được được chấp nhận bởi các ngành bên ngoài trò chơi điện tử, chẳng hạn như phim, ô tô, kiến trúc, kỹ thuật và xây dựng
Unity cung cấp cho người dùng khả năng tạo ra game và trải nghiệm ở cả 2D và 3D, đồng thời engine cung cấp một scripting API chính trong C# bằng cách sử dụng Mono, cho cả trình soạn thảo Unity editor ở dạng plugin và bản thân các game, cũng như chức năng kéo và thả Trước khi C# trở thành ngôn ngữ lập trình chính được sử dụng trong engine, trước đây engine hỗ trợ Boo, nhưng đã bị xóa khi phát hành Unity 5 và triển khai dựa trên Boo của JavaScript được gọi làUnityScript, và không được dùng nữa vào tháng 8 năm 2017, sau khi phát hànhUnity 2017.1, để sử dụng C#
Trong các game 2D, Unity cho phép import các sprite và 2D world renderer tiên tiến Đối với game 3D, Unity cho phép đặc tả kỹ thuật texture compression,mipmap và cài đặt độ phân giải cho mỗi nền tảng mà engine hỗ trợ và cung cấp hỗ trợ cho bump mapping, reflection mapping, parallax mapping, screen space ambient occlusion (SSAO), dynamic shadows using shadow maps, render-to-texture và full- screen post-processing effects.
C#
C# (hay C sharp) là một ngôn ngữ lập trình đơn giản, được phát triển bởi đội ngũ kỹ sư của Microsoft vào năm 2000 C# là ngôn ngữ lập trình hiện đại, hướng đối tượng và được xây dựng trên nền tảng của hai ngôn ngữ mạnh nhất 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 sử dụng NET Framework, mã nguồn chương trình (C#, VB.NET) được biên dịch thành mã ngôn ngữ trung gian MSIL (Microsoft intermediate language) Sau đó mã này được biên dịch bởi Common Language Runtime (CLR) để trở thành mã thực thi của hệ điều hành.
C# với sự hỗ trợ mạnh mẽ của NET Framework giúp cho việc tạo một ứng dụng Windows Forms hay WPF (Windows Presentation Foundation), phát triển game, ứng dụng Web, ứng dụng Mobile trở nên rất dễ dàng.
Microsoft Visual Studio
Visual Studio Logo Microsoft Visual Studio là một môi trường phát triển tích hợp (IDE) từ Microsoft Microsoft Visual Studio còn được gọi là "Trình soạn thảo mã nhiều người sử dụng nhất thế giới ", được dùng để lập trình C++ và C# là chính Nó được sử dụng để phát triển chương trình máy tính cho Microsoft Windows, cũng như các trang web, các ứng dụng web và các dịch vụ web Visual Studio sử dụng nền tảng phát triển phần mềm của Microsoft như Windows API, Windows Forms, Windows Presentation Foundation, Windows Store và Microsoft Silverlight Nó có thể sản xuất cả hai ngôn ngữ máy và mã số quản lý.
Visual Studio hỗ trợ nhiều ngôn ngữ lập trình khác nhau và cho phép trình biên tập mã và gỡ lỗi để hỗ trợ (mức độ khác nhau) hầu như mọi ngôn ngữ lập trình.Các ngôn ngữ tích hợp gồm có C,[4] C++ và C++/CLI (thông qua Visual C++),VB.NET (thông qua Visual Basic.NET), C# (thông qua Visual C#) và F# (như củaVisual Studio 2010[5]) Hỗ trợ cho các ngôn ngữ khác như J++/J#, Python và Ruby thông qua dịch vụ cài đặt riêng rẽ Nó cũng hỗ trợ 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
GitHub
GitHub là một hệ thống quản lý dự án và phiên bản code, hoạt động giống như một mạng xã hội cho lập trình viên Các lập trình viên có thể clone lại mã nguồn từ một repository và Github chính là một dịch vụ máy chủ repository công cộng, mỗi người có thể tạo tài khoản trên đó để tạo ra các kho chứa của riêng mình để có thể làm việc.
Github có đầy đủ những tính năng của Git, ngoài ra nó còn bổ sung những tính năng về social để các developer tương tác với nhau Github cung cấp các tính năng social networking như feeds, followers, và network graph để các developer học hỏi kinh nghiệm của nhau thông qua lịch sử commit
GIỚI THIỆU VỀ PLATFORM GAME
Khái niệm platform game
Từ lâu, khái niệm game nhập vai hay Role-Playing Game (RPG) đã không còn xa lạ đối với nhiều người RPG đồng thời cũng đại diện cho rất nhiều dòng game nhỏ bên trong nó, chính vì thế RPG đóng vai trò là một yếu tố trong một game hơn là một thể loại cụ thể Platformer game chính là một trong số rất nhiều nhánh của RPG và game hành động với có một số quy luật chính như:
● Nhập vai vào nhân vật chính, có cốt truyện, bối cảnh xảy ra
● Thế giới của platformer game thường chịu ảnh hưởng của các định luật vật lý như: trọng lực, va chạm cơ, … chứ không đơn thuần như các game ở dạng top-down (góc nhìn từ trên xuống).
● Nhân vật chính thường có các kỹ năng nhảy, di chuyển, chạy, … mô phỏng lại các thao tác như đời thực Dùng các chuyển động đó để vượt qua các địa hình (platform) khác nhau.
Một số game tiêu biểu
Nói đến platformer game từ xưa nay thì không thể không kể đến một số game kinh điển như Super Mario Bros quen thuộc hay Castlevania Thậm chí một số platformer game còn đóng vai trò đặt nền móng cho các thể loại con sau này.
Với Mario, người chơi có thể thấy rõ yếu tố vật lý được đặt vào rất nhiều.Việc chuyển động của Mario còn trở nên phong phú hơn khi có yếu tố gia tốc.Ngoài các hành động đi và chạy thì Mario còn có cả trường hợp quay đầu sang hướng ngược lại khi đang chạy (skid) Với hành động nhảy thì Mario còn có thể điều khiển độ cao của cú nhảy Về yếu tố nhập vai thì có cả một câu chuyện phía sau mà ai cũng biết và người chơi sẽ nhập vai vào Mario để vượt qua các địa hình hiểm trở (platform), sử dụng các kỹ năng bay nhảy của mình để tiêu diệt lũ Koopa và cứu lấy công chúa.
Một game tiêu biểu khác đó là Castlevania cũng thuộc dòng platformer game. Tuy chuyển động đơn giản hơn Mario nhưng phần thiết kế map của chuỗi game Castlevania này đã để lại dấu ấn lịch sử trong ngành game và sinh ra một dòng game mới gọi là Metroidvania khi kết hợp với các cơ chế của một platformer game khác tên là Super Metroid X:
● Super Metroid X mang đến cơ chế locks and keys
● Castlevania mang đến phong cách thiết kế map interconnection
Một số phong cách thiết kế
Có rất nhiều phong cách thiết kế một game thuộc thể loại platformer Phạm vi bài báo cáo này sẽ trình bày một vài phong cách thiết kế phổ biến đã tìm hiểu.
Một trong những cách thiết kế cổ điển nhất trong thiết kế game với cốt truyện có diễn biến trên một đường thẳng có trình tự Người chơi được đưa vào một cốt truyện chính và chơi để cốt truyện diễn biến theo đúng trình tự ban đầu được nhà phát triển đưa ra Một ví dụ là game Mario có cốt truyện đơn giản là Mario đi giải cứu công chúa Toadstool và phải vượt qua các thử thách trên đường đi Điều đặc biệt ở các phiên bản Mario trước đây nằm ở việc thiết kế map luôn để Mario đi từ trái sang phải để qua màn Điều này càng thể hiện rõ tính chất tuyến tính trong thiết kế.
Khác với cách thiết kế tuyến tính, ở thiết kế phi tuyến tính cốt truyện hay gameplay thường sẽ được rẽ nhánh chứ không ép người chơi vào một đường thẳng nhất định Chính vì thế cũng tạo ra sự phong phú về mặt trải nghiệm, đồng thời cũng khó để triển khai hơn
Metroidvania là một nhánh (sub-genre) thuộc dòng game phiêu lưu hành động 2D (2D action adventure), tập trung vào sự phi tuyến tính và khả năng khám phá theo cơ chế kỹ năng-chìa khoá.
Sở dĩ Metroidvania được gọi là một nhánh (sub-genre) vì bản thân cái tên chính là danh từ ghép của 2 thể loại game khác là: Metroid và Castlevania Metroid và Castlevania bản chất lại là 2 games thuộc thể loại action adventure Tuy nhiên, do có lối thiết kế quá đặc trưng và ấn tượng nên nó đã được thừa nhận là 2 dòng game và được học tập.
Phân rã: Metroid và Castlevania
Metroid hay với tên đầy đủ của game làm nên dòng Metroid là: Super
Metroid Yếu tố cốt lõi trong cách thiết kế của dòng Metroid chính là cơ chế (mechanic) locks and keys và map được thiết kế cũng để phục vụ cho cơ chế đó.
Cơ chế locks and keys gồm các yếu tố chính sau:
● Map trong Metroid 1994 tiết lộ trước cho người chơi một số lối đi nhưng bị chặn lại bằng một cách nào đó (chướng ngại vật, vị trí quá cao không nhảy tới được, khoá cửa, ) Đây gọi là cửa.
● Khi người chơi ở thời điểm hiện tại tìm mọi cách nhưng không thể nào qua được cửa, họ sẽ ngộ ra rằng họ đang thiếu đi thứ gì đó như: kỹ năng, vật phẩm, Những thứ này gọi là chìa khoá.
Ví dụ, trong game Hollow Knight, sẽ có một số chỗ người chơi dù có cố gắng nhảy theo cách nào cũng không thể chạm được bậc khoanh đỏ trong hình dưới:
Còn Castlevania hay với tên đầy đủ của game đã làm nên dòng Castlevania là Castlevania: Symphony of the Night (là một bản nổi bật trong series Castlevania thời đó đã đánh dấu sự ra đời của dòng game Castlevania bởi lối thiết kế đặc trưng).
Hệ thống map của Castlevania: Symphony of the Night (từ giờ gọi tắt là Castlevania) gồm các đặc điểm:
● Một mạng lưới các khu vực được liên thông với nhau (được gọi bằng thuật ngữ Interconnected)
● Hệ thống map khép kín
● Mỗi khu vực được thiết kế sao cho nó liên thông với ít nhất 2 khu vực liền kề
● Có một khu vực trung tâm: ngã rẽ chung cho phép người chơi từ đây có thể rẽ sang nhiều khu vực khác
Hệ thống map với các đặc điểm như trên đảm bảo được tính chất phi tuyến tính trong trải nghiệm khám phá map của người chơi.
Ngoài ra, Castlevania còn có thêm cơ chế phụ là Teleport Cơ chế này cho phép người chơi dịch chuyển nhanh đến một khu vực đã khám phá mà không cần phải lần lại đường đi (tránh mất thời gian vô ích cũng như làm mất hứng thú trải nghiệm cái mới).
TỔNG QUAN ỨNG DỤNG
Ý tưởng game
Mở đầu game, người chơi sẽ nhập vai vào một linh hồn sống trong khu rừng xanh tươi, nơi mà linh hồn đã sống trong rất lâu và trở thành người bảo vệ của khu rừng Một ngày nọ, khu rừng bỗng trở nên bất ổn và những nguyên tố cơ bản của khu rừng bị đánh cắp bởi những thế lực đen tối.
Nhiệm vụ của người chơi là đưa những nguyên tố trở về vị trí ban đầu bằng cách đánh bại những thế lực đen tối đang cản trở Trên đường đi, người chơi sẽ phải đối đầu với các loại quái vật hung dữ, từ những con bọ cạp khổng lồ, đến những con rồng đầy sức mạnh.
Người chơi sẽ phải hoàn thành nhiều nhiệm vụ khác nhau, mỗi nhiệm vụ đều liên quan đến việc đánh bại một thế lực đen tối nào đó để khôi phục lại một nguyên tố cần thiết cho khu rừng Khi người chơi đạt được mục tiêu, họ sẽ nhận được năng lượng và kinh nghiệm để cải thiện kỹ năng của mình, mở khóa trang bị mới và phát triển linh hồn của mình.
Trong hành trình khôi phục khu rừng, người chơi còn có cơ hội khám phá những khu rừng mới, tìm thấy các trang bị và mở khóa những kỹ năng mới để đối đầu với những thế lực đen tối ngày càng mạnh mẽ hơn.
Cuối cùng, khi người chơi đánh bại được tất cả các thế lực đen tối và khôi phục lại tất cả các nguyên tố cần thiết, khu rừng sẽ trở lại trạng thái bình thường và linh hồn của người chơi sẽ tiếp tục bảo vệ khu rừng và những sinh vật trong đó.
Tính năng
- Player có thể tấn công enemy và ngược lại.
- Đối với các vòng Boss thì sẽ có vòng lặp để Player đánh với boss đến khi thắng.
- Boss và một số enemy đặc biệt có tung ra các đợt tấn công skill.
- Player có được xây dựng với các kỹ năng giúp vượt địa hình, tương tác với môi trường.
- Player có các khả năng như lướt để thu hẹp khoảng cách với Enemy, double jump để vượt địa hình.
- Khi Player bị tấn công sẽ có một khoản thời gian bất tử để tránh trường hợp va chạm liên tục với enemy hoặc các object gây sát thương và khiến player chết ngay lập tức.
- Enemy được áp dụng các thuật toán để thông minh hơn, có thể rớt vật phẩm khi bị tiêu diệt.
- Player có thể lượm các vật phẩm để tăng thông số nhân vật.
- Tính năng Pause game, Save game, Save settings.
Giới thiệu về các gameObject
Camera object do Unity Engine cung cấp với tác dụng kiểm soát màn hình người chơi (những gì người chơi thực sự thấy khi chơi game) MainCamera object trong game có nhiệm vụ theo dõi Player object, nhờ đó màn hình game luôn luôn quan sát hành động của nhân vật chính và môi trường xung quanh.
Nhân vật chính của game, là đối tượng mà người chơi có thể điều khiển và thực hiện các hành động dựa trên quy tắc của game Player có thể thực hiện tất cả mọi thứ được đề cập ở trên phần tính năng Hệ thống logic game xoay quanh object Player và cập nhật trạng thái game dựa trên object này Player object tương tác với thế giới game thông qua những script file PlayerController.cs.
Slime là enemy tấn công tầm gần và xa Chúng đuổi theo người chơi, khi người chơi và phạm vi tấn công thì chúng sẽ nhảy lên cao và đáp xuống vị trí của player để tấn công.
Bug là enemy tấn công cận chiến Chúng tiếp cận enemy bằng cách húc thẳng về phía trước với tốc độ nhanh
FlyEye là enemy bay có tấm công phạm vi rộng Chúng di chuyển cố định ở một khu vực, khi player bước vào phạm vi tấn công thì chúng sẽ tấn công bằng cách bắn ra FlyProjectile vào Player Ngoài ra nếu player tiến lại gần thì FlyEye có thể tấn công bằng cách lướt nhanh xuyên qua player PlyEye có khả năng tấn công mạnh mẽ, khả năng di chuyển tự do (bay) nhưng chúng có máu khá yếu.
RockSlug là enemy hiền lành Chúng di chuyển chậm và qua lại một nơi cố định, chúng sẽ không tấn công player tuy nhiên nếu player chạm vào nó sẽ bị gây sát thương RockSlug thường xuất hiện những nơi địa hình phức tạp để ngăn cản player vượt địa hình Lượng máu của RockSlug khá cao và phòng thủ mạnh.
Earth ruin guard là một Robot cực kỳ nguy hiểm, là enemy nắm giữ nguyên tố Đất (Earth) chứa năng lượng vô tận khiến cho những chiêu thức của Earth ruin guard có thể sử dụng liên tục Earth ruin guard có sức sát thương và phòng thủ lớn Earth ruin guard có 4 chiêu thức để tấn công player:
- Missile Attack: Earth ruin guard bắn ra 2 FlyProjectile để tấn công Player từ xa
- Spin Around: Earth ruin guard xoay 2 cánh tay đã được kéo dài xung quanh và di chuyển đuổi theo Player
- Straight hit: Earth ruin guard chạy nhanh đấm thẳng về phía Player
- Meteorite fall: Earth ruin guard ném lõi nguyên tố Đất (Earth) lên trời và giáng liên tục 2 đợt đạn FlyProjectile xuống dưới.
PlayerProjectile là đạn của người chơi bắn ra gây sát thương lên các Enemy.
FlyProjectile là đạn của Enemy bán ra gây sát thương lên Player
Non-Moving Objects là những đối tượng môi trường không thể di chuyển, không nhận sát thương và không bị phá hủy
Hệ thống xử lí các sự kiện của GameScene.
Camera object do Unity Engine cung cấp, dùng để quan sát màn hình chính
Nơi vẽ Menu chính, chứa các object con là:
● BackGround: vẽ hình nền cho màn hình Menu chính.
● Title: vẽ tựa đề Soul of Gardian of forest cho màn hình Menu chính
● Play_Button: bắt đầu trò chơi khi người chơi nhấp vào (chuyển sang màn
● hình GameScene để bắt đầu trò chơi)
● Options_Button: chỉnh sửa các cài đặt của trò chơi.
● Quit_Button: Thoát trò chơi.
● Info_Button: Xem thông tin game.
Hệ thống xử lí các sự kiện của MenuScene
ĐẶC TẢ USE CASE
Sơ đồ use case
Hình 5.1 Sơ đồ use case Player
Hình 5.2 Sơ đồ use case Slime
Hình 5.3 Sơ đồ use case RockBug
Hình 5.4 Sơ đồ use case FlyEye
Hình 5.5 Sơ đồ use case RockSlug
Hình 5.6 Sơ đồ use case Earth ruin guard
Danh sách Actor
1 Player Nhân vật chính do người chơi điều khiển Được xem như người chơi trong các use case, do hành động của người chơi tác động vào game tương tự như nhân vật.
2 Slime Là enemy tấn công tầm trung, tấn công player bằng cách nhảy lên cao và rơi xuống Có máu trung bình và tốc độ di chuyển chậm.
3 RockBug Là enemy cận chiến, tấn công bắng cách húc thẳng vào player Có máu trung bình và tốc độ di chuyển nhanh.
4 FlyEye Là enemy tấn công tầm xa, tấn công bằng cách bắn ra FlyProjectile vào enemy hoặc lướt xuyên qua player Có máu thấp và tốc độ di chuyển nhanh.
5 RockSlug Là enemy hòa bình, không tấn công enemy, chỉ gây sát thương khi player cố tình va chạm vào.
Có máu cao và di chuyển chậm
6 Earth ruin guard Là enemy dạng Boss tập trung vào tấn công sát thương Có thể đánh thường, tần công tên lửa, húc, tấn công xoay, giáng thiên thạch Có lượng máu cao, bền bĩ và sức sát thương lớn nhưng tốc độ chậm.
7 Main camera Camera quan sát người chơi
8 Event Manager 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ình
Danh sách use case
STT Use case Mô tả
1 Play Game Use case bắt đầu khi người chơi nhấn vào nút “Play” ở màn hình Main Menu và tải file save game
2 Exit Game Use case bắt đầu khi người chơi nhấn vào nút “Play” ở màn hình Main Menu
3 Pause Game Use case bắt đầu khi người chơi nhấn vào nút “Esc” trên bàn phím
5 Restart Game Use case bắt đầu khi Player chết
6 Exit to Menu Use case bắt đầu khi người chơi nhấn vào nút “Exit to Menu” trên Pause Menu
7 Move Use case bắt đầu khi người chơi nhấn một hoặc nhiều nút di chuyển “A,W,D,Space” trong
8 Dash Use case bắt đầu khi người chơi nhấn “Ctrl” trong
9 Attack Use case bắt đầu khi người chơi nhấn “left mouse” trong GamePlayScene
10 UpdateHp Use case bắt đầu khi player hoặc enemy bị tấn công và nhận sát thương
11 Take Damaged Use case bắt đầu khi player hoặc enemy nhận sát thương từ các cuộc tấn công như va chạm hay bị bắn trúng,…
12 Check Hp Use case bắt đầu khi player hoặc enemy bị tấn công và nhận sát thương để kiểm tra xem use case Dead có thể chạy hay không?
13 Dead Use case bắt đầu khi player hoặc enemy nhận sát thương và lượng máu về 0
14 Buff Use case bắt đầu khi player nhặt các item rơi ra khi đánh bại enemy
15 Interact with item Use case bắt đầu khi player chạm vào các item rơi ra khi đánh bại enemy
16 Teleport Use case bắt đầu khi người chơi nhấn vào các điểm dịch chuyển trên map
17 Check map Use case bắt đầu khi người chơi nhấn vào phím “M” trên bàn phím
18 IDLE Use case bắt đầu khi player hoặc enemy cần chuyển đổi trạng thái hoặc bắt đầu một cuộc tấn công Tất cả các hành động khác bị dừng lại
19 SeekPlayer Use case bắt đầu trong quá trình cho điểm đến cho enemy để dẫn đến bị trí hiện tại của player Use case hoạt động trong suốt quá trình tồn tại của enemy
20 Walk Use case bắt đầu khi AI chọn điểm đến cho enemy di chuyển đến, giúp enemy đến gần người chơi và tiến hành tấn công.
21 FlyEye-Fly Use case bắt đầu khi Ai chọn điểm bay đến cho enemy FlyEye giúp FlyEye di chuyển trên không trung và tấn công player từ nhiều phía
22 MeleeAttack Use case bắt đầu ki Player chạm vào phạm vi tấn công của enemy và Enemy sẽ thực hiện tấn công cận chiến đối với Player
23 RangeAttack Use case bắt đầu khi Player ở trong tầm tấn công xa và ngoài tầm tấn công cận chiến của FlyEye.
24 DashAttack Use case bắt đầu khi Player ở trong tầm tấn công cận chiến của FlyEye
25 AttackSkill Use case bắt đầu khi Player nằm trong phạm vi tấn công chiêu thức và chiêu thức của enemy trong trạng thái sẵn sàng.
26 Appear Use case bắt đầu khi Player vào phòng Boss
27 MissileAttack Use case bắt đầu khi Player vào trong phạm tấn công và chiêu thức MissleAttack ở trong trạng thái sẵn sàng
28 SpinAround Use case bắt đầu khi Player vào trong phạm tấn công và chiêu thức SpinAround ở trong trạng thái sẵn sàng
29 StraightHit Use case bắt đầu khi Player vào trong phạm tấn công và chiêu thức StraightHit ở trong trạng thái sẵn sàng
30 MeteoriteFall Use case bắt đầu khi Player vào trong phạm tấn công và chiêu thức MeteoriteFall ở trong trạng thái sẵn sàng
Bảng 5.2 Danh sách use case
Mô tả chi tiết use case
Mô tả Bắt đầu game và Tải dữ liệu từ file save game
Luồng sự kiện Luồng chính 1 Người chơi nhấn vào nút “Play” ở
2 Hệ thống load dữ liệu từ file save game
3 Chuyển sang GamePlayScene đã lưu từ trước, người chơi bắt đầu chơi game Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Game đang mở
- Người chơi đang ở màn hình Main
Menu Điều kiện sau - Người chơi chơi game
Bảng 5.3 Đặc tả use case Play game
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút “Exit Game” ở Main Menu hoặc nút “Quit Game” ở Pause Menu
2 Game tắt Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Game đang hoạt động Điều kiện sau - Ứng dụng bị tắt
Bảng 5.4 Đặc tả use case Exit game
Mô tả Tạm dừng game
Luồng sự kiện Luồng chính 1 Người chơi nhấn phím “Esc” để pause game
2 Người chơi nhấn phím “Esc” lần nữa để tiếp tục game Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Player vẫn còn sống Điều kiện sau - Game bị tạm dừng
Bảng 5.5 Đặc tả use case Pause game
Mô tả Lưu trạng thái game và settings game
Luồng sự kiện Luồng chính 1 Người chơi nhấn nút thoát game
2 Lưu game vào file sau đó thoát chương trình Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Game vẫn hoạt động Điều kiện sau - Game bị tạm dừng
Bảng 5.6 Đặc tả use case Save game
Mô tả Lưu trạng thái game và settings game
Luồng sự kiện Luồng chính 1 Player ở GamePlayScene và chiến đấu với các enemy và khiến máu trở về 0
2 Player quay lại địa điểm lưu game gần nhất Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Game vẫn hoạt động Điều kiện sau - Player quay lại địa điểm lưu game gần nhất và xóa tất cả buff kiếm được
Bảng 5.7 Đặc tả use case Restart game
Mô tả Game chuyển sang MainMenuScene
Luồng sự kiện Luồng chính 1 Người chơi nhấn phím “Erc” ở
GamePlayScene để hiện lên Pause Menu
2 Người chơi nhấn vào nút “Exit to Menu”
3 Game chuyển về MainMenuScene Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Game vẫn hoạt động Điều kiện sau - Player quay lại địa điểm lưu game gần nhất và xóa tất cả buff kiếm được
Bảng 5.8 Đặc tả use case Exit to menu
Mô tả Người chơi di chuyển nhân vật
Luồng sự kiện Luồng chính 1 Người chơi nhấn các phím “AD” hoặc các phím trái phải để di chuyển nhân vật di chuyển, nhấn phím “Space” để nhảy
2 Nhân vật bắt đầu di chuyển theo đúng hướng người chơi mong muốnLuồng phụ Không Yêu cầu đặc biệt Hướng di chuyển mà người chơi chỉ định phải không tồn tại địa hình cản trở Điều kiện trước - Game đang trong GamePlayScene Điều kiện sau - Vận tốc của Player Object thay đổi
Bảng 5.9 Đặc tả use case Move
Mô tả Người chơi điều khiển nhân vật lướt theo hướng chỉ định
Luồng sự kiện Luồng chính 1 Người chơi nhấn phím “Ctrl” + phím chỉ định hướng di chuyển để di chuyển nhân vật
2 Nhân vật di chuyển nhanh theo hướng chỉ định Luồng phụ Không
Yêu cầu đặc biệt Hướng di chuyển mà người chơi chỉ định phải không tồn tại địa hình cản trở nếu không sẽ bị cản lại Điều kiện trước - Game đang trong GamePlayScene Điều kiện sau - Vận tốc của Player Object tăng nhanh
Bảng 5.10 Đặc tả use case Dash
Mô tả Người chơi điều khiển nhân vật tấn công
Luồng sự kiện Luồng chính 1 Người chơi nhấn chuột trái
2 Nhân vật chuyển sang trạng thái tấn công và bắn ra PlayProjectile để gây sát thương lên enemy Luồng phụ Không
Yêu cầu đặc biệt Hướng di chuyển mà người chơi chỉ định phải không tồn tại địa hình cản trở nếu không sẽ bị cản lại Điều kiện trước - Game đang trong GamePlayScene Điều kiện sau - Nhân vật chuyển sang trạng thái tấn công
Bảng 5.11 Đặc tả use case Attack
Mô tả Cập nhật Hp cho player hoặc enemy
Luồng sự kiện Luồng chính 1 Player hoặc enemy được khởi tạo
2 Trong quá trình hoạt động của player hoặc enemy khi nhận sát thương thì tiến hành cập nhật lượng máu hiện có Luồng phụ Không
Yêu cầu đặc biệt - Player không ở trạng thái bất tử hoặc chết
- Enemy không ở trạng thái chết Điều kiện trước - Game đang trong GamePlayScene Điều kiện sau - Lượng máu Player và Enemy được cập nhật
Bảng 5.12 Đặc tả use case Update HP
Mô tả Player hoặc enemy nhận sát thương
Luồng sự kiện Luồng chính 1 Rigid body sẽ phát hiện collision giữa player với enemy hoặc với các đối tượng tấn công
2 Lượng máu của Player hoặc enemy sẽ được Luồng phụ Không
Yêu cầu đặc biệt - Player không ở trạng thái bất tử hoặc chết
- Enemy không ở trạng thái chết Điều kiện trước - Game đang trong GamePlayScene Điều kiện sau - Lượng máu Player và Enemy được cập nhật
Bảng 5.13 Đặc tả use case Take damaged
Mô tả Kiểm tra lượng máu của player hoặc enemy
Luồng sự kiện Luồng chính 1 Player hoặc enemy được khởi tạo
2 Trong quá trình player hoặc enemy hoạt động, khi nhận sát thương thì sẽ kiểm xem lượng máu có về 0 không?
Nếu lượng máu của player và enemy trở về 0
3 Chuyển trạng thái sang dead Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Player hoặc enemy đã được khởi tạo và hoạt động Điều kiện sau Không
Bảng 5.14 Đặc tả use case CheckHP
Mô tả Hủy các đối tượng enemy hoặc player và restart game khi HP của đối tượng trở về 0
Luồng sự kiện Luồng chính 1 HP của player hoặc enemy trở về
2 Phát dead animation của player hoặc enemy Nếu là đối tượng enemy
3 Hủy đối tượng enemy khi dead animation kết thúc
Nếu là đổi tượng player
4 Restart game Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - HP của player và enemy trở về 0 hoặc thập hơn Điều kiện sau - Hủy những đối tượng enemy mà máu trở về 0 hoặc Restart game nếu máu của player trở về 0
Bảng 5.15 Đặc tả use case Dead
Mô tả Nâng cấp các thông số player khi player nhặt các vật phẩm nâng cấp rơi ra khi đánh quái
Luồng sự kiện Luồng chính 1 Người chơi start game
2 Sau khi đánh bại toàn bộ enemy hoặc boss thì sẽ rơi ra một vài item nâng cấp
3 Player tiến lại gần và nhặt các vật phẩm
4 Vật phẩm sẽ biến mất và nâng cấp thông số của player Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Di chuyển và hành động của player không bị hạn chế
- Player đứng đủ gần để có thể tương tác với các item nâng cấp Điều kiện sau - Item nâng cấp sẽ biến mất và nâng cấp thông số của player
Bảng 5.16 Đặc tả use case Buff
Mô tả Tương tác với item nâng cấp
Luồng sự kiện Luồng chính 1 Người chơi start game
2 Sau khi đánh bại toàn bộ enemy hoặc boss thì sẽ rơi ra một vài item nâng cấp
3 Player tiến lại gần và tiến hành tương tác Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Di chuyển và hành động của player không bị hạn chế
- Player đứng đủ gần để có thể tương tác với các item nâng cấp Điều kiện sau - Item nâng cấp sẽ biến mất và nâng cấp thông số của player
Bảng 5.17 Đặc tả use case Interact with item
Mô tả Dịch chuyển đến các điểm dịch chuyển
Luồng sự kiện Luồng chính 1 Người chơi nhấn phím “m” để mở map
2 Người chơi nhấn double vào các điểm dịch trên map
3 Player sẽ được dịch chuyển đến điểm dịch chuyển Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Đang ở màn hình GamePlayScene Điều kiện sau - Player sẽ được dịch chuyển đến điểm dịch chuyển
Bảng 5.18 Đặc tả use case Teleport
Mô tả Dịch chuyển đến các điểm dịch chuyển
Luồng sự kiện Luồng chính 1 Người chơi start game
2 Người chơi nhấn phím “M” để mở map
3 Người chơi có thể sử dụng chuột trái kéo thả để có thể di chuyển map và nhấn double vào các điểm dịch chuyển để dịch chuyển Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Đang ở màn hình GamePlayScene Điều kiện sau Không
Bảng 5.19 Đặc tả use case Check map
Mô tả Thay đổi trạng thái player hoặc enemy về không hoạt động
Luồng sự kiện Luồng chính 1 Player hoặc enemy không thực hiện hành nào động nào hoặc đang chuẩn bị tấn công skill
2 Chuyển trạng thái player hoặc enemy về “IDLE”
3 Phát IDLE animation của player hoặc enemy Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Player và enemy đã được khởi tạo và đang hoạt động
Bảng 5.20 Đặc tả use case IDLE
Mô tả Tìm đường dẫn đến vị trí player
Luồng sự kiện Luồng chính 1 Xác định vị trí của enemy và player
2 Tìm con đường ngắn nhất từ enemy đến player nếu không xung đột với đối tượng khác Luồng phụ Không
Yêu cầu đặc biệt Không Điều kiện trước - Player và enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau Không
Bảng 5.21 Đặc tả use case SeekPlayer
Mô tả Enemy di chuyển xung quanh
Luồng sự kiện Luồng chính 1 Enemy kiểm tra khoảng cách từ vị trí đang đứng đến vị trí player
2 Enemy di chuyển về phía player
3 Enemy phát run animationLuồng phụ Nếu player nằm ngoài phạm vi hoạt động của Enemy
1 Enemy sẽ di chuyển ramdom xung quanh vị trí ban đầu
2 Enemy phát run animation Nếu player nằm trong phạm vi hoạt động của enemy
1 Xác định vị trí của player
2 Di chuyển đến vị trí của player
3 Enemy phát run animation Yêu cầu đặc biệt Không Điều kiện trước - Player và enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene
- Enemy không bị hạn chế di chuyển Điều kiện sau - Vận tốc FlyEye lớn hơn 0
Bảng 5.22 Đặc tả use case Walk
Mô tả Enemy di chuyển xung quanh
Luồng sự kiện Luồng chính 1 FlyEye kiểm tra khoảng cách từ vị trí đang đứng đến vị trí player
2 FlyEye di chuyển về phía player
3 FlyEye phát run animation Luồng phụ Nếu player nằm ngoài phạm vi hoạt động của FlyEye
1 FlyEye sẽ di chuyển ramdom xung quanh vị trí ban đầu
2 FlyEye phát run animationNếu player nằm trong phạm vi hoạt động của FlyEye
1 Xác định vị trí của player
2 Di chuyển đến vị trí của player
3 FlyEye phát run animation Yêu cầu đặc biệt Không Điều kiện trước - Player và FlyEye đã được khởi tạo, đang hoạt động và đang ở cùng một Scene
- FlyEye không bị hạn chế di chuyển Điều kiện sau - Vận tốc FlyEye lớn hơn 0
Bảng 5.23 Đặc tả use case Fly
Mô tả Enemy tấn công cận chiến
Luồng sự kiện Luồng chính 1 Phát MeleeAttack Animation của
2 Player take damaged Luồng phụ Nếu collider không va chạm player
Enemy Yêu cầu đặc biệt Không Điều kiện trước - Player và Enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - Enemy thực hiện tấn công cận chiến
Bảng 5.24 Đặc tả use case MeleeAttack
Mô tả FlyEye tấn công tầm xa bằng cách bắn ra đạn FlyProjectile
Luồng sự kiện Luồng chính 1 Khởi tạo đối tượng FlyProjectile
2 Gán hướng chỉ định về vị trí của player
3 Player take damaged Luồng phụ Nếu collider của FlyProjectile không trúng player
1 Khởi tạo đối tượng FlyProjectile
2 Gán hướng chỉ định về vị trí của player Yêu cầu đặc biệt - Player nằm trong tầm tấn công xa và ngoài tầm tấn công cận chiến của FlyEye Điều kiện trước - Player và FlyEye đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - FlyEye thực hiện tấn công bằng đạn FlyProjectile
Bảng 5.25 Đặc tả use case RangeAttack
Mô tả FlyEye tấn công lướt nhanh về phía player
Luồng sự kiện Luồng chính 1 FlyEye lướt nhanh về phía player
2 Player take damaged Luồng phụ Nếu collider không va chạm player
1 FlyEye lướt nhanh về phía player Yêu cầu đặc biệt - Player nằm trong tầm tấn công cận chiến của FlyEye Điều kiện trước - Player và FlyEye đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - FlyEye thực hiện tấn công bằng cách lướt nhanh qua vị trí của player
Bảng 5.26 Đặc tả use case Dash Attack
Mô tả Enemy tấn công bằng skill
Luồng sự kiện Luồng chính 1 Phát Attack Skill Animation của
3 Chuyển trạng thái skill về không sẵn sàng và đếm thời gian hồi skill Luồng phụ Nếu collider không va chạm player
1 Phát Attack Skill Animation của Enemy
2 Chuyển trạng thái skill về không sẵn sàng và đếm thời gian hồi skill Yêu cầu đặc biệt - Player nằm trong tầm tấn công của skill Enemy Điều kiện trước - Player và Enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - Enemy thực hiện tấn công skill
Bảng 5.27 Đặc tả use case Attack skill
Mô tả Earth ruin guard (BOSS) xuất hiện khi player vào phòng boss
Luồng sự kiện Luồng chính 1 Phát Appear animation của Earth ruin guard (BOSS)
2 Chuyển trạng thái Earth ruin guard (BOSS) sang “Attack” Luồng phụ Không
Yêu cầu đặc biệt - Player vào trong phòng boss Điều kiện trước - Player và Enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - Chuyển trạng thái Earth ruin guard (BOSS) sang “Attack”
Bảng 5.28 Đặc tả use case Appear
Mô tả Earth ruin guard (BOSS) tấn công skill
Luồng sự kiện Luồng chính 1 Xác định vị trí của Player
2 Khởi tạo 4 viên đạn FlyProjectile gắn vị trí của player
4 Skill missileAttack chuyển sang trạng thái không sẵn sàng và đếm thời gian hồi skill Luồng phụ Nếu collider không va chạm player
1 Xác định vị trí của Player
2 Khởi tạo 4 viên đạn FlyProjectile gắn vị trí của player
3 Skill missileAttack chuyển sang trạng thái không sẵn sàng và đếm thời gian hồi skill Yêu cầu đặc biệt - Player vào phạm vi tấn công của skill Điều kiện trước - Player và Enemy đã được khởi tạo, đang hoạt động và đang ở cùng một Scene Điều kiện sau - Earth ruin guard (BOSS) tấn công bằng skill MissileAttack
Bảng 5.29 Đặc tả use case Missile Attack
Mô tả Earth ruin guard (BOSS) tấn công skill SpinAround
Luồng sự kiện Luồng chính 1 Xác định vị trí của Player
2 Earth ruin guard (BOSS) xoay rộng 2 cánh tay robot gây sát thương xung quanh
4 Skill SpinAround chuyển sang trạng thái không sẵn sàng và đếm thời gian hồi skill Luồng phụ Nếu collider không va chạm player
1 Xác định vị trí của Player
2 Earth ruin guard (BOSS) xoay rộng 2 cánh tay robot gây sát thương xung quanh
PHÂN TÍCH THIẾT KẾ
Phân tích thiết kế
1 Health Class dùng chung để thể hiện máu của các gameobject
2 PlayerHealth Quản lý máu của nhân vật
3 EnemyHealth Quản lý máu của enemy
4 EnemyMovement class định nghĩa các phương thức, thuộc tính để điều khiển di chuyển của các đối tượng không phải người ch
5 FlyEnemyMovement Điều khiển di chuyển của kẻ địch có tên “Fly”
6 BossMovement Điều khiển di chuyển của kẻ địch có tên “Boss”
7 RockBugMovement Điều khiển di chuyển của kẻ địch có tên
8 RockSlugMovement Điều khiển di chuyển của kẻ địch có tên
9 EarthSlimeMovement Điều khiển di chuyển của kẻ địch có tên
10 VisionRange Tầm nhìn của quái để kiểm tra khi nào gặp người chơi
11 CameraManager Singleton class để quản lý camera
12 PlayerController Điều khiển hoạt động của người chơi gồm di chuyển, tấn công, nhảy.
13 AttackBehavior Quản lý các các tấn công của enemy
13 AttackBase Abstract class định nghĩa các thuộc tính, phương thức dùng chung cần thiết để enemy thực hiện tấn công
14 BossMeleeAttack Hiện thực đòn tấn công của “Boss”
15 BossAttackSkill2 Hiện thực đòn tấn công của “Boss”
15 BossAttackSkill3 Hiện thực đòn tấn công của “Boss”
16 BossAttackSkill4 Hiện thực đòn tấn công của “Boss”
17 FlyDashAttack Hiện thực đòn tấn công của “Fly”
18 FlyRangeAttack Hiện thực đòn tấn công của “Fly”
19 Tackle Hiện thực đòn tấn công tackle
Singleton quản lý quá trình save và load game
21 FileDataHandler Hiện thực việc đọc, lưu trữ gamedata sang file
22 GameData Lưu trữ data của game
Kiểu dữ liệu Mô tả
1 maxHealth Float Lượng máu tối đa
2 Health Float Lượng máu hiện tại
3 hitEffect GameObject Hiệu ứng khi đối tượng bị tấn công
4 deadEffect GameObject Hiệu ứng khi đối tượng chết
5 TakeDamage Void Hàm xử lý khi đối tượng nhận sát thương
6 Die Void Hàm xử lý khi đối tượng chết
Bảng 6.2 Chi tiết Class Health
Kiểu dữ liệu Mô tả
1 maxHealth Float Lượng máu tối đa
2 Health Float Lượng máu hiện tại
3 hitEffect GameObject Hiệu ứng khi đối tượng bị tấn công
4 deadEffect GameObject Hiệu ứng khi đối tượng chết
5 TakeDamage Void Hàm xử lý khi đối tượng nhận sát thương
6 Die Void Hàm xử lý khi đối tượng chết
Bảng 6.3 Chi tiết Class PlayerHealth
Kiểu dữ liệu Mô tả
1 maxHealth Float Lượng máu tối đa
2 Health Float Lượng máu hiện tại
3 hitEffect GameObject Hiệu ứng khi đối tượng bị tấn công
4 deadEffect GameObject Hiệu ứng khi đối tượng chết
5 TakeDamage Void Hàm xử lý khi đối tượng nhận sát thương
6 Die Void Hàm xử lý khi đối tượng chết
Bảng 6.4 Chi tiết Class EnemyHealth
Kiểu dữ liệu Mô tả
1 ani Animator Thuộc tính được unity cung cấp để quản lý hoạt ảnh nhân vật
2 attackTarget GameObject Đối tượng mà class cần tấn công
3 rb Rigidbody2d Thuộc tính được unity cung cấp để quản lý các xử lý vật lý như va chạm, di chuyển
4 canMove Bool Kiểm tra xem đối tượng có thể di chuyển không
5 stopped Bool Kiểm tra đối tượng có đứng yên không
6 noFlipping Bool Kiểm tra đối tượng có thể lật trái phải không
7 movementSpeed Float Tốc độ di chuyển
8 velocity Vector2 Vận tốc của đối tượng hiện tại
9 isOnPlatform Bool Kiểm tra xem đối tượng có ở trên platform
10 Flipping() Void Phương thức dùng để xoay đối tượng trái phải
11 NormalMovement() Void Phương thức xử lý di chuyển của đối tượng ở trạng thái bình thường.
12 CombatMovement() Void Phương thức xử lý di chuyển của đối tượng ở trạng thái tấn công.
13 SetTarget() Void Phương thức dùng để set đối tượng mà ta nên tấn công
14 ApplyGravity() Void Phương thức dùng để xử lý trọng lực
Bảng 6.5 Chi tiết Class EnemyMovement
Kiểu dữ liệu Mô tả
1 maxDisX Float Khoảng cách xa nhất cách mục tiêu theo trục X
2 minDisX Float Khoảng cách gần nhất cách mục tiêu theo trục X
3 maxDisY Float Khoảng cách xa nhất cách mục tiêu theo trục Y
4 minDisY Float Khoảng cách gần nhất cách mục tiêu theo trục Y
5 NormalMovement Void Ghi đè phương thức được kế thừa từ lớp cha
6 CombatMovement Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.6 Chi tiết Class FlyEnemyMovement
Kiểu dữ liệu Mô tả
1 TimeAppear Float Thời gian để boss xuất hiện
2 NormalMovement() Void Ghi đè phương thức được kế thừa từ lớp cha
3 CombatMovement() Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.7 Chi tiết Class BossMovement
Kiểu dữ liệu Mô tả
1 IDLETime Float Thời gian đứng yên trước khi tiếp tục di chuyển
2 NormalMovement() Void Ghi đè phương thức được kế thừa từ lớp cha
3 CombatMovement() Void Triển khai phương thức được kế thừa từ lớp cha
4 isGrounded Bool Thuộc tính dùng để kiểm tra xem đối tượng có trên mặt đất không
5 isWalking Bool Thuộc tính dùng để kiểm tra xem đối tượng có đang di chuyển không
6 rayCastLength Float Thuộc tính dùng để lưu độ dài của tia dò mặt đất
Bảng 6.8 Chi tiết Class RockBugMovement
Kiểu dữ liệu Mô tả
1 IDLETime Float Thời gian đứng yên trước khi tiếp tục di chuyển
2 NormalMovement() Void Ghi đè phương thức được kế thừa từ lớp cha
3 CombatMovement() Void Triển khai phương thức được kế thừa từ lớp cha
4 isGrounded Bool Thuộc tính dùng để kiểm tra xem đối tượng có trên mặt đất không
5 isWalking Bool Thuộc tính dùng để kiểm tra xem đối tượng có đang di chuyển không
6 rayCastLength Float Thuộc tính dùng để lưu độ dài của tia dò mặt đất
Bảng 6.9 Chi tiết Class RockSlugMovement
Kiểu dữ liệu Mô tả
1 timePrepareToJump Float Thời gian chuẩn bị để di chuyển
2 NormalMovement() Void Ghi đè phương thức được kế thừa từ lớp cha
3 CombatMovement() Void Triển khai phương thức được kế thừa từ lớp cha
4 rayCastLength Float Thuộc tính dùng để lưu độ dài của tia dò mặt đất
Bảng 6.10 Chi tiết Class EarthSlimeMovement
Kiểu dữ liệu Mô tả
1 visionRange Float Độ lớn của tầm nhìn
2 Update() Void Phương thức được unity định nghĩa, chạy liên tục mỗi frame để quét xem đối tượng đã vào tầm nhìn chưa
Bảng 6.11 Chi tiết Class Vision Range
Kiểu dữ liệu Mô tả
1 Instance CameraManager Instance của class
2 allVirtualCamera CinemachineVirtualCamera Thuộc tính được unity
[] định nghĩa, lưu trữ danh sách các đối tượng cinemachin
3 currentCamera CinemachineVirtualCamera Thuộc tính được unity định nghĩa, là instace của đối tượng camera hiện tại đang sử dụng
Thuộc tính được unity định nghĩa, là thời gian chuyển qua lại chữa 2 CinemachineVirtualCa mera
Void Phương thức xử lý việc điều khiển camera
6 PanCamera Ienumrator Phương thức xử lý việc điều khiển camera
7 SwapCamera Void Phương thức xử lý việc chuyển đổi camera
Bảng 6.12 Chi tiết Class CameraManager
Kiểu dữ liệu Mô tả
1 playerAnimator Animator Là 1 thuộc tính được unity định nghĩa, điều khiển hoạt ảnh của nhân vật
2 platformLayer LayerMask Là 1 thuộc tính được unity định nghĩa, lưu trữ danh sách các layer được coi là platform
3 Rb Rigidbody2d Là 1 thuộc tính được unity định nghĩa, là cơ thể vật lý của nhân vật
4 boxCollider Boxcollider2d Là 1 thuộc tính được unity định nghĩa, là khung va chạm của nhân vật
5 playerInputActions PlayerInputActions Là 1 thuộc tính được unity định nghĩa, xử lý thông tin bàn phím và chuột.
6 Move InputAction Là 1 thuộc tính được unity định nghĩa, lưu trữ thông tin của sự kiện move
7 meleeAttack InputAction Là 1 thuộc tính được unity định nghĩa, lưu trữ thông tin của sự kiện meleeAttack
8 Jump InputAction Là 1 thuộc tính được unity định nghĩa, lưu trữ thông tin của sự kiện jump
9 Dash InputAction Là 1 thuộc tính được unity định nghĩa, lưu trữ thông tin của sự kiện dash
10 Awake() Void Là 1 phương thức được unity định nghĩa, thực hiện các công việc sau khi khởi tạo đối tượng
11 OnEnable() Void Là 1 phương thức được unity định nghĩa, thực hiện các công việc khi đối tượng được enable
12 OnDisable() Void Là 1 phương thức được unity định nghĩa, thực hiện các công việc khi đối tượng được disable
11 Update() Void Là 1 phương thức được unity định nghĩa, liên tục được gọi mỗi frame
12 FixedUpdate() Void Là 1 phương thức được unity định nghĩa, liên tục được gọi mỗi 1 khoảng thời gian nhất định trôi qua
13 Fire() Void Phương thức thực hiện đòn tấn công
14 Jump() Void Phương thức thực hiện động tác nhảy
15 CancleJump() Void Phương thức thực hiện việc hủy động tác nhảy
16 Dash() Void Phương thức xử lý hành động lướt
17 IsGrounded() Void Phương thức để kiểm tra xem đối tượng có đang va chạm với nền đất
Bảng 6.13 Chi tiết Class PlayerController
Kiểu dữ liệu Mô tả
1 attackContainer Transform Thuộc tính được unity định nghĩa, lưu trữ các đòn tấn công của đối tượng
2 Attacks AttackBase[] Danh sách các đòn tấn công của đối tượng
3 AttackTarget Transform Mục tiêu cần tấn công
4 Animator Animator Thuộc tính được unity định nghĩa, thực hiện việc điều khiển hoạt ảnh của đối tượng
5 Attack() Void Hàm xử lý tấn công
6 ExcuteAttack() Void Hàm xử lý thực hiện đòn tấn công
7 AttackToUse AttackBase Phương thức để xử lý xem nên sử dụng đòn tấn công nào
8 SetTarget() Void Phương thức dùng để truyền vào đối tượng cần tấn công
Bảng 6.14 Chi tiết Class AttackBehavior
Kiểu dữ liệu Mô tả
1 attackCD Float Thời gian hồi chiêu
2 attackDuration Float Thời gian thực hiện đòn tấn công
3 readyToAttack Bool Thuộc tính dùng để kiểm tra xem đối tượng đã sẵn sàng tấn công chưa
4 animTrigger String Tên của hành động tấn công để xử lý hoạt ảnh
5 maxRange Float Tầm đánh tối đa
6 minRange Float Tầm đánh tối thiểu
7 noRange Bool Thuộc tính để kiểm tra thuộc tính này có tầm đánh không
8 startWithCD Bool Thuộc tính dùng để kiểm tra xem có thời gian hồi chiêu khởi đầu không
9 IsInRange(float ) Bool Phương thức để kiểm tra đối tượng cần tấn công có trong tầm đánh không
10 CanExcuteAttack() Bool Phương thức dùng để kiểm tra xem có thể thực hiện đòn tấn công này hay không
11 ExcuteAttack() Abstract void Phương thức trừu tượng để thực hiện đòn tấn công
12 AttackCD() Ienumrator Phương thức để xử lý thời gian hồi chiêu
Bảng 6.15 Chi tiết Class AttackBase
Kiểu dữ liệu Mô tả
1 countState Int Trạng thái của đòn tấn công
2 Speed_X_Boss float Tốc độ di chuyển của boss
3 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.16 Chi tiết Class BossMeleeAttack
Kiểu dữ liệu Mô tả
1 countState Int Trạng thái của đòn tấn công
2 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.17 Chi tiết Class BossAttackSkill2
ST Thuộc tính / Phương Kiểu dữ liệu Mô tả
1 countState Int Trạng thái của đòn tấn công
2 shootPoint Vector3 Tọa độ của nơi thực hiện đòn tấn công
3 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
4 Projectile GameObject Instance của loại đối tượng mà boss sẽ bắn ra
Bảng 6.18 Chi tiết Class BossAttackSkill3
Kiểu dữ liệu Mô tả
1 countState Int Trạng thái của đòn tấn công
2 shootPoint Vector3 Tọa độ của nơi thực hiện đòn tấn công
3 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
4 Projectile GameObject Instance của loại đối tượng mà boss sẽ bắn ra
Bảng 6.19 Chi tiết Class BossAttackSkill4
Kiểu dữ liệu Mô tả
1 movSpeed Float Tốc độ di chuyển của khi tấn công
2 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.20 Chi tiết Class FlyDashAttack
ST Thuộc tính / Phương Kiểu dữ liệu Mô tả
1 shootPoint Vector3 Tọa độ của nơi thực hiện đòn tấn công
2 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
3 Projectile GameObject Instance của loại đối tượng mà boss sẽ bắn ra
Bảng 6.21 Chi tiết Class FlyRangeAttack
Kiểu dữ liệu Mô tả
1 movSpeed Float Tốc độ di chuyển của khi tấn công
2 ExcuteAttack() Void Triển khai phương thức được kế thừa từ lớp cha
Bảng 6.22 Chi tiết Class Tackle
Kiểu dữ liệu Mô tả
2 fileName String Tên của file lưu trữ
3 gameData GameData Instance của class
4 fileDataHandler FileDataHandler Instance của class
5 SaveGame() Void Phương thức xử lý sự kiện save game
6 LoadGame() Void Phương thức xử lý sự kiện load game
7 ReLoadGame() Void Phương thức xử lý sự kiện reload game
8 NewGame Void Phương thức xử lý sự kiện new game
Bảng 6.23 Chi tiết Class DataPersistanceManager
Kiểu dữ liệu Mô tả
1 dataDirPath String Địa chỉ của file lưu trữ
2 dataFileName String Tên của file lưu trữ
3 useEncryption Bool Thuộc tính dùng để kiểm tra xem có sử dụng mã hóa không
4 encryptionCodeWord Bool Từ dùng để mã hóa
Bảng 6.24 Chi tiết Class FileDataHandler
Kiểu dữ liệu Mô tả
1 PlayerPosition Vector3 Vị trí của người chơi hiện tại
2 playerHealth Float Lượng máu hiện tại của người chơi
3 GameData() Phương thức khởi tạo
Bảng 6.25 Chi tiết Class GameData
State diagram
Hình 6.2 Sơ đồ state của Player
Bảng 6.26 Chuyển đồi state của Player
Hình 6.3 Sơ đồ state của Boss
Bảng 6.27 Chuyển đổi state của Boss
Hình 6.4 Sơ đồ state của Slime
Bảng 6.28 Chuyển đổi state của Slime
Hình 6.5 Sơ đồ state của RockSlug
Bảng 6.29 Chuyển đổi state của RockSlug
Hình 6.6 Sơ đồ state của RockBug
Bảng 6.30 Chuyển đổi state của RockBug
Hình 6.7 Sơ đồ state của FlyEye
Bảng 6.31 Chuyển đổi state của FlyEye
Thiết kế UI
- Làm giao diện người dùng nhất quán, dễ sử dụng
- Vô hiệu hóa các chức năng theo ngữ cảnh
- Sử dụng màn hình hiệu quả
Hình 6.8 UI Main menu screen
Người dùng sẽ vào Main menu Screen đầu tiên khi chạy game Main menu Screen có: 1 image làm background, 1 text object làm title, 4 buttons: Play game button, Options game button, Exit game button, info game button.
- Nhấn nút “Play game”: Tải file save game và chuyển sang GamePlayScene
- Nhấn nút “Options”: Mở Settíngs menu
- Nhấn nút “Exit game”: Thoát game
- Nhấn nút “Info game”: Hiện thông tin game
Settings menu giúp thay đổi những cài đặt của game Settings menu có 3 text object làm settings title(language, damegedvalues, sound), 5 buttons: left language button, right language button, Settíngs button, Controls button, Back button, 1 toggle button: enableDamgeValue buton, 1 slider: sound slider,
- Nhấn nút “left language”: đổi ngôn ngữ
- Nhấn nút “right language”: đổi ngôn ngữ
- Nhấn nút “enableDamgeValue”: thay đổi cài đặt hiện hoặc không hiên giá trị sát thương
- Kéo thả slider “Sound”: tăng/ giảm âm lượng
- Nhấn nút “Controls”: mở Controls menu
- Nhấn nút “Back”: quay lại Main menu
Controls menu chứa cài đặt về điều khiển player Controls menu có: 7 text object để hiện control title, 10 button: 7 ControlSetting button cài đặt điều khiển nhân vật, Settíngs button, Controls button, Back button.
- Nhấn vào các nút ControlSetting và nhấn phím bất kỳ trên màn hình: phím điều khiển sẽ thay đổi thành phím vừa cài đặt
- Nhấn nút “Settíngs”: mở Settings menu
- Nhấn nút “Back”: quay lại Main menu
Pause menu chứa những lựa chọn khi người chơi tạm dừng game Pause menu có: 1 text object làm title, 3 button: Resume button, BacktoMenu button, Quit game button.
- Nhấn nút “Resume”: Tiếp tục game
- Nhấn nút “BacktoMenu”: Chuyển về màn hình MainMenu
- Nhấn nút “Quit Game”: Thoát game
Hình 6.12 UI Player's health bar
Player’s health bar chứa các heart object thể hiện lượng Hp của player
Hình 6.13 UI Enemy's health bar
Enemy’s health bar là một thanh hình chữ nhật màu đỏ thể hiện lượng Hp của player
CÀI ĐẶT VÀ KIỂM THỬ
Môi trường cài đặt và kiểm thử
Môi trường nhóm đã cài đặt và kiểm thử: Windows 10 Để kiểm tra và quản lí source code, cần có Unity Editor, launch qua Unity Hub, hướng dẫn cài đặt theo link sau: Unity - Manual: Installing Unity using the Hub (unity3d.com) Để chạy thử game, tải file DungeonEscape.zip qua link GitHub của đồ án: https://github.com/Moonbanner/Dungeon_Escape_Game
Kết quả kiểm thử
Tính năng Mức độ hoàn thiện
Bảng 7.1 Kết quả kiểm thử
HƯỚNG PHÁT TRIỂN
Các Công nghệ tiêu biểu sử dụng trong quá trình phát triển
[2] Blender: https://www.Blender.org/
[3] Visual Studio: https://visualstudio.microsoft.com/
Tài liệu hướng dẫn ngôn ngữ lập trình
[4] C# Doc: https://learn.microsoft.com/en-us/dotnet/csharp/
[5] UnityDoc: https://docs.unity3d.com/Manual/index.html
Tài liệu và code mẫu tham khảo trong quá trình xây dựng hệ thống và logic trò chơi
[6] UnityForum: https://forum.unity.com/
[7] SaiChannel: https://www.youtube.com/@SaiGame/featured