Trong thế giới đầy sắc màu của lập trình game, Unity không chỉ là một công cụ; nó là một cánh cửa mở ra vô số khả năng sáng tạo. Khi nói đến việc phát triển game 2D, Unity trở thành người bạn đồng hành không thể thiếu, cung cấp một nền tảng mạnh mẽ để biến những ý tưởng tưởng chừng như không thể thành hiện thực. Tiểu luận này không chỉ là một hành trình qua các dòng mã, mà còn là một cuộc phiêu lưu qua các quy trình sáng tạo, từ việc hình thành ý tưởng ban đầu cho đến khi sản phẩm cuối cùng được hoàn thiện. Chúng ta sẽ khám phá cách Unity giúp chúng ta tạo ra các thế giới 2D sống động, những nhân vật đáng yêu, và những trải nghiệm game đầy thú vị. Với mục tiêu không chỉ giới thiệu về Unity như một công cụ lập trình, tiểu luận này còn mong muốn truyền cảm hứng cho những người đam mê lập trình game, những người sẵn sàng đặt bút xuống và bắt đầu hành trình sáng tạo của riêng mình. Hãy cùng nhau bắt đầu cuộc hành trình này, và xem nó sẽ đưa chúng ta đến đâu. Mặc dù chúng em đã cố gắng hoàn thành tiểu luận trong phạm vi và khả năng cho phép, nhưng chắc chắn sẽ không tránh khỏi những thiếu sót, kính mong sự cảm thông và nhận được phản hồi của quý thầy cô và các bạn.
GIỚI THIỆU
Lý do chọn đề tài
Nắm bắt được xu hướng phát triển tiềm năng của lập trình game cùng với niềm đam mê về game, nhóm em quyết định chọn đề tài “Thiết kế và lập trình game2D The Jungle: DarkLand sử dụng Aseprite và Unity” nhằm giúp chúng em tìm hiểu kỹ hơn về lập trình game nói chung.
Mục tiêu đề tài
Hệ thống game “The Jungle: DarkLand” sẽ là một tựa game 2D, RPG hành động theo góc nhìn top-down phát triển bởi Unity.
Yêu cầu đối với sản phẩm:
Dung lượng game không quá lớn, tốc độ xử lý nhanh.
Giao diện thân thiện người dùng.
Tính toán dữ liệu game phải chính xác, không chấp nhận sai sót.
Phương pháp nghiên cứu
Xây dựng hệ thống game theo mục tiêu đã đặt ra.
Phân tích, thiết kế hệ thống sao cho phù hợp.
Bố cục đề tài
Phần còn lại của báo cáo Tiểu luận này được tổ chức như sau:
Chương 2 trình bày về cơ sở lý thuyết các công cụ để làm nên đề tài này.
Trong chương 3, chúng em sẽ trình những phân tích chi tiết để hoàn thiện đề tài này Phân tích những thành phần của game, gameplay, cơ chế game,… các chức năng chính của game Từ đó giúp cho việc phát triển và hoàn thiện đề tài sẽ không bị lệch hướng và dễ dàng hơn.
Chương 4 trình bày về sản phẩm cuối cùng của đề tài này, bên cạnh đó là vạch ra lộ trình phát triển tiếp theo để sản phẩm trở nên hoàn thiện hơn.
CƠ SỞ LÝ THUYẾT
Tổng quan về Game Engine
Game engine hay còn được gọi là Phần mềm game, là một phần mềm dùng để xây dựng và thiết kế một trò chơi điện tử (video game) Hình dung một cách đơn giản, game engine cung cấp cho các nhà làm game những nguyên liệu cơ bản để từ đó họ sẽ dễ dàng hơn trong việc phát triển game của mình
Một game engine thông thường bao gồm kết xuất đồ họa cho các hình ảnh2D hay 3D, công cụ vật lý, hoạt hình, trí tuệ nhân tạo cho những nhân vật trò chơi,phân luồng, tạo dòng dữ liệu xử lý, quản lý bộ nhớ, dựng ảnh đồ thị, Từ 1 game engine có thể phát triển ra rất nhiều các game khác nhau Đây là giải pháp tiết kiệm nhiều thời gian và chi phí cho các nhà sản xuất.
Tổng quan về Unity Engine
Unity Engine là một game engine được phát triển bởi Unity Technologies. Đây là một công cụ phát triển game đa nền tảng Ra mắt lần đầu năm 2005 tại sự kiện Apple’s Worldwide Developer Conference bởi nhà sáng lập David Helgason, cho đến nay, Unity đã hoàn thiện hơn rất nhiều về nhiều mặt Năm 2014 Unity thắng giải “Best Engine” tại giải UK’s annual Develop Industry Exellence. Điểm mạnh của Unity:
Hỗ trợ đa nền tảng: Unity có khả năng phát triển game trên nhiều hệ điều hành và thiết bị khác nhau.
Dễ sử dụng: Unity cung cấp môi trường phát triển tích hợp, hỗ trợ cả lập trình viên không chuyên và studio chuyên nghiệp.
Chức năng cốt lỗi đa dạng: Unity cung cấp công cụ cho đồ họa 2D và 3D, vật lý, âm thanh, trí tuệ nhân tạo, quản lí bộ nhớ và kết nối mạng.
2.2.2 Các thành phần cơ bản trong Unity
Asset: là tất cả những tài nguyên được sử dụng trong quá trình phát triển game, những tài nguyên bao gồm hình ảnh, âm thanh, mô hình 3D, hiệu ứng, chất liệu (material), script hay cả một project.
Scene: là khoản không gian làm việc của game developer nơi mà có thể sắp xếp và quản lí tất cả các đối tượng trong game Mỗi một scene có thể được xem là một cấp độ chơi hoặc một màn chơi riêng biệt.
Game Object: khi kéo một phần tử từ trong Asset vào trong Scene, chúng sẽ được xem là một Game Object Tất cả các Game Object đều có chứa ít nhất là Transform, lưu thông tin về vị trí, góc quay và tỉ lệ của Game Object.
Thành phần (Component) là những khối xây dựng cơ bản trong Unity, mỗi khối có chức năng cụ thể Chúng cho phép chúng ta tạo các Đối tượng trò chơi (Game Object) bằng cách thêm và kết hợp các thành phần này theo ý muốn Ví dụ: thành phần Biến đổi (Transform) điều khiển vị trí, xoay và tỷ lệ của đối tượng, trong khi thành phần Vật lý (Physics) xử lý các tương tác vật lý như va chạm.
Script: là một loại Component đặc biệt do lập trình viên tự định nghĩa nên.
Chức năng chính của Script là miêu tả những thứ mà người lập trình viên muốn cho Unity hiểu Cho phép lập trình viên tạo ra hành động và tủy chỉnh cho các đối tượng trong game.
Prefab: là một Game Object được lưu trữ lại để tái sử dụng Các Object được tạo ra từ Prefab sẽ giống hoàn toàn với bản gốc.
Tổng quan về công cụ thiết kế hình ảnh game 2D Aseprite
Aseprite là một phần mềm chuyên dụng được thiết kế để tạo và chỉnh sửa pixel art Được phát triển bởi David Capello, Aseprite nổi tiếng với giao diện người dùng thân thiện và các tính năng tối ưu cho việc tạo ra nghệ thuật pixel độc đáo và chất lượng.
Với giao diện người dùng đơn giản và trực quan, Aseprite là một công cụ lý tưởng cho các nghệ sĩ pixel art và nhà phát triển game Tính năng đa nền tảng của nó cũng đảm bảo rằng người dùng có thể sử dụng phần mềm trên nhiều hệ điều hành khác nhau
Aseprite có giao diện thiết kế đồ họa thân thiện và dễ sử dụng.
Cung cấp cho người thiết kế một bảng màu phong phú.
Aseprite có một trình quản lý các layer dễ sử dụng để quản lý các đối tượng và tạo animation cho hình ảnh.
Là một công cụ mãnh mẽ và linh hoạt với nhiều tính năng, công cụ hỗ trợ giúp tạo ra một bức ảnh pixel art độc đáo và ấn tượng.
PHÂN TÍCH VÀ XÂY DỰNG SẢN PHẨM GAME
Tổng quan trò chơi
Game Identity / Mantra: “The Jungle: DarkLand” là tựa game phiêu lưu hành động 2D top-down nói về một con dơi đột biến truy tìm và tiêu diệt kẻ đang tàn phá khu rừng
Design Pillars: Hành động, phiêu lưu, nhập vai
Art style: “The Jungle: DarkLand” sẽ mang phong cách đồ họa pixel tối giản hóa, hình ảnh đơn giản nhưng chất lượng Game sẽ mang tông màu hơi nhạt nhòa, đem lại cho người chơi ấn tượng về một khu rừng cổ xưa không còn nhiều sức sống.
Không khí trò chơi nhẹ nhàng không quá u ám.
Khởi đầu trong một khu rừng đầy sức sống, mọi chuyện khủng khiếp bắt đầu khi dòng suối bị nhiễm chất thải phóng xạ Từ đây các sinh vật trong khu rừng bắt đầu biến đổi và trở nên hung tợn hơn, chúng tấn công lẫn nhau, tàn phá khu rừng.
Trong số đó, một con quái vật đã đột biến và trở thành thủ lĩnh của phần còn lại Nhân vật chính là chú dơi xanh là một ngoại lệ, đã đột biến và có ý thức như con người Nhận thấy được sự tàn phá khủng khiếp của tên trùm, dơi xanh đã quyết định truy tìm và tiêu diệt hắn để bảo vệ những sinh vật chưa bị đột biến cũng như đi tìm nguyên nhân khu rừng bị biến đổi.
Quy tắc: Người chơi điều khiển chú dơi đột biến, đánh nhau với quái vật, thu thập chìa khóa mở đến màn chơi cuối cùng Nếu bị kẻ định đánh trúng người chơi sẽ mất máu, đến khi hết máu người chơi sẽ chết và hồi sinh lại tại nhà chính.
Mục tiêu: Thu thập 6 chìa khóa sau đó tiêu diệt Boss cuối.
Trải nghiệm người chơi: đồ họa, màu sắc, những màn combat tạo nên một trải nghiệm thú vị và hấp dẫn.
3.1.4 Cơ chế của trò chơi Hệ thống di chuyển:
Ngưới chơi di chuyển theo 4 hướng cơ bản: trên, dưới, trái, phải.
Ngoài ra có thể di chuyển theo hướng xéo: trên trái, trên phải, dưới trái, dưới phải.
Người chơi có 1 kĩ năng lướt nhanh.
Nhân vật chính sẽ có map nhà riêng để trồng cây giúp hồi máu.
Cây sẽ gồm 2 loại: lúa và cà chua.
Nhà của nhân vật chính chỉ có 4 vùng để trồng cây.
Nhân vật chính có thể tấn công cận chiến và bắn xa.
Mỗi đòn cận chiến trúng địch sẽ hồi 1 năng lượng cho bắn xa.
Tối đa 4 năng lượng bắn xa.
Sẽ có 6 chìa khóa được giấu trong map.
Người chơi sẽ đi tìm gợi ý về chỗ giấu chìa khóa.
Thu thập đủ 6 chìa khóa sẽ mở được cánh cổng cho màn đánh Boss cuối cùng.
Hệ thống chuyển cảnh màn hình:
Sẽ có 3 bản đồ chính: nhà của người chơi, khu vực rừng rậm, khu vực đánh Boss.
Khi di chuyển qua mỗi bản đồ thì sẽ chuyển màn hình.
Hệ thống túi đồ của nhân vật:
Túi đồ sẽ chứa tối đa 10 ô chứa.
Mỗi ô chứa có thể chứa được tối đa 4 vật phẩm.
Khi hết ô chứa sẽ không thể nhặt thêm vật phẩm.
Các phím “W”, “A”, “S”, “D”: điều khiển di chuyển của nhân vật.
Phím “Space”: thực hiện hành động né tránh.
Chuột trái: tấn công cận chiến.
Chuột phải: tấn công tầm xa.
Phím “Tab”: mở túi đồ (inventory).
Người chơi sẽ khám phá một thế giới có phần nhạt nhòa nhưng không quá u ám.
Nhà của người chơi là nơi hồi sinh nếu nhân vật tử trận, không có kẻ thù và có các mảnh đất để người chơi có thể trồng cây.
Khu vực giấu chìa khóa: khu vực này là một khu rừng giấu 6 chìa khóa tại những vị trí cố định, nơi đây sẽ xuất hiện những kẻ địch để gây tính thách thức cho người chơi vượt qua để đi tìm chìa khóa.
Khu vực đánh Boss: đây là khu vực cuối cùng của game, khi người chơi tìm đủ 6 chìa khóa thì mới được đi đến khu vực này Tại đây người chơi sẽ đánh nhau với một con Boss và nếu thắng thì sẽ kết thúc game.
3.1.7 Nhân vật và kẻ địch
Người chơi (nhân vật chính của game) có thể thực hiện các hành động sau:
Tấn công cận chiến, tấn công tầm xa, lướt để tránh đòn tấn công, di chuyển 4 hướng trên bản đồ Người chơi có 10 máu, khi bị tấn công sẽ mất 1 máu, khi hết máu sẽ cho người chơi spawn lại vị trí ban đầu và mất hết vật phẩm.
Kẻ địch (quái vật) gồm 2 loại quái vật:
Goblin: quái vật tấn công tầm gần, khi phát hiện người chơi ở một khoảng cách gần Goblin sẽ di chuyển lại và tấn công người chơi.
Eagle: quái vật tấn công tầm xa, khi phát hiện người chơi ở khoảng cách xa Eagle sẽ bắn đạn về phía người chơi.
Quái vật trùm cuối (Boss) gồm 1 kĩ năng đặc biệt: Kĩ năng kĩ năng bắn đạn với sát thương cực lớn, Boss sẽ rất mạnh khiến cho người chơi phải tấn công nhiều lần kết hợp né tránh mới có thể chiến thắng.
3.1.8 UI Màn hình bắt đầu game sẽ gồm các UI sau:
Tên game: “The Jungle: DarkLand”.
Nút chơi mới: khi bấm vào sẽ reset trò chơi và bắt đầu một màn chơi mới.
Nút thoát game: khi bấm vào sẽ thoát trò chơi.
Màn hình chính của game gồm các UI sau:
Thanh máu của người chơi nằm ở góc trái trên của màn hình: 10 stack đại diện cho số lần có thể bị tấn công của người chơi.
Thanh năng lượng của người chơi nằm ở phía dưới thanh máu: 4 stack đại diện cho 4 lần bắn xa.
Nút túi đồ của người chơi khi hiện lên sẽ nằm ở chính giữa màn hình.
Khi người chơi bị tấn công chết thì sẽ hiển thị “YOU ARE DEAD”, Button
Phân tích hệ thống game
Bảng 3.1 Các tác nhân của hệ thống
STT Tác nhân Ý nghĩa, nhiệm vụ của Actor
1 Truy cập vào game, thực hiện các chức năng trong game như: điều khiển nhân vật, nhặt vật phẩm,…
Bảng 3.2 Các chức năng chính của game
STT Tên chức năng Mô tả
1 Điều khiển nhân vật di chuyển
Khi người chơi nhấn vào các nút “A W S D” hoặc các nút mũi tên hệ thống sẽ xác nhận input, sau đó sẽ thực hiện thay đổi tọa độ nhân vật chính.
2 Điều khiển nhân vật tấn công
Khi người chơi nhấn vào nút trái chuột, hệ thống sẽ nhận input và thực hiện hành động tấn công của nhân vật.
3 Spawn kẻ địch Khi người chơi nhấn nút bắt đầu game, hệ thống sẽ chuyển sang màn hình chính của game, sau đó sẽ spawn quái tại cái vị trí đã được đặt trước.
Kẻ địch trong game sẽ tự động phát hiện người chơi Sau đó, dựa vào vị trí của mình, chúng sẽ tính toán hướng di chuyển tối ưu để tiếp cận người chơi Cuối cùng, kẻ địch sẽ thực hiện đòn tấn công sau một khoảng thời gian được xác định trước.
5 Túi đồ của người chơi
Người chơi sẽ có hệ thống túi đồ để nhặt vật phẩm cần thiết trong trò chơi, khi túi đầy sẽ không thể thêm vật phẩm nữa.
Hình 3.1 Biểu đồ Use-case
3.2.4 Biểu đồ lớp (Class Diagram)
3.2.5 Biểu đồ hoạt động (Activity Diagram)
Chức năng Điều khiển nhân vật di chuyển:
Hình 3.3 Activity diagram – Điều khiển nhân vật di chuyển
Chức năng Điều khiển nhân vật tấn công:
Hình 3.4 Activity diagram – Điều khiển nhân vật tấn công
Chức năng Spawn kẻ địch khi bắt đầu game:
Hình 3.5 Activity diagram – Spawn kẻ địch khi bắt đầu game
Chức năng nhặt vật phẩm khi người chơi chạm vào:
Hình 3.6 Activity diagram – Nhặt vật phẩm khi người chơi chạm vào
3.2.6 Biểu đồ trạng thái (State Diagram)
Chức năng điều khiển nhân vật di chuyển:
Hình 3.7 State diagram – Điều khiển nhân vật di chuyển
Chức năng điều khiển nhân vật tấn công:
Hình 3.8 State diagram – Điều khiển nhân vật tấn công
Chức năng Spawn kẻ địch:
Hình 3.9 State diagram – Spawn kẻ địch
Xây dựng các phần thành của Game
Nhân vật chính sẽ do người chơi điều khiển và có thể thực hiện các hành động như di chuyển, tấn công Nhân vật chính được tổ chức theo các lớp giúp dễ dàng quản lí các chức năng với nhau.
Hình 3.10 Hình ảnh nhân vật chính của game
Mỗi Object trong game sẽ chứa nhiều Object con tương ứng với các chức năng mà Object cha có Object cha sẽ chứa một class Controller để giữ liên kết đến các class trong Object con Các Object hoặc Class khác muốn truy cập vào Class con của Object này thì phải thông qua class Controller trong Object cha.
Hình 3.11 Cấu trúc tổ chức nhân vật chính
Các Inspector trong cấu trúc nhân vật chính ở trên, mỗi object con của Player sẽ chứa các component thực hiện chức năng riêng biệt
Hình 3.32 Các component trong cấu trúc nhân vật chính
Object “Model” sẽ chuyên quản lí những hình ảnh của nhân vật chính trong game, ở đây sẽ có script “Player Animation” để thực hiện những hoạt ảnh của nhân vật chính.
Object “Player Movement” chuyên xử lí những chuyển động của nhân vật chính như đứng yên, chạy, né tránh Script “PlayerMovement” sẽ thực hiện chức năng di chuyên khi người chơi nhập vào từ bàn phím.
Object “Player Attack” chuyên xử lí những sự kiện tấn công của nhân vật chính Script “LookAtMouse” sẽ luôn khiến cho nhân vật chính nhìn vào tọa độ chuột, “PlayerAttack” sẽ thực hiện sự kiện tấn công theo hướng tọa độ chuột đó.
Object “Player Damage Reciever” chuyên xử lí những sự kiện va chạm giữa nhân vật chính và các object trong game Script “PlayerDamageReceiver” sẽ xử lí nếu người chơi bị tấn công sẽ trừ máu của người chơi
3.3.2 Xây dựng các kẻ địch trong game
Kẻ địch sẽ có 2 loại, Goblin (chuyên đánh cận chiến) và Eagle (chuyên bắn từ xa) Kẻ địch sẽ có một Circle Collier 2D như một cảm biến để phát hiện người chơi Khi người chơi đi vào vùng tấn công thì kẻ địch sẽ đuổi theo và tấn công người chơi.
Kẻ địch sẽ có cấu trúc tổ chức giống nhau, chỉ khác nhau về chức năng trong script.
Hình 3.15 Cấu trúc tổ chức kẻ địch
Tương tự như cách tổ chức của nhân vật chính, Object “Model” chỉ chuyên quản lí những gì liên quan đến hình ảnh của kẻ địch, Object “Enemy Damage Receiver” chỉ chuyên xử lí những sự kiện va chạm của kẻ địch khi bị người chơi tấn công.
Tuy nhiên kẻ địch sẽ có các chức năng khác người chơi Object “Enemy Detect Collision” đóng vai trò như một cảm biến để phát hiện người chơi, trong đó sẽ có script EnemyDetectCollision so sánh Tag “Player” để nhận diện người chơi:
Hình 3.16 Inspector các component trong Object “Enemy Detect Collision”
Sau khi đã phát hiện người chơi, kẻ địch sẽ tấn công, cơ chế tấn công của kẻ địch sẽ dựa trên một khoản thời gian nhất định, sau 2.5 giây kẻ địch sẽ tấn công một lần, kẻ địch sẽ nhìn về phía người chơi nhờ script “LookAtPlayer” rồi mới thực hiện bắn đạn về phía người chơi:
Hình 3.17 Các component thực hiện tấn công kẻ địch
3.3.3 Xây dựng màn chơi InsideHouse của Game
Các Sprite sử dụng để xây dựng các màn chơi được thiết kế lại từ itch.io sao cho phù hợp với trò chơi Nguồn: PIPOYA FREE RPG TILESET 32x32 Pixel.
Sau khi bắt đầu game, hệ thống sẽ đưa người chơi đến màn chơi InsideHouse, tại nơi đây sẽ có một hướng dẫn mục tiêu của game là thu thập các chìa khóa sau đó tiêu diệt trùm cuối
Trong màn chơi InsideHouse, sẽ có một Object “Notice UI” đã bị disable,khi người chơi chạm vào BoxCollider2D của Object “Notice” thì “Notice UI” sẽ được enable trở lại với hướng dẫn mục tiêu của trò chơi:
Hình 3.19 Cấu trúc của các Object trong màn chơi InsideHouse
Nhờ vào script “DisplayNotice” trong object “Notice”, hệ thống sẽ hiển thị UI gợi ý cho người chơi về mục tiêu của game sau khi người chơi chạm vào BoxCollider2D:
Hình 3.20 Các component trong Object “Notice”
Object “TheJungle” sẽ chứa một BoxCollider2D để khi người chơi chạm vào thì sẽ chuyên sang màn chơi tiếp theo Script “LoadNextScene” sẽ thực hiện chuyển mản hình sang Scene tiếp theo của trò chơi:
Hình 3.21 Các component trong Object “TheJungle”
3.3.4 Xây dựng màn chơi TheJungle của Game
Sau khi kết thúc màn chơi “InsideHouse”, người chơi sẽ chuyển đến màn chơi “TheJungle” Màn chơi này sẽ giấu các chìa khóa khắp nơi trên bản đồ, tìm đủ6 chìa khóa mới có thế chuyển qua màn chơi cuối cùng Nơi đây sẽ có các Enemy đã được giới thiệu xuất hiện ngẫu nhiên để gây khó khăn cho người chơi
Xây dựng giao diện sản phẩm Game
3.4.1 Xây dựng chức năng di chuyển của người chơi Để điều khiển nhân vật di chuyển, người chơi cần nhấn vào các nút “A, W, S, D” Cần một class InputManager để quản lí các dữ liệu mà người chơi nhập vào:
Biến chứa dữ liệu di chuyển theo chiều ngang (inputHorizontal), theo chiều dọc (inputVertical).
Các biến public sẽ lấy dữ liệu của biến protected trong class InputManager.
Class khác truy cập để lấy dữ liệu input từ class này sẽ phải lấy từ biến public chứ không lấy dữ liệu trực tiếp Hàm GetInputMove() sẽ nhận dữ liệu người chơi nhập vào và gán cho các biến đã khai báo:
Hình 3.29 Code lấy sự kiện nhấn nút di chuyển của người chơi
Trong Class PlayerMovement chỉ chuyên sử lí các sự kiện di chuyển của người chơi:
Hàm GetInput() sẽ lấy dữ liệu từ Class InputManager thông qua Singleton pattern và gán cho các biến đã khai báo.
Hàm Moving() sẽ nhận các dữ liệu và thực hiện thay đổi tọa độ object cha của class này bằng cách xác định vector hướng di chuyển và tốc độ di chuyển để xử lí theo input đã nhập của người chơi.
Hình 3.31 Code xử lý cơ chế di chuyển của người chơi
3.4.2 Xây dựng chức năng điều khiển nhân vật tấn công
Trong class InputManager đã giới thiệu ở trên, thực hiện lấy dữ liệu khi người chơi nhấp nút trái chuột, dữ liệu này sẽ cho phép người chơi tấn công cận chiến:
Hình 3.32 Code lấy sự kiện click chuột trái
Thực hiện lấy dữ liệu tọa độ chuột hiện tại, chuyển đổi tọa độ chuột theo hệ quy chiếu màn hình sang hệ quy chiếu thế giới game, dữ liệu này sẽ xác định hướng tấn công của người chơi:
Class LookAtTarget sẽ phụ trách việc xác định hướng đến mục tiêu, lấy tọa độ chuột trên màn hình để hệ thống hiểu được hướng tấn công của người chơi.
Hàm AimTarget() sẽ tính một Vector từ mục tiêu đến vị trí của Object được gắn class LookAtTarget Sau đó tính toán góc độ của Vector đó với góc độ hiện tại, chuyển Radian sang Độ, sau đó xoay Object một góc với dữ liệu vừa được tính:
Hình 3.34 Code xử lý cơ chế xoay vật thể đến hướng truyền vào
Class LookAtMouse sẽ kế thừa từ class LookAtTarget, sau đó sẽ lấy dữ liệu tọa độ chuột từ class InputManager và truyền vào hàm AimTarget():
Hình 3.35 Code xử lý cơ chế định hướng đến chuột
Trong Class PlayerAttack, khai báo các biến cần sử dụng để thực hiện tấn công Đặc biệt là hitBox (phạm vi tấn công của người chơi):
Lấy dữ liệu từ class InputManager thông qua Singleton và xử lí thao tác tấn công:
Hình 3.37 Code cơ chế tấn công của người chơi
Kiểm tra nếu đã nhận được dữ liệu từ class InputManager và thời gian delay đòn đánh đã hết thì sẽ được phép tấn công (nghĩa là chỉ được tấn công tiếp sau 1 khoảng delay).
Sau khi đủ điều kiện, hành động tấn công sẽ được khởi tạo bằng cách kích hoạt hitbox Khi bắt đầu tấn công, thời gian tấn công và độ trễ tấn công sẽ được thiết lập lại Nếu quá trình tấn công đang diễn ra nhưng thời gian cho phép tấn công đã kết thúc, hành động tấn công sẽ bị dừng lại.
Hình 3.38 Các hàm xử lý tấn công của người chơi
3.4.3 Xây dựng chức năng spawn kẻ địch
Cấu trục một Enemy Spawner:
Trong class Spawner chuyên sử lí sự kiện tạo ra các Object trong game, biến holder sẽ giữ các Object đang được active trong game để Hierarchy gọn hơn.
Spawner sẽ chứa một danh sách prefabs chứa các Object mẫu, ngoài ra còn có một danh sách poolObjs để chứa các Object sau khi được tạo ra và tái sử dụng:
Hình 3.40 Code khai báo các danh sách để lưu prefab
Hình 3.41 Inspector trong object Enemy Spawner
Thực hiện nạp các Prefab là Object con của Object Prefab vào danh sách prefabs, sau nó ẩn chúng đi, khi nào cần sử dụng sẽ hiện trở lại:
Hình 3.42 Code xử lý nạp prefab vào danh sách
Tạo ra hàm SpawnPrefab(), hàm này truyền vào tên, vị trí, góc quay prefab cần spawn Sau đó lấy tên của prefab đó để kiểm tra, nếu không có prefab nào trùng tên thì sẽ thông báo không có và trả về null Nếu tìm được prefab trùng tên với tham số truyền vào thì sẽ gọi hàm SpawnPrefab(Tranfrom prefab, Vector3 spawnPos, Quaternion spawnRot).
Hàm SpawnPrefab() thứ hai tìm prefab trong poolObjs, thay đổi vị trí và góc xoay của prefab khi sinh thành, sau đó đưa prefab vào làm con của Holder.
Hình 3.43 Code xử lý cơ chế tạo ra prefab
Hàm GetObjectFromPool() sẽ duyệt qua danh sách poolObjs để tìm prefab cần spawn để hàm SpawnPrefab() ở trên nhận prefab đó, nếu trong danh sách không có prefab cần spawn hệ thống sẽ tạo mới prefab đó:
Hình 3.44 Hàm tìm kẻ địch trong danh sách và hàm tìm kẻ địch bằng tên
Như vậy đã xây dựng xong hệ thống Spawn Object, có thể sử dụng hệ thống Spawn này cho tất cả các loại Object trong game mà chỉ cần kế thừa từ class này. Đối với class Enemy Spawner, kế thừa từ class Spawner và khai báoSingleton pattern để khi nào cần spawn kẻ địch thì những class khác có thể dễ dàng truy cập Enemy Spawner:
Hình 3.45 Code xử lý cơ chế tạo ra kẻ địch
Tuy nhiên để Spawn kẻ địch tại những vị trí ngẫu nhiên thì cần phải có Class EnemySpawnAtPoint Class này sẽ liên kết tới SpawnerController để lấy các hàm cần thiết trong những class khác. Đầu tiên sẽ lấy số lượng các điểm đã được đặt trước trong game để tính toán cần spawn bao nhiêu kẻ địch Sau đó sẽ gọi hàm SpawnPrefab trong class Spawner và truyền vào những tham số đã được chuẩn bị.
Hình 3.46 Code xử lý cơ chế kẻ địch xuất hiện ngẫu nhiên tại các điểm
3.4.4 Xây dựng chức năng tấn công của kẻ địch
Cấu trúc một kẻ địch (Eagle):
Hình 3.48 Inspector trong object Eagle Detect Collison