Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 72 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
72
Dung lượng
5,33 MB
Nội dung
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA CÔNG NGHỆ PHẦN MỀM ĐỒ ÁN Tìm hiểu xây dựng cấu trúc trò chơi Unity Giáo viên: Ths Huỳnh Hồ Thị Mộng Trinh Sinh viên: Tưởng Thành Long - 18520227 Nguyễn Nhật Long - 18520304 Thành phố Hồ Chí Minh, tháng năm 2021 NHẬN XÉT CỦA GIÁO VIÊN ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… ……………………………………………… …………… ……… , ngày …… tháng…… năm 2021 Người nhận xét (Ký tên) LỜI CÁM ƠN Những trang báo cáo chúng em xin gửi lời biết ơn sâu sắc chân thành từ nhóm chúng em đến giáo viên Ths Huỳnh Hồ Thị Mộng Trinh tận tình hướng dẫn chúng em hồn thành đồ án tốt có thể, khơng có hướng dẫn có lẽ chúng em khơng thể hồn thành tốt đến Trong q trình hồn thiện sản phẩm báo cáo khó tránh khỏi sai sót, mong nhận góp ý từ thầy để chúng em cải thiện thân dự án lần sau Một lần xin chân thành cám ơn người ủng hộ chúng em dự án lần - Nhóm thực - MỤC LỤC Chương 1: Tổng quan đề tài 1.1 Giới thiệu đề tài…………………………………………………………………………… 1.2 Mục tiêu đề tài……………………………………………………………………………… 1.3 Đối tượng nghiên cứu…………………………………………………………………… 1.4 Các nghiên cứu liên quan……………………………………………………………… 1.5 Ý nghĩa khoa học & thực tiễn đề tài………………………………………….2 Chương 2: Tổng quan Unity 2.1 GameEngine gì?………………………………………………………………………… 2.2 Unity…………………………………………… ……………………………………………… 2.2.1 Mono…………………………………………… …………………………………… 2.2.2 Unity…………………………………………… ……………………………………… 2.2.2.1 Scene…………………………………………… ……………………………… 2.2.2.2 GameObject…………………………………………… …………………….7 2.2.2.3 Component…………………………………………… …………………… 2.2.2.4 Các Component có sẵn………………………………………………… 2.2.2.5 Quản lý tài nguyên………………………………………………………… 2.2.2.6 Luồng game………………………………………………………………… 10 2.3 Các game làm Unity…………………………………………………………… 11 2.4 Các vấn đề Unity………………………………………………………………….11 Chương 3: Vấn đề mẫu - Tetris 12 3.1 Cách thực thông thường.…………………………………………………… 12 3.1.1 Cấu trúc……………………………………………………………………………… 12 3.1.1.1 Cell prefab…………………………………………………………………… 12 3.1.1.2 Block…………………………………………………………………………… 12 3.1.1.3 Spawner……………………………………………………………………… 15 3.1.1.4 NormalTetrisController…………………………………………………16 3.1.2 Hoạt động…………………………………………………………………………… 17 3.1.3 Kết luận……………………………………………………………………………… 19 3.2 Sử dụng kiến trúc MVC.……………………………………………………………… 19 3.2.1 Cấu trúc……………………………………………………………………………… 19 3.1.1.1 Model…………………………………………………………………………….19 3.1.1.2 View…………………………………………………………………………… 22 3.1.1.3 Controller……………………………………………………………………… 26 3.1.2 Hoạt động…………………………………………………………………………… 27 3.1.3 Kết luận……………………………………………………………………………… 29 3.3 So sánh đánh giá…………………………………………………………………… 31 3.3.1 Tính đầy đủ………………………………………………………………………… 31 3.3.2 Tính dễ hiểu………………………………………………………………………… 31 3.3.3 Tính kết dính………………………………………………………………………… 32 3.3.4 Tính tái sử dụng…………………………………………………………………… 32 3.3.5 Tính hiệu quả……………………………………………………………………… 32 3.3.6 Chỉ số………………………………………………………………………………… 33 3.4 Quy trình thực hiện……………………………………………………………………… 37 3.4.1 Timeline……………………………………………………………………………… 37 3.4.2 Phân chia công việc…………………………………………………………… 37 3.4.3 Công cụ……………………………………………………………………………… 38 3.4.4 Kết quả………………………………………………………………………………….39 3.5 Kết luận……………………………………………………………………………………… 39 Chương 4: Một số kiến trúc phần mềm nghiên cứu 41 4.1 Entity Component System.………………………………………………………… 41 4.1.1 Giới thiệu…………………………………………………………………………… 41 4.1.2, Vấn đề ECS giải quyết:………………………………………………………… 43 4.1.3 Cách sử dụng…………………………………………………………………… 45 4.1.4 Ưu điểm / nhược điểm………………………………………………………… 45 4.1.5 Kết luận……………………………………………………………………………… 46 4.2 Empty Game Object Manager……………………………………………………… 46 4.2.1 Giới thiệu…………………………………………………………………………… 46 4.2.2 Vấn đề Empty Game Object Manager giải quyết………………… 47 4.2.3 Cách sử dụng……………………………………………………………………… 48 4.2.4 Kết luận……………………………………………………………………………… 49 4.3 Model View Controller………………………………………………………………… 49 4.3.1 Giới thiệu…………………………………………………………………………… 49 4.3.2 Cách sử dụng……………………………………………………………………… 50 4.3.3 Kết luận……………………………………………………………………………… 52 Chương 5: Một số design pattern hữu ích 53 5.1 Observer pattern………………………………………………………………………… 53 5.2 Command pattern……………………………………………………………………… 54 5.3 Singleton…………………………………………………………………………………… 55 5.4 Service Locator…………………………………………………………………………… 56 5.5 Object Pooling……………………………………………………………………………… 58 KẾT LUẬN 59 TÀI LIỆU THAM KHẢO 61 MỤC LỤC HÌNH ẢNH Các game engine phổ biến …………………………………………………………3 Môi trường phát triển game …………………………………………………………………… Giao diện Unity ……………………………………………………………………… Tab Scene Unity (ở giữa) ………………………………………………………… Inspector Unity ………………………………………………………………………………… Component SpriteRenderer …………………………………………………………………… Component Rigidbody …………………………………………………………………………… Component Camera ………………………………………………………………………………….9 Luồng game Unity …………………………………………………………………………….10 Hình Cell Prefab …………………………………………………………………………………… 12 Thơng tin Block ……………………………………………………………………………………….12 BLock gameTetris …………………….……………………………………………… 13 Script blockComponent………………………………………………………………………… 13 Sơ đồ luồng xử lý rơi ……………… …………………………………………………………… 14 BlockComponent lưu Cell mảng chiều Transform[,] ………… 15 Script điều kiển loại block spawn …………………………………………………… …… 15 Thông số NormalTetrisController ……………………………………………….… 16 Sơ đồ luồng Update GameController ……………………………………………… 17 Luồng hoạt động GameController ………………………………………………… 17 Hình ảnh game cấu trúc bên ………………………………….… ………… … 18 Ảnh minh hoạ chế kick Tetris …………………………………… ……… … 20 khối Tetris …………………………………………… ………………………… 21 Khởi tạo viên Tetris ……………………………………………………………………….……… 22 Script chia tách thành nhiều file ………………………………………….……… 24 Component Button …………….………………………………………………………………… 25 Cách gắn OnClick cho Button thông dụng …………………………………… 25 OnClick gán script, giảm thiểu thời gian tìm kiếm UI …… 26 Flow xử lý DropdownController, vịng lặp game ……………… 27 Flow xử lý player bấm vào nút ………………………………………………… 27 Sơ đồ class MVC ……………………………………………………………… 28 Cấu trúc liệu bên board…………………………………………… …… 28 Quy trình chung nên có game…………………………………………………… 29 Luồng scene chung game………………………………………………………………….30 Bên trái view MVC, bên phải Controller thường………………… 31 Trạng thái profile …………………………………………………………………………… 33 Biểu đồ thông số profile ……………………………………………………………………… 34 Biểu đồ thông số profile ……………………………………………………………………… 35 Thông số nhớ MVC …………………………………………………………………… 36 Timeline ……………………………………………………………………………………………… 37 Hình minh hoạ Entity …………………………………………………………………………… 41 Hình minh hoạ Component ………………………………………………………………… 42 hình tham khảo từ trang GameDev design component ……… 42 Ví dụ thỏ cá voi ………………………………………………………………………………… 44 Vấn đề kế thừa kim cương …………………………………………………………………… 45 Ví dụ lặp code cài đặt chế chung cho scene bình thường ……… 47 Sử dụng GameLoopManager để thoát khỏi yêu cầu bắt buộc dùng ECS Unity ………………………………………………… 48 Mơ hình MVC ………………………………………………………………………………………… 50 Mơ hình AMVCC, thêm Application Component ……………………………… 51 Hình dung Observer ……………………………………………………………………………….53 Input không nên gán cứng …………………………………………………………….54 Mọi lớp truy cập đến Singleton …………………………………………… 55 Mơ hình Service Locator ……………………………………………………………………… 56 Hình dung Object pooling …………………………………………………………………… 58 tiếp vào luồng code chương trình Ý tưởng Empty Game Object Manager viết Manager, với tham chiếu tới Game Object liên quan, bỏ chúng vào Game Object rỗng gọi Manager Với Empty Game Object Manager, ta tạo System riêng cho tập trung vào nơi 4.2.2 Vấn đề Empty Game Object Manager giải quyết: System ECS Unity: Kiến trúc giải vấn đề ECS Unity Mặc dù kiến trúc Unity ECS, Unity không cho ta thay đổi System ECS, cho đổi Entity Component Vì vậy, có thiếu linh hoạt cách ECS áp dụng Unity Có thể nói thiếu linh hoạt trầm trọng Giả sử ta muốn làm hệ thống xoá tất Game Object khỏi hình Ta phải kiểm tra tất hàm Update Component để xem có khỏi hình khơng xố ngồi hình Ví dụ lặp code cài đặt chế chung cho scene bình thường Về ngữ nghĩa, việc xoá khỏi hình khơng phải đặc tính Component, mà đặc tính chương trình Như 48 vậy, cài đặt vừa không ngữ nghĩa, vừa không tuân thủ quy luật Don’t Repeat Yourself Trong giới hồn hảo, ta thêm System vào chương trình kiến trúc ECS, Unity không cho ta làm vậy, ta phải sử dụng kiến trúc 4.2.3 Cách sử dụng Các Manager thường cài đặt Singleton để đảm bảo có manager Scene Quá nhiều Manager logic dẫn đến phí phạm tài nguyên xử lý, Manager thường tốn nhiều chi phí để chạy qua tất MonoBehaviour quan tâm Logic Manager đặt bên hàm Update Một biện pháp để cài đặt Game Manager bỏ tất Manager vào GameObject rỗng GameObject sử dụng mẫu thiết kế Singleton, có tag đặc biệt để lấy nhanh Vì Game Manager đặt GameObject, điều khiến hệ thống code dễ đọc hơn, hệ thống game tập trung chỗ, không nằm rải rác khắp chương trình Khi người khác thân quay lại đọc code, cần mở GameObject Manager xem script nó, hiểu hệ thống chương trình Các Manager thiết kế để tái sử dụng Mặc dù game có hệ thống riêng, có nhiều hệ thống mà game có Một số ví dụ thư viện âm thanh, hình ảnh, … sử dụng mẫu thiết kế Flyweight; hệ thống Lưu game; … Nếu tái sử dụng Manager, lần làm game đơn giản nhiều Ngồi ra, có cách sử dụng kiến trúc mạnh mẽ 49 Sử dụng GameLoopManager để thoát khỏi yêu cầu bắt buộc dùng ECS Unity Kiến trúc chí làm GameManager kiểm sốt code flow chương trình, cách bỏ qua hàm Update Unity, viết hàm Update mình, gọi hàm Update GameManager Một lợi cách bạn kiểm sốt thứ tự gọi hàm Update Bạn gọi thứ chừng vịng lặp gọi Update Nói chung, bạn làm bạn muốn chương trình dùng game loop thường thay Unity Framework, sử dụng công cụ asset sẵn có Unity Kiến trúc game loop quen thuộc tự với nhiều người lập trình game, nên điều bạn xem xét cho game bạn Tuy nhiên, viết Empty Game Object Manager, cần cẩn thận vấn đề Single Responsibility Nhiều lập trình viên viết Manager biện pháp vừa không hiệu cho việc kiểm thử trì code, vừa giảm tính tái sử dụng mà Manager có 4.2.4 Kết luận: Empty Game Object Manager kiến trúc mạnh mẽ sử dụng nhiều project Nhiều lập trình viên sử dụng Unity, sớm hay muộn nghĩ bắt gặp kiến trúc trình lập trình Unity Đó ý tưởng vơ đơn giản hiệu Vì đơn giản kiến trúc này, với độ khó trì kiến trúc 0, Empty Game Object Manager kết hợp với kiến trúc 50 khác 4.3 Model View Controller 4.3.1 Giới thiệu: Ngồi mơi trường phát triển game, có mơ hình phát triển ứng dụng phổ biến mơ hình Model View Controller (MVC) Ý tưởng mơ hình đơn giản Model kho thông tin chứa liệu, cập nhật Controller View Game Object hiển thị lên hình Và Controller trung gian kiểm sốt luồng thơng tin Model View Mơ hình MVC Lợi MVC đơn giản quan trọng Ta thay đổi Model View độc lập Với game theo lượt, board game, puzzle game, , mơ hình hữu dụng để xây kiến trúc đơn giản, quen thuộc, linh hoạt Tuy nhiên, với game mà Model ảnh hưởng trực tiếp tới View ngược lại, game có xử lý va chạm, xử lý ánh sáng, … ảnh hưởng đến gameplay, MVC khó hoạt động tốt 51 4.3.2 Cách sử dụng: Để cài đặt Model, cần sử dụng C# bình thường, không bắt buộc kế thừa MonoBehaviour Unity Do Model lớp liệu, việc cài đặt lớp đơn giản Ngồi ra, ta theo quy trình phát triển ứng dụng MVC thiết kế sơ đồ lớp chương trình đủ phức tạp Ở cài đặt Observer Event để bắt thay đổi Model, báo cho Controller Để cài đặt View, có nhiều cách Một cách định nghĩa hàm thay đổi hình Model thay đổi Để làm điều này, cần liệt kê thay đổi hình, cài đặt hàm thay đổi Cách khác gọi lấy liệu từ Model xây lại hình Cách thường đơn giản cách thứ nhất, hiệu cách trước Tuy nhiên, nhược điểm không đáng lo cho game nhẹ xử lý Ngồi ra, View có trách nhiệm truyền tín hiệu từ Người dùng đến Controller Cài đặt Controller phần khó MVC Nó có vai trị trung gian Model View Đầu tiên, Controller cần nhận tín hiệu từ View, thay đổi Model Sau đó, sử dụng Observer Event Model, Controller nhận tín hiệu thay đổi liệu từ Model yêu cầu View thay đổi vẽ lại Ngoài ra, theo viết https://www.toptal.com/unity-unity3d/unity-withmvc-how-to-level-up-your-game-development? fbclid=IwAR24yv9ncmDoQHrBNxMH6pAT9wotPsSyCXZlwvBHk8NQj1_Td7V CGV6fe18, ta thêm thành phần vào cấu trúc MVC thơng thường 52 Mơ hình AMVCC, thêm Application Component Lớp Application có nhiệm vụ giữ tham chiếu tới thành phần Model, View, Controller quan trọng Application có nhiệm vụ điều hướng tín hiệu từ View Model tới nhiều Controller quan tâm, thay Model với Observer Lớp Helper (gọi Component viết gốc) lớp chứa hàm xử lý thường thấy di chuyển, xoay, … Chúng khơng thuộc mơ hình hết, chúng có tính tái sử dụng tốt đem từ project sang project khác 4.3.3 Kết luận: MVC kiến trúc thường thấy phát triển ứng dụng, khơng phải phát triển game, nên không hiệu cho việc phát triển game Tuy nhiên, thật nhiều người quen với kiến trúc kiến trúc ECS Unity, kiến trúc hiệu với game có xử lý gameplay xử lý UI phức tạp board game, turn-based game, … 53 Chương 5: Một số design pattern hữu ích 5.1 Observer pattern Đây pattern phổ biến, ý tưởng pattern đơn giản đối tượng cần thơng báo kiện điều vừa xảy ra, khơng cần phải tìm đến đối tượng quan tâm mà thông báo cho đối tượng đó, thay vào đối tượng cần nghe đăng ký theo dõi mục tin quan tâm bảng tin chung từ có thơng báo tin đăng ký thấy tự tìm tới thơng báo Hình dung Observer Chúng ta định nghĩa event game trước OnSpawnNewBlock hay OnLoseGame, Tạo bảng thông báo chung (Dispatcher) để tiếp nhận chuyển tiếp events đến đối tượng Khi bắt đầu game, đối tượng cần đăng ký với bảng tin kiện mà quan tâm để lắng nghe kiện xảy 54 Unity có hỗ trợ sử dụng Observer pattern với Event System 5.2 Command pattern Command pattern pattern thiết kế hành vi đối tượng sử dụng để đóng gói tất thơng tin cần thiết để thực hành động kích hoạt kiện thời gian sau Thơng tin bao gồm tên phương thức, đối tượng sở hữu phương thức giá trị cho tham số phương thức Giả sử thiết kế xử lý đầu vào để người chơi điều khiển nhân vật (Input): Input không nên gán cứng Nếu dùng sau người chơi muốn thay đổi chức nút khơng được, gây trải nghiệm xấu cho người dùng Thay vào áp dụng Command pattern Khi ta muốn thay đổi chức nút X, ta gán Command khác cho Tất nhiên, ta khơng dùng Command mà dùng Dictionary hành động nút, với hàm ứng với enum, không 55 Command tiện giảm phức tạp enum trung gian với hàm, mà Command pattern cho ta nhiều thứ khác Nó cho phép ta lưu lại lịch sử hành động, cài đặt chức Undo cho hành động, truyền hành động để kích hoạt nơi khác lúc khác Command pattern vơ linh hoạt áp dụng rộng rãi Tất nhiên cần thận trọng vấn đề thiết kế mức, dẫn đến phức tạp khơng đáng có 5.3 Singleton Pattern quen thuộc với làm game trước đây, cần đối tượng truy cập từ nơi đâu lúc có thể class (instance) Pattern thường phù hợp với manager xuất lần kéo dài đến hết thời gian gameplay GameManager, ScoreManager, PlayerManager, Nghe thuận tiện thử tưởng tượng dùng nhiều singleton đến gặp lỗi phải truy lỗi qua class tốn công, chưa kể sau thay đổi hàm singleton nơi gọi tới phải sửa lại tồn cho phù hợp, tốn cơng Mọi lớp truy cập đến Singleton 56 Pattern thường dùng Empty Game Object Manager nói Lý đa số Manager thường cần nên có Singleton cho phép truy cập toàn cục cho Manager này, điều mà Manager cần Bởi Manager hệ thống ảnh hưởng đến nhiều thành phần game khác nhau, tính chất Scene khơng gian game 5.4 Service Locator Mơ hình Service Locator Đây nói tốn giải vấn đề nhiều singleton dự án Mục tiêu service locator tạo điểm truy cập chung từ người dùng cần service truy cập thơng qua điểm truy cập chung Vậy dễ mở rộng sửa chữa singleton điểm nào? Đó kết hợp interface với service locator Ví dụ interface IAudioManager hứa cung cấp hàm với class triển khai 57 Sử dụng class để triển khai interface, dùng class test với mục đích sau test hệ thống audio có hoạt động ổn khơng Chúng ta đăng ký với Locator: Và sử dụng việc 58 Sau có thay đổi cách làm việc hệ thống âm cần đăng ký với class khác triển khai IAudioManager được, mục đích service locator - Tạo điểm truy cập service chung - Giấu lớp xử lý bên dưới, để lại phần giao diện - Dễ dàng thay sửa chữa 5.5 Object Pooling Hình dung Object pooling Với Unity, bạn Instantiate Destroy object lúc giai đoạn trò chơi, làm gây vấn đề lớn hiệu năng, không tái sử dụng lại chúng để tăng trải nghiệm người chơi Ý tưởng pattern đơn giản, bạn sinh tồn object đầu game, chơi tới đâu sinh tới đó, object hết nhiệm vụ (chết, khỏi hình, …) sau dùng lại bạn đừng 59 nên Destroy object mà cho vào bể (pool) tắt ẩn để giảm nhẹ cho q trình xử lý, cần bật lại chỉnh lại thơng số cho dùng rồi, khơng cần phải tạo object với loại tương tự sau hủy lặp lại trăm lần Object Pooling pattern có độ phức tạp cao, Unity, giúp tiết kiệm nhiều hiệu chương trình Đó hàm khởi tạo game object Unity đặc biệt tốn nhiều thời gian, đặc biệt game object phức tạp Một điểm lưu ý pool khơng tự động xố object cũ Cần phải cài đặt chức số game object pool khơng có giới hạn Nếu số game object có giới hạn, thay khởi tạo theo nhu cầu, khởi tạo tĩnh đầu chương trình Điều giảm lag khởi tạo, nhiên có khuyết điểm hết game object pool, khơng có game object để khởi tạo 60 KẾT LUẬN Chúng em bước vào đồ án mong muốn xây dựng kiến trúc chung cho Unity, kiến trúc hiệu cho game, số khía cạnh, thực tế kiến trúc có lẽ khơng tồn Cùng chúng em thu thập mẫu thiết kế, kiến trúc, ý tưởng rời rạc mà giúp ích project game khác Chúng giúp ích nhiều, chúng khơng thể thay việc ngồi lại với nhóm thực xây dựng kiến trúc đàng hoàng Trong trình tìm hiểu kiến trúc này, chúng em học hỏi nhiều điều cách cấu trúc game, ưu điểm hạn chế Unity áp dụng kiến trúc đó, ý tưởng thiết kế chương trình, đặc biệt với Unity 61 TÀI LIỆU THAM KHẢO Eduardo Dias Da Costa (2019), Unity with MVC: How to Level Up Your Game Development, https://www.toptal.com/unity-unity3d/unitywith-mvc-how-to-level-up-your-game-development Bob Nystrom (2018), Game Programming Patterns, https://gameprogrammingpatterns.com/ Eric J Braude & Micheal E Bernstein (2016), Software Engineering, Modern Approaches (Second edition) Unity3D User Manual https://docs.unity3d.com/Manual/index.html 62 ... tài Đề tài chúng em ? ?Tìm hiểu xây dựng cấu trúc trò chơi Unity? ?? Hướng đến cấu trúc tối ưu dễ mở rộng bảo trì 1.2 Mục tiêu đề tài Hầu khơng có kiến trúc chương trình game Unity thống Đa số forum... vấn đề Unity Cấu trúc chương trình Unity, khơng có biến đổi đặc biệt gì, thành phần GameObject độc lập với Theo phân loại cấu trúc chương trình Shaw & Garlan [3], cấu trúc chương trình Unity 'parallel... loại kiến trúc khác - Tưởng Thành Long Nguyễn Nhật Long Áp dụng xây dựng thử dựa kiến trúc nghiên cứu - Tưởng Thành Long Nguyễn Nhật Long Xây dựng game - Tưởng Thành Long Nguyễn Nhật Long Dựng game