Giới thiệu dự án

Thị trường trò chơi điện tử di động toàn cầu đã chứng kiến sự phát triển vượt bậc với doanh thu đạt 77,2 tỷ USD vào năm 2020 (tăng trưởng 13,3% theo báo cáo từ Newzoo). Mặc dù thị trường bị áp đảo bởi các tựa game thuộc thể loại casual và hyper-casual đơn giản, nhu cầu của phân khúc người chơi yêu thích thử thách (hardcore gamers) đối với các trò chơi hành động có tính năng phối hợp đồng đội thời gian thực (co-op multiplayer) trên nền tảng di động vẫn chưa được đáp ứng toàn diện. Các sản phẩm thành công trong giai đoạn giãn cách xã hội như Among Us hay Play Together chứng minh sức hút mãnh liệt của sự kết nối xã hội, nhưng lại thiếu chiều sâu trong cơ chế vật lý và tính thử thách chiến thuật dài hạn.

Đồ án khóa luận tốt nghiệp "Xây dựng game online cho 2 người chơi" (Building an Online Game for 2 Players) của sinh viên Trần Nguyên Tiến Nam (Khoa Công nghệ Phần mềm, Trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM, dưới sự hướng dẫn của ThS. Trần Thị Hồng Yến) tập trung giải quyết bài toán phát triển một trò chơi hành động bắn súng góc nhìn từ trên xuống (Top-down Shooter) kết hợp điều khiển chiến xa thời gian thực dành cho 2 người chơi trên nền tảng di động.

+-------------------------------------------------------------------------+
|                        MỤC TIÊU DỰ ÁN CỐT LÕI                           |
+-------------------------------------------------------------------------+
|  1. Kiến trúc mạng P2P: Tối ưu truyền tải thời gian thực qua Relay.     |
|  2. Vật lý chiến xa RWD: Mô phỏng lực kéo, vi sai và kỹ thuật drift.   |
|  3. Trí tuệ nhân tạo (AI): 10 chủng loại Zombie điều phối qua NavMesh.  |
|  4. Đồng bộ đa nền tảng: Đạt chuẩn 60 FPS trên Android và iOS.          |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng hệ thống mạng đồng bộ thời gian thực (Real-time Multiplayer): Thiết lập cơ chế kết nối đa người chơi mượt mà cho 2 người (Co-op 2-player) dựa trên mô hình Client-Host kết hợp dịch vụ trung gian đám mây.
  2. Hiện thực hóa cơ chế vật lý chiến xa (Vehicular Combat Physics): Xây dựng hệ thống điều khiển xe dẫn động cầu sau (Rear-Wheel Drive - RWD) hỗ trợ kỹ thuật drift, va chạm vật lý chân thực với môi trường và bầy đàn kẻ địch.
  3. Phát triển hệ thống Trí tuệ nhân tạo bầy đàn (Swarm AI): Thiết kế và tối ưu thuật toán tìm đường, phân bổ hành vi cho 10 chủng loại zombie với các đặc tính chiến thuật riêng biệt.
  4. Xây dựng hệ thống tiến trình nhân vật (Progression System): Tích hợp tính năng tùy biến linh kiện cơ giới (khung gầm, động cơ, giáp) và kho vũ khí trang bị đa dạng.

Phương pháp tiếp cận và Phạm vi triển khai

  • Phương pháp tiếp cận: Sử dụng engine Unity kết hợp gói thư viện mạng cấp cao Netcode for GameObjects (NGO), tích hợp các dịch vụ đám mây Unity Gaming Services (Lobby & Relay) nhằm loại bỏ yêu cầu vận hành máy chủ chuyên dụng (Dedicated Server) tốn kém nhưng vẫn đảm bảo khả năng xuyên tường lửa (NAT Punchthrough) và bảo mật kết nối.
  • Kết quả kỳ vọng (Measurable Outcomes): Trò chơi vận hành ổn định ở mức 60 FPS trên các thiết bị di động tầm trung, độ trễ truyền gói tin mạng (Round-Trip Time - RTT) dưới 80ms trong điều kiện mạng di động 4G/Wi-Fi thông thường, hỗ trợ 3 màn chơi (levels) với 10 lớp kẻ thù xuất hiện đồng thời lên tới 50+ thực thể mà không gây tụt khung hình.
  • Phạm vi & Giới hạn: Tập trung tối ưu chế độ chơi phối hợp 2 người (2-Player Co-op PvE) trên hệ điều hành Android (từ Android 8.0 trở lên) và iOS (từ iOS 13 trở lên). Chưa tích hợp chế độ đối kháng nhiều người chơi quy mô lớn (PvP Battle Royale) và hệ thống chuyển giao quyền chủ phòng động (Host Migration).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khóa luận tiến hành khảo sát và đánh giá ưu/nhược điểm của các tựa game nổi tiếng cùng thể loại:

Tiêu chí Alien Shooter (Sigma Team) Left 4 Dead (Valve) World War Z (Saber Interactive) Giải pháp trong đồ án
Góc nhìn (Perspective) Top-down 3/4 Isometric First-Person (FPS) Third-Person (TPS) Top-down 3/4 Dynamic Camera
Cơ chế di chuyển Bộ binh (Đi bộ/Chạy) Bộ binh Bộ binh Chiến xa cơ giới (RWD Physics + Drift)
Hệ thống mạng Offline / Single-player P2P / Dedicated Server Dedicated Server Client-Server P2P Client-Host qua Unity Relay & Lobby
Cơ chế AI Spawn theo kịch bản tĩnh AI Director thích ứng Dynamic Swarm (Hàng ngàn zombie) NavMesh Agent Swarm + State Machine
Nền tảng hỗ trợ PC, Port Mobile cũ PC, Console PC, Console Tối ưu native cho Mobile (Android/iOS)

Phân loại yêu cầu hệ thống theo mô hình MoSCoW

  • Must Have (Bắt buộc phải có):
    • Đồng bộ vị trí, góc xoay chiến xa và đạn dược thời gian thực qua mạng P2P.
    • Hệ thống tạo phòng, tìm kiếm đại sảnh (Lobby) thông qua mã phòng (Join Code).
    • Mô phỏng chuyển động xe RWD, hệ thống bánh xe ma sát động (Drifting mechanics).
    • Tối thiểu 5 loại vũ khí và 10 chủng loại zombie cơ bản (Normal, Tanker, Bomber, Crafter, Rouser).
  • Should Have (Nên có):
    • Giao diện tùy biến linh kiện xe (Car Customization): thân xe, tháp pháo, hệ thống treo.
    • Tối ưu hóa Object Pooling cho toàn bộ đạn pháo và bầy zombie để tiết kiệm bộ nhớ RAM.
  • Could Have (Có thể có):
    • Tính năng AI Director điều phối nhịp độ xuất hiện của quái vật theo lượng máu còn lại của người chơi.
    • Chức năng tự động điều chỉnh độ phân giải đồ họa theo mức nhiệt độ thiết bị.
  • Won't Have (Chưa triển khai trong phiên bản này):
    • Chế độ tự động tìm phòng theo bậc xếp hạng (Ranked Matchmaking ELO).
    • Tự động thay thế máy chủ khi chủ phòng mất kết nối (Host Migration).

Thiết kế kiến trúc hệ thống

Hệ thống áp dụng mô hình kiến trúc phân tán kết hợp dịch vụ trung gian đám mây (Cloud-Assisted Peer-to-Peer Architecture):

graph TD
    subgraph "Unity Gaming Services (Cloud)"
        LobbyService["Unity Lobby Service<br/>(Quản lý phòng & Matchmaking)"]
        RelayService["Unity Relay Service<br/>(Chuyển tiếp gói tin DTLS/UDP)"]
    end

    subgraph "Host Client (Player 1)"
        HostApp["Game Engine Context"]
        NGO_Host["Netcode for GameObjects<br/>(Server Authority)"]
        PhysX_Host["Physics Engine & NavMesh Server"]
        HostApp --> NGO_Host
        NGO_Host --> PhysX_Host
    end

    subgraph "Remote Client (Player 2)"
        ClientApp["Game Engine Context"]
        NGO_Client["Netcode for GameObjects<br/>(Client Prediction)"]
        ClientApp --> NGO_Client
    end

    HostApp <-->|Xác thực phòng / Token| LobbyService
    ClientApp <-->|Tìm phòng / Join Code| LobbyService

    NGO_Host <==>|Tạo Allocation & Relay Server| RelayService
    NGO_Client <==>|Kết nối qua Relay Allocation ID| RelayService
    NGO_Host <-.->|Đồng bộ NetworkVariable & RPCs| NGO_Client

Công nghệ sử dụng và Thông số phiên bản

+-------------------------------------------------------------------------+
|                  TECHNOLOGY STACK & RUNTIME SPECS                       |
+-------------------------------------------------------------------------+
|  Game Engine          : Unity Engine 2022.3.x LTS (Universal RP)        |
|  Programming Language : C# (.NET Standard 2.1 / C# 9.0)                |
|  Networking Framework : Unity Netcode for GameObjects (NGO) v1.4.0      |
|  Transport Protocol   : Unity Transport Package (UTP) v2.0 (UDP/DTLS)   |
|  Multiplayer Services : Unity Lobby v1.1.0 & Unity Relay v1.0.5         |
|  Navigation System    : Unity AI Navigation / NavMesh v1.1.1            |
|  Input Management     : Unity Input System v1.5.1                       |
|  Local Storage        : BinaryFormatter / Encrypted JSON Data           |
+-------------------------------------------------------------------------+

Thiết kế cơ sở dữ liệu & Cấu trúc thực thể

Hệ thống sử dụng cơ sở dữ liệu cấu trúc cục bộ kết hợp đồng bộ hóa trạng thái phiên chơi qua bộ nhớ:

+-------------------------------------------------------------------------+
|                      DATABASE SCHEMA (LOCAL PERSISTENCE)                |
+-------------------------------------------------------------------------+
|  tbl_UserProfiles                                                       |
|  ├── UserID (UUID, PK)                                                  |
|  ├── DisplayName (VARCHAR[32])                                          |
|  ├── ExperiencePoints (BIGINT)                                          |
|  ├── SoftCurrency (INT)                                                 |
|  └── SelectedCarBuildID (FK -> tbl_CarBuilds.BuildID)                   |
|                                                                         |
|  tbl_CarBuilds                                                          |
|  ├── BuildID (UUID, PK)                                                 |
|  ├── UserID (FK -> tbl_UserProfiles.UserID)                             |
|  ├── ChassisID (FK -> tbl_CarParts.PartID)                              |
|  ├── EngineID (FK -> tbl_CarParts.PartID)                               |
|  ├── ArmorID (FK -> tbl_CarParts.PartID)                                |
|  └── WeaponID (FK -> tbl_CarParts.PartID)                               |
|                                                                         |
|  tbl_CarParts                                                           |
|  ├── PartID (VARCHAR[16], PK)                                           |
|  ├── PartType (ENUM: Chassis, Engine, Armor, Weapon)                    |
|  ├── BasePower (FLOAT)                                                  |
|  ├── WeightMultiplier (FLOAT)                                           |
|  └── UnlockCost (INT)                                                   |
+-------------------------------------------------------------------------+

Phương pháp phát triển phần mềm (Methodology)

Dự án áp dụng quy trình phát triển linh hoạt Agile/Scrum với thời gian thực hiện kéo dài 17 tuần (từ 27/02/2023 đến 25/06/2023), chia thành 4 giai đoạn cụ thể:

  1. Giai đoạn 1 (Tuần 1 - Tuần 2): Khảo sát tài liệu nghiên cứu, đánh giá các công nghệ mạng mạng NGO, Relay, Lobby; thu thập asset đồ họa 3D và âm thanh.
  2. Giai đoạn 2 (Tuần 3 - Tuần 5): Phân tích đặc tả yêu cầu Use-case, thiết kế sơ đồ tuần tự (Sequence Diagram), sơ đồ lớp (Class Diagram) và kiến trúc UI/UX.
  3. Giai đoạn 3 (Tuần 6 - Tuần 14): Lập trình cơ chế vật lý xe hơi, mạng P2P, hành vi bầy zombie, thiết kế 3 màn chơi và các cơ chế tương tác.
  4. Giai đoạn 4 (Tuần 15 - Tuần 17): Kiểm thử tích hợp (Integration Testing), đo lường hiệu năng (Profiling), cân bằng thông số chiến đấu và viết báo cáo khóa luận.

Implementation và kết quả

Quy trình phát triển & Hiện thực thuật toán cốt lõi

1. Thuật toán mô phỏng vật lý chuyển động và kỹ thuật Drift của xe RWD

Hệ thống sử dụng cơ chế tính toán mô-men xoắn (torque) truyền trực tiếp tới hai bánh sau, kết hợp tính toán góc trượt (slip angle) để thay đổi độ ma sát ngang (sideways friction) của bánh xe:

using UnityEngine;

public class CarPhysicsController : MonoBehaviour
{
    [Header("Wheel Colliders")]
    [SerializeField] private WheelCollider frontLeftWheel;
    [SerializeField] private WheelCollider frontRightWheel;
    [SerializeField] private WheelCollider rearLeftWheel;
    [SerializeField] private WheelCollider rearRightWheel;

    [Header("Vehicle Specifications")]
    public float motorTorque = 1500f;
    public float maxSteeringAngle = 30f;
    public float brakeTorque = 3000f;
    public float handbrakeFrictionMultiplier = 0.4f;

    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
        rb.centerOfMass = new Vector3(0, -0.35f, 0.1f); // Hạ trọng tâm để chống lật khi drift
    }

    public void ApplyMovement(float throttleInput, float steerInput, bool isHandbraking)
    {
        // 1. Điều hướng hai bánh trước
        float currentSteerAngle = steerInput * maxSteeringAngle;
        frontLeftWheel.steerAngle = currentSteerAngle;
        frontRightWheel.steerAngle = currentSteerAngle;

        // 2. Truyền động công suất động cơ cho hệ dẫn động cầu sau (RWD)
        float appliedTorque = throttleInput * motorTorque;
        rearLeftWheel.motorTorque = appliedTorque;
        rearRightWheel.motorTorque = appliedTorque;

        // 3. Xử lý kỹ thuật phanh tay và mô phỏng Drift
        if (isHandbraking)
        {
            rearLeftWheel.brakeTorque = brakeTorque;
            rearRightWheel.brakeTorque = brakeTorque;
            AdjustWheelFriction(rearLeftWheel, handbrakeFrictionMultiplier);
            AdjustWheelFriction(rearRightWheel, handbrakeFrictionMultiplier);
        }
        else
        {
            rearLeftWheel.brakeTorque = 0f;
            rearRightWheel.brakeTorque = 0f;
            ResetWheelFriction(rearLeftWheel);
            ResetWheelFriction(rearRightWheel);
        }
    }

    private void AdjustWheelFriction(WheelCollider wheel, float frictionExtremumFactor)
    {
        WheelFrictionCurve friction = wheel.sidewaysFriction;
        friction.extremumValue = frictionExtremumFactor;
        wheel.sidewaysFriction = friction;
    }

    private void ResetWheelFriction(WheelCollider wheel)
    {
        WheelFrictionCurve friction = wheel.sidewaysFriction;
        friction.extremumValue = 1.0f; // Giá trị ma sát tiêu chuẩn
        wheel.sidewaysFriction = friction;
    }
}

2. Cơ chế đồng bộ hỏa lực đa người chơi qua RPC trong Netcode for GameObjects

Để đảm bảo tính nhất quán dữ liệu mà không gây nghẽn băng thông, trạng thái khai hỏa được xác thực tại Host thông qua ServerRpc, sau đó phân phối hiệu ứng hình ảnh tới các Client qua ClientRpc:

using Unity.Netcode;
using UnityEngine;

public class NetworkWeaponController : NetworkBehaviour
{
    [SerializeField] private Transform muzzlePoint;
    [SerializeField] private GameObject bulletPrefab;
    [SerializeField] private float fireRate = 0.15f;
    [SerializeField] private int baseDamage = 45;

    private float nextFireTime;
    public NetworkVariable<int> SyncedAmmo = new NetworkVariable<int>(
        100, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);

    public void RequestFire()
    {
        if (IsOwner && Time.time >= nextFireTime && SyncedAmmo.Value > 0)
        {
            nextFireTime = Time.time + fireRate;
            FireServerRpc(muzzlePoint.position, muzzlePoint.rotation);
        }
    }

    [ServerRpc]
    private void FireServerRpc(Vector3 origin, Quaternion rotation)
    {
        if (SyncedAmmo.Value <= 0) return;

        SyncedAmmo.Value--;

        // Khởi tạo đạn vật lý trên máy chủ
        GameObject bullet = Instantiate(bulletPrefab, origin, rotation);
        if (bullet.TryGetComponent<NetworkObject>(out var netObj))
        {
            netObj.Spawn(true);
        }

        // Thông báo cho tất cả máy khách kích hoạt hiệu ứng FX/SFX
        PlayMuzzleFlashClientRpc();
    }

    [ClientRpc]
    private void PlayMuzzleFlashClientRpc()
    {
        // Kích hoạt Particle System tia lửa đầu nòng và âm thanh bắn
        AudioManager.Instance.PlaySound("LaserShot", transform.position);
    }
}

3. Hệ thống AI Zombie Swarm và cơ chế hỗ trợ của Rouser

Kẻ địch loại Rouser sử dụng thuật toán quét diện rộng để tìm các zombie đã bị tiêu diệt và hồi sinh chúng, đồng thời gia tăng 30% tốc độ chạy cho các zombie thông thường xung quanh:

using UnityEngine;
using UnityEngine.AI;

public class RouserAIController : MonoBehaviour
{
    private NavMeshAgent agent;
    [SerializeField] private float buffRadius = 12f;
    [SerializeField] private LayerMask enemyLayer;
    [SerializeField] private float screamCooldown = 10f;
    private float lastScreamTime;

    private void Awake() => agent = GetComponent<NavMeshAgent>();

    private void Update()
    {
        if (Time.time >= lastScreamTime + screamCooldown)
        {
            ExecuteRouserScream();
            lastScreamTime = Time.time;
        }
    }

    private void ExecuteRouserScream()
    {
        Collider[] affectedZombies = Physics.OverlapSphere(transform.position, buffRadius, enemyLayer);
        foreach (var col in affectedZombies)
        {
            if (col.TryGetComponent<ZombieBase>(out var zombie))
            {
                if (zombie.IsDead)
                {
                    zombie.ReviveWithHealth(0.5f); // Hồi sinh 50% HP
                }
                else
                {
                    zombie.ApplySpeedBuff(1.3f, 5.0f); // Tăng 30% tốc độ trong 5 giây
                }
            }
        }
        AudioManager.Instance.PlaySpatialSound("RouserScream", transform.position);
    }
}

Đánh giá và kiểm thử hệ thống

Ma trận kiểm thử đơn vị và kiểm thử tích hợp (Test Matrix)

Hạng mục kiểm thử Kịch bản kiểm thử Kết quả mong đợi Tỷ lệ thành công
Khởi tạo Lobby 100 lần tạo phòng liên tiếp Mã Join Code được trả về chính xác trong < 1.5s 100% (100/100)
Xuyên tường lửa Relay 2 Client thuộc 2 mạng NAT khác nhau Thiết lập kênh truyền DTLS không cần mở Port Router 98% (49/50)
Độ trễ truyền nhận đạn Đo RTT khi bắn liên tục 20 viên Sai lệch vị trí đạn giữa Host/Client < 0.05m 96%
Tải lượng AI NavMesh Xuất hiện 60 Zombie đồng thời CPU duy trì chu kỳ xử lý < 16.6ms (60 FPS) Đạt chuẩn

Benchmark hiệu năng trên các thiết bị thử nghiệm thực tế

+-------------------------------------------------------------------------+
|                  HARDWARE PERFORMANCE BENCHMARK MATRIX                  |
+-------------------------------------------------------------------------+
| Thiết bị kiểm thử       | FPS trung bình | RAM tiêu thụ | RTT (4G/Wi-Fi)|
+-------------------------+----------------+--------------+---------------+
| Xiaomi Poco F3 (Snap 870)  60.0 FPS         380 MB         42 ms        |
| Samsung Galaxy A52 (SD 720G) 58.4 FPS         365 MB         65 ms        |
| iPhone 11 (Apple A13)       60.0 FPS         310 MB         38 ms        |
| iPhone 8 (Apple A11)        54.2 FPS         295 MB         78 ms        |
+-------------------------------------------------------------------------+

Đổi mới và đóng góp

  1. Kết hợp độc đáo giữa Thể loại Top-down Shooter và Cơ chế Vật lý Lái xe (Vehicular Dynamics): Khác biệt hoàn toàn so với các game dạng bộ binh thông thường (Alien Shooter), người chơi phải kiểm soát quán tính, góc rê đuôi xe và độ bám đường của hệ dẫn động cầu sau RWD để vừa tiêu diệt kẻ địch, vừa mở đường thoát thân.
  2. Kiến trúc Serverless Multiplayer tối ưu chi phí: Khai thác toàn diện giải pháp Relay kết hợp Netcode for GameObjects, giúp người chơi tạo phòng và kết nối trực tiếp không cần thuê Dedicated Server định kỳ, giảm thiểu 100% chi phí duy trì hạ tầng máy chủ cho các nhóm phát triển độc lập (Indie developers).
  3. Thiết kế AI Zombie có tính tương hỗ chiến thuật sâu (Ecosystem Behavior): Thay vì chỉ di chuyển thẳng về phía mục tiêu, 10 chủng loại quái vật có sự liên kết logic:
    • Crafter: Thu thập tài nguyên trên bản đồ để chế tạo vũ khí cho Zombie thông thường.
    • Rouser: Kêu gọi bầy đàn, buff tốc độ và hồi sinh đồng đội đã tử trận.
    • Tanker: Đóng vai trò che chắn sát thương và ném chướng ngại vật vào phương tiện người chơi.
    • Bomber: Tự sát phát nổ tạo vùng cản địa hình.
+-------------------------------------------------------------------------+
|              SO SÁNH ĐỘNG HỌC VÀ HIỆU QUẢ TRUYỀN DẪN                    |
+-------------------------------------------------------------------------+
| Tiêu chí                     | Giải pháp đồ án   | Mô hình P2P cổ điển  |
+------------------------------+-------------------+----------------------+
| Yêu cầu cấu hình Port Router | Hoàn toàn không   | Bắt buộc Port Forward|
| Tiêu hao băng thông mạng      | Tối ưu (~18 KB/s) | Lớn (> 65 KB/s)      |
| Chống lộ địa chỉ IP Client   | 100% bảo mật Relay| Lộ IP trực tiếp      |
| Hiện tượng trượt vị trí đạn  | Giảm 85% qua RPC  | Dễ lệch pha dữ liệu  |
+-------------------------------------------------------------------------+

Ứng dụng thực tế và triển khai

Kịch bản triển khai thực tế

Tựa game được định hướng phát hành thương mại trên hai kho ứng dụng Google Play StoreApple App Store, nhắm tới nhóm đối tượng bạn bè muốn trải nghiệm cảm giác phối hợp vượt ải nhanh (10-15 phút/trận):

sequenceDiagram
    autonumber
    actor P1 as Người chơi 1 (Host)
    participant L as Unity Lobby
    participant R as Unity Relay
    actor P2 as Người chơi 2 (Client)

    P1->>L: Yêu cầu tạo phòng mới
    L-->>P1: Cấp Room ID & Token
    P1->>R: Khởi tạo Host Allocation
    R-->>P1: Trả về Join Code (VD: "Q8X9Z")
    P1->>L: Cập nhật Join Code vào Lobby Data
    P2->>L: Tìm kiếm danh sách phòng mở
    L-->>P2: Trả về danh sách kèm Join Code
    P2->>R: Gửi yêu cầu tham gia với Join Code "Q8X9Z"
    R-->>P2: Xác thực & Kết nối kênh truyền DTLS
    P1<-->>P2: Bắt đầu màn chơi Co-op (Đồng bộ qua Relay)

Phân tích hiệu quả đầu tư và chi phí vận hành (Cost-Benefit Analysis)

  • Chi phí máy chủ định kỳ (Hosting Costs): 0 VNĐ/tháng nhờ tận dụng gói miễn phí khởi đầu của Unity Gaming Services (hỗ trợ tới hàng ngàn người dùng hoạt động đồng thời - CCU).
  • Khả năng mở rộng (Scalability): Dễ dàng mở rộng từ 2 người chơi lên 4 người chơi trong cùng một phòng bằng cách điều chỉnh cấu hình MaxConnections trong NetworkManager mà không cần tái cấu trúc mã nguồn.
  • Lộ trình thương mại hóa (Monetization): Tích hợp mua sắm trong ứng dụng (IAP) đối với các gói ngoại trang xe (Skins, Decals, Paint jobs) và hệ thống Battle Pass nhiệm vụ mùa, tuyệt đối không tạo cơ chế Pay-to-Win làm ảnh hưởng trải nghiệm kỹ năng của game thủ hardcore.

Hạn chế và hướng phát triển

Các hạn chế kỹ thuật hiện tại

  1. Thiếu cơ chế Host Migration: Nếu người chơi đóng vai trò Host thoát game đột ngột hoặc mất kết nối mạng, phiên chơi của Client sẽ bị hủy bỏ ngay lập tức do máy chủ cục bộ bị đóng.
  2. Bản đồ tĩnh (Static Maps): Các màn chơi hiện tại được xây dựng theo layout cố định (Baked NavMesh), chưa hỗ trợ việc tự động sinh địa hình ngẫu nhiên (Procedural Generation).
  3. Giới hạn số lượng người chơi: Hệ thống logic hiện mới chỉ tối ưu hóa giao diện và cân bằng thông số chiến đấu cho tối đa 2 người chơi cùng lúc.

Hướng phát triển trong tương lai

  • Tích hợp Dedicated Game Server (DGS): Đưa logic điều khiển lên các cụm máy chủ container (sử dụng Docker kết hợp Kubernetes/Agones) để phục vụ các giải đấu xếp hạng cạnh tranh.
  • Hệ sinh thái địa hình động (Dynamic NavMesh Surface): Áp dụng gói NavMeshComponents thời gian thực để tạo các màn chơi biến đổi liên tục, xuất hiện các chướng ngại vật sụp đổ trong trận chiến.
  • Mở rộng kho vũ khí và linh kiện: Bổ sung các hệ thống vũ khí năng lượng, bẫy mìn EMP và hệ dẫn động 4 bánh toàn thời gian (AWD) cho phép leo trèo địa hình gồ ghề.

Đối tượng hưởng lợi

+-------------------------------------------------------------------------+
|                       ĐỐI TƯỢNG HƯỞNG LỢI DỰ ÁN                         |
+-------------------------------------------------------------------------+
|  Sinh viên / Học viên CNTT:                                             |
|  - Nắm vững tài liệu tham khảo hoàn chỉnh về Netcode for GameObjects.   |
|  - Hiểu rõ cách tích hợp Unity Relay, Lobby và mô phỏng vật lý xe hơi.  |
|                                                                         |
|  Lập trình viên Game (Indie Developers):                                |
|  - Tận dụng template kiến trúc mạng Serverless P2P không tốn chi phí.   |
|  - Tham khảo mẫu thiết kế Object Pooling và State Machine cho Swarm AI. |
|                                                                         |
|  Cộng đồng Game thủ Mobile:                                             |
|  - Trải nghiệm tựa game Co-op 2 người có chiều sâu gameplay chân thực.  |
|  - Giải trí với các pha Drift nghẹt thở và phối hợp chiến thuật cao độ. |
|                                                                         |
|  Nhà nghiên cứu / Giảng viên:                                           |
|  - Sử dụng làm case-study trực quan về việc áp dụng Netcode thế hệ mới  |
|    thay thế cho hệ thống UNet cũ đã bị khai tử.                         |
+-------------------------------------------------------------------------+

Câu hỏi thường gặp

1. Yêu cầu phần cứng và phần mềm tối thiểu để cài đặt và triển khai trò chơi là gì?

  • Đối với thiết bị người dùng cuối (Mobile Client):
    • Android: Phiên bản Android 8.0 (Oreo) trở lên, chip xử lý Snapdragon 660 / Helio G80, RAM tối thiểu 3GB, hỗ trợ OpenGL ES 3.0 hoặc Vulkan.
    • iOS: Phiên bản iOS 13.0 trở lên, từ dòng máy iPhone 8 trở về sau.
  • Đối với môi trường phát triển (Development Environment):
    • Unity Editor 2022.3 LTS trở lên, cài đặt kèm theo các module Android Build Support (OpenJDK, Android SDK & NDK) và iOS Build Support.
    • Bộ công cụ Visual Studio 2022 hoặc JetBrains Rider hỗ trợ C# 9.0.

2. Trò chơi giải quyết vấn đề nghẽn mạng và rớt gói tin trên mạng di động như thế nào?

Trò chơi sử dụng giao thức truyền tải UDP thông qua Unity Transport Package (UTP) kết hợp cơ chế nội suy chuyển động (Interpolation) và dự đoán vị trí phía máy khách (Client-side Prediction) của NGO. Khi tín hiệu mạng chập chờn, hệ thống tự động làm mượt đường đi của xe hơi dựa trên vectơ vận tốc cuối cùng, ngăn chặn hiện tượng nhân vật bị "dịch chuyển tức thời" (rubberbanding).

3. Tại sao đồ án lại lựa chọn mô hình P2P qua Unity Relay thay vì xây dựng máy chủ riêng (Dedicated Server)?

Việc xây dựng Dedicated Server đòi hỏi chi phí đầu tư hạ tầng lớn, duy trì máy chủ 24/7 và đòi hỏi các giải pháp DevOps phức tạp. Với phạm vi đồ án Co-op 2 người, giải pháp Client-Host kết hợp Unity Relay giúp tận dụng sức mạnh tính toán của máy Host, trong khi Relay chịu trách nhiệm chuyển tiếp gói tin, vượt qua mọi lớp tường lửa NAT một cách hoàn toàn tự động và bảo mật.

4. Hệ thống AI NavMesh xử lý thế nào khi có quá nhiều zombie cùng tìm đường một lúc?

Để tránh quá tải CPU, hệ thống áp dụng kỹ thuật Time-sliced Pathfinding (phân bổ lượt tính toán đường đi qua các khung hình) kết hợp nhóm cụm bầy đàn (Flocking behavior). Chỉ những zombie ở gần người chơi mới thực hiện tính toán NavMesh với tần suất 0.1s/lần, các zombie ở khoảng cách xa sẽ được hạ tần suất cập nhật đường đi xuống 0.5s - 1.0s/lần.

5. Làm thế nào để mở rộng trò chơi từ 2 người lên chế độ 4 người cùng chơi?

Cần thực hiện 3 bước:

  1. Nâng thông số MaxConnections trong cấu hình RelayService.Instance.CreateAllocationAsync() từ 2 lên 4.
  2. Mở rộng giao diện phòng chờ Lobby UI để hiển thị thêm 2 vị trí đại diện (Player Slots).
  3. Cân bằng lại chỉ số máu và lượng sát thương của các chủng loại zombie theo hệ số tỉ lệ nhân trắc (Scale factor) dựa trên tổng số người chơi thực tế trong phòng.

Kết luận

Đồ án khóa luận tốt nghiệp "Xây dựng game online cho 2 người chơi" của sinh viên Trần Nguyên Tiến Nam đã hoàn thành xuất sắc các mục tiêu đề ra:

  • Hiện thực hóa thành công một sản phẩm game hành động bắn súng góc nhìn từ trên xuống hoàn chỉnh trên nền tảng di động.
  • Ứng dụng xuất sắc các công nghệ mạng hiện đại bao gồm Unity Netcode for GameObjects, Unity Relay và Unity Lobby, giải quyết triệt để bài toán kết nối mạng P2P đa nền tảng không cần máy chủ chuyên dụng.
  • Kết hợp nhuần nhuyễn giữa cơ chế vật lý lái xe dẫn động cầu sau (RWD Drifting) và hệ thống trí tuệ nhân tạo bầy đàn 10 chủng loại quái vật phong phú.

Dự án không chỉ là minh chứng cho năng lực nghiên cứu, phân tích và làm chủ công nghệ kỹ thuật phần mềm mà còn là nguồn tài liệu tham khảo thực tiễn chất lượng cao cho cộng đồng lập trình viên quan tâm đến lĩnh vực phát triển game nhiều người chơi trên thiết bị di động.