Phát triển game đối kháng

76 1 0
Phát triển game đối kháng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC PHÁT TRIỂN GAME ĐỐI KHÁNG Ngành: Khoa học máy tính HỘI ĐỒNG: KHOA HỌC MÁY TÍNH GVHD: VƯƠNG BÁ THỊNH GVPB: TRẦN HUY -o0o SVTH: NGUYỄN VĂN THUẦN (1713376) TP HỒ CHÍ MINH, THÁNG NĂM 2021 TP HỒ CHÍ MINH, 9/2022 LỜI CAM ĐOAN Sinh viên cam đoan điều ghi báo cáo, mã nguồn sinh viên tự thực - trừ kiến thức tham khảo có trích dẫn mã nguồn mẫu nhà sản xuất cung cấp, hồn tồn khơng chép từ nguồn khác Nếu lời cam đoan trái với thật, sinh viên xin chịu trách nhiệm trước Khoa Nhà trường Sinh viên thực đề tài ii LỜI CẢM ƠN Sinh viên thực đề tài xin chân thành cảm ơn thầy Khoa Khoa học Kĩ thuật Máy tính đem đến nhiều kiến thực bổ ích cho sinh viên năm học vừa qua Sinh viên cảm ơn Ths Vương Bá Thịnh có góp ý chia sẻ giúp đỡ sinh viên định hướng thực đề tài tốt Sinh viên cảm ơn thầy Trần Huy có lời khun bổ ích để hồn thiện luận văn Trong trình thực hiện, luận văn sinh viên cịn gặp thiếu sót, mong nhận góp ý chân thành từ thầy Sinh viên thực đề tài iii TĨM TẮT ĐỀ TÀI Luận văn nhằm hiểu cách xây dựng trị chơi điện tử nói chung trị chơi điện tử đối kháng nói riêng với đầy đủ chức mục lục, phần điều chỉnh hình ảnh, âm thanh, phần chơi cá nhân với trí tuệ nhân tạo phần chơi mạng bao gồm chức tạo phòng, tham gia phòng ngẫu nhiên chọn phòng danh sách phòng Luận văn xây dựng dựa công cụ xây dựng game Unity Engine Phần chơi mạng thực sử dụng Photon PUN iv MỤC LỤC LỜI CAM ĐOAN ii LỜI CẢM ƠN iii TÓM TẮT ĐỀ TÀI iv DANH SÁCH HÌNH vii DANH SÁCH BẢNG ix DANH SÁCH TỪ VIẾT TẮT VÀ THUẬT NGỮ x CHƯƠNG 1: TỔNG QUAN 1.1 Giới thiệu 1.2 Luật chơi 1.3 Mục đích nghiên cứu 1.4 Giới hạn đề tài 1.5 Kết đạt 1.6 Cấu trúc luận văn CHƯƠNG 2: KIẾN THỨC CƠ BẢN 2.1 Unity Engine 2.2 Các khái niệm phát triển game 14 CHƯƠNG 3: KIẾN TRÚC TRÒ CHƠI 15 3.1 Hệ thống quản lí game 17 CHƯƠNG 4: HIỆN THỰC VÀ QUY TRÌNH PHÁT TRIỂN 27 4.1 Xây dựng với mơ hình 3D cho trị chơi đối kháng 27 4.2 Hiện thực điều khiển nhân vật 33 4.2.1 State Machine gì? 33 4.2.2 Hiện thực State Machine cho điều khiển nhân vật 34 4.3 Hiện thực phần chơi mạng với Photon PUN 43 4.3.1 Tại lại chọn Photon PUN 2? 43 4.3.2 Cài đặt Photon 44 4.3.3 Hiện thực chế độ chơi mạng với Photon 46 v 4.4 Xây dựng AI cho chế độ luyện tập 50 4.4.1 Điều khiển trạng thái AI với State Machine 50 4.4.2 Tìm đường với giải thuật A* đồ thị có hướng 52 4.5 Cài đặt Camera cho trò chơi 56 CHƯƠNG 5: KẾT LUẬN 59 5.1 Kết đạt 59 5.2 Các vấn đề tồn 62 5.3 Hướng phát triển 62 III TÀI LIỆU THAM KHẢO 63 vi DANH SÁCH HÌNH Hình 1: Thị trường game tồn cầu 2020 (theo thiết bị) – Newzoo[1] Hình 2: Thị trường game tồn cầu 2020 (Theo vùng) - Newzoo[1] Hình 3: Console next-gen: PS5 (trái) Xbox Series X(phải) Hình 4: Hoa – cảnh từ video giới thiệu game Hình 5: Các mức độ chi tiết khác mô hình (LOD) [3] Hình 6: Cửa sổ editor Godot Engine Hình 7: Các tảng Unity hỗ trợ Hình 8: Cảnh Adam – phim Unity 10 Hình 9: Cửa sổ Editor Unreal Engine 11 Hình 10: STAR WARS Tech Demo Unreal Engine 12 Hình 11: Kiến trúc trị chơi 15 Hình 12: Class Diagram tổng quát 16 Hình 13: Các class thuộc khối Manager 18 Hình 14: Các class thuộc khối Gameplay Manager 20 Hình 15: Các class thuộc khối Main Menu 22 Hình 16: Các component người chơi chế độ offline (trên) chế độ mạng (dưới) 24 Hình 17: Các class thuộc CharacterController 25 Hình 18: Các class thuộc AI 26 Hình 19: Mơ hình thực Blender 28 Hình 20: UV từ phần thân mơ hình trải mặt phẳng 2D 28 Hình 21: Minh họa Texture màu sắc áp dụng vào UV[4] 29 Hình 22: Các loại đinh dạng file Blender hỗ trợ 29 Hình 23: Blender (trái) sử dụng hệ trục tọa độ với trục Z thẳng đứng, khác với Unity (phải) 30 Hình 24: Mơ hình sử dụng Unity 30 Hình 25: Các thuộc tính thiết lập Tab Rig 31 Hình 26: Ánh xạ điểm khớp nối mơ hình thiết lập Humanoid 32 Hình 27: Ví dụ animation gốc (bên phải) animation cho mơ hình sinh viên 32 vii Nếu người dùng người điều khiển CharacterMainController, có quyền ghi data (stream.IsWriting == true) người lại, CharacterMainController người dùng hình game đối phương đọc data vào Data gửi dạng mảng Object Nếu đọc ghi data (đúng gửi định dạng gửi đủ đồng trạng thái người chơi qua mạng) Còn lại việc đồng hoạt ảnh có PhotonAnimationView thực hiện, việc đồng vị trí PhotonTransformView thực hiện… Hình 47 Các thông tin đồng bộ, bao gồm CharacterMainController vừa thực Khi người dùng hết máu Sẽ tự động gọi hàm LeaveRoom() từ NetworkManager Người chơi khỏi phịng trở hình menu 49 4.4 Xây dựng AI cho chế độ luyện tập 4.4.1 Điều khiển trạng thái AI với State Machine Về bản, ta sử dụng Animator riêng để điều khiển State Machine Tương tự State Machine để điều khiển trạng thái nhân vật mục 4.2 Hình 48: Animator để điều khiển FSM Nếu người chơi gần, tùy thuộc vào vị trí người chơi bên trái hay bên phải AI, Animator thay đổi giá trị MoveLeft, MoveRight InputController Khi gặp chướng ngại vật, tương tự kiểm tra đáp đất Ta sử dụng Raycast phía trước để xác định có vật thể khơng phải Player phía trước hay khơng Nếu có vật cản thay đổi sang trạng thái Jump Khi tiếp cận người chơi, tùy thuộc vào tình hình người chơi so với AI, thực hành động Guard hành động Attack (Sơ đồ sau) 50 Hình 49: FSM AI AI ưu tiên sử dụng kĩ (hành động Skill) có thể, kĩ thời gian chờ, thực ngẫu nhiên hành động Guard, Attack hoăc Strong Attack Một giá trị ngẫu nhiên để đánh giá lựa chọn State Attack Guard, (Khi chế độ Offensive (Máu AI > Máu người chơi): 80% hội thực Attack 20% hội AI thực Guard; ngược lại: tỉ lệ 60% - 40%) Ngược lại người chơi không tầm cơng, có nhiều vật cản phức tạp, sử dụng giải thuật A* với đồ thị xây dựng sẵn để tìm đường đến người chơi 51 4.4.2 Tìm đường với giải thuật A* đồ thị có hướng A* thuật tốn tìm kiếm đồ thị, tìm đường từ nút khởi đầu tới nút thỏa mãn điều kiện đích Thuật tốn tìm kiếm dựa hàm đánh giá ước lượng gọi hàm Heuristic để ước lượng lựa chọn nút đồ thị thỏa mãn ước lượng tốt Do thuật tốn tìm kiếm theo lựa chọn tốt Để giảm thời gian tìm kiếm, sinh viên xây dựng đồ thị tìm đường graph tương tự bên Với điểm (Node) thiết kế phù hợp với map Các Node chưa thông tin tới điểm trọng số Trọng số tính tốn trước q trình thiết kế map, giảm thiểu thời gian tính tốn qua giảm thời gian tìm kiếm Hình 50: Đồ thị tìm đường nhìn từ cao Hình 51: Đồ thị tìm đường nhìn gần 52 Hình 52: Component Node GameObject chứa GameObject Node, bao gồm component từ class GraphManager GraphManager có hàm GetAllNodes() để lấy tất Node vào danh sách Node nhấn nút Get all Nodes để gọi hàm Đồng thời sau nhấn nút Calculate Weight để tính tốn trọng số cho Node đồ thị Hình 53: Component GraphManager chứa Node Trong số tính độ dài Vector với điểm vị trí Node Độ dài tới chữ số thập phân để dễ dàng tính tốn 53 Hàm vẽ Gizmo Unity, giúp đồ thị trực quan hóa q trình xây dựng đồ thị Hàm vẽ đường màu đỏ Node nối với (bi-directed) ngược lại màu xanh với mũi tên Sau xây dựng đồ thị thành cơng ta thực việc tìm kiếm với giải thuật A* Mã giả A* tương tự hình dưới: Hình 54: mã giả A*[7] public Node GetNearestNode(Vector3 targetPos) { float currentDistance = 99999; Node nearestNode = null; foreach(var node in _lstNodes) { float nextDistance = (float)Math.Round((node.transform.position targetPos).magnitude, 2); if(currentDistance > nextDistance) { currentDistance = nextDistance; nearestNode = node; } } return nearestNode; } Ta sử dụng hàm GetNearestNode() với targetPos vị trí người chơi để lấy điểm đồ thị gần player Đây điểm đích Tương tự với targetPos vị trí 54 máy để tạo ta điểm bắt đầu Hàm duyệt Node danh sách từ GraphManager Tính giá trị độ dài Vector chọn điểm gần Thực tìm kiếm A* với hàm Heuristic Euclid Chính độ dài Vecto từ điểm bắt đầu tới đích public float CalculateHeuristicCost(Transform start, Transform target) { //HEURISTIC SCORE = EUCLID var direction = start.position - target.position; return (float)Math.Round(direction.magnitude, 2); } Với Input tìm lựa chọn Node duyệt Ta gán giá trị Node trước (PrevNode) vào Node Khi tìm đường thực xây dựng lại đường từ điểm đích tới điểm bắt đầu với Hàm A* để tạo lại đường private HashSet ReconstructPath(Node target) { HashSet path = new HashSet(); while(target.PrevNode != null) { path.Add(target); target = target.PrevNode; } path.Reverse(); return path; } Từ AIController, ta lấy path pathNodes từ GraphManager thực tới Node đồ thị Cờ IsFollowingPath chuyển thành True Việc di chuyển tương tự việc đuổi theo Người chơi gần, với mục tiêu Node cần đến Nếu đường đi, người chơi tầm công độ cao với máy, để tránh trường hợp người chơi gần đứng cao so với máy, cờ IsFollowingPath chuyển thành False Thực lại quy trình ban đầu Mã hình dưới: 55 public bool NearTarget() { if(distance between player and AI

Ngày đăng: 20/06/2023, 20:41

Tài liệu cùng người dùng

Tài liệu liên quan