Kiến trúc: Serverless (Không máy chủ)

Nền tảng:
Mobile
Tags:
Architecture
Network
Backend
Firebase

C# Code

// Đây là một snippet giải thích khái niệm và ví dụ giả mã.

/*
 * KIẾN TRÚC SERVERLESS CHO UNITY GAME
 *
 * Serverless không có nghĩa là không có server, mà là bạn (lập trình viên) không cần phải
 * trực tiếp quản lý, cấu hình hay duy trì một máy chủ ảo (VPS). Thay vào đó, bạn viết các
 * hàm (functions) và triển khai chúng lên một nền tảng đám mây (như Firebase Functions,
 * AWS Lambda, Azure Functions). Nền tảng này sẽ tự động chạy hàm đó khi có yêu cầu.
 *
 * 1. KHI NÀO DÙNG SERVERLESS TRONG UNITY?
 *    - Không dùng cho logic game thời gian thực (real-time gameplay) như Client-Server.
 *    - Rất phù hợp cho các tính năng không yêu cầu phản hồi tức thì và hoạt động theo sự kiện:
 *        + Bảng xếp hạng (Leaderboards): Gửi điểm số của người chơi lên một function để xử lý.
 *        + Dữ liệu người chơi: Lưu/tải tiến trình game.
 *        + Hệ thống tin nhắn, quà tặng.
 *        + Xác thực giao dịch IAP (In-App Purchase) với server.
 *        + Xử lý logic sau khi một trận đấu kết thúc.
 *
 * 2. VÍ DỤ: HỆ THỐNG LEADERBOARD VỚI FIREBASE FUNCTIONS
 *    - Nền tảng sử dụng: Unity (Client) và Firebase (Functions, Firestore).
 *
 *    a. Phía Client (Unity - C#):
 *       - Sau khi người chơi kết thúc màn chơi, Client lấy điểm số.
 *       - Client sử dụng một thư viện HTTP (ví dụ: UnityWebRequest) để gửi một request POST
 *         đến một URL endpoint của Firebase Function.
 */

 using UnityEngine;
 using UnityEngine.Networking;
 using System.Collections;

 public class LeaderboardSubmitter : MonoBehaviour
 {
     private const string submitScoreUrl = "https://your-region-your-project-id.cloudfunctions.net/submitScore";

     public void SubmitScore(string playerName, int score)
     {
         StartCoroutine(PostScore(playerName, score));
     }

     private IEnumerator PostScore(string name, int score)
     {
         WWWForm form = new WWWForm();
         form.AddField("playerName", name);
         form.AddField("score", score.ToString());

         using (UnityWebRequest www = UnityWebRequest.Post(submitScoreUrl, form))
         {
             // Gửi request và chờ phản hồi
             yield return www.SendWebRequest();

             if (www.result == UnityWebRequest.Result.Success)
             {
                 Debug.Log("Score submitted successfully: " + www.downloadHandler.text);
             }
             else
             {
                 Debug.LogError("Error submitting score: " + www.error);
             }
         }
     }
 }

 /*
 *    b. Phía Backend (Firebase Functions - TypeScript/Node.js):
 *       - Bạn viết một function tên là `submitScore`.
 *       - Function này sẽ được kích hoạt khi có một HTTP request đến endpoint của nó.
 *       - Function đọc dữ liệu (playerName, score) từ request, xác thực, và lưu vào
 *         cơ sở dữ liệu Firestore.
 */

 /*
 const functions = require("firebase-functions");
 const admin = require("firebase-admin");
 admin.initializeApp();

 exports.submitScore = functions.https.onRequest(async (req, res) => {
   // Chỉ cho phép phương thức POST
   if (req.method !== "POST") {
     res.status(405).send("Method Not Allowed");
     return;
   }

   const playerName = req.body.playerName;
   const score = parseInt(req.body.score);

   // Xác thực dữ liệu (ví dụ đơn giản)
   if (!playerName || isNaN(score)) {
     res.status(400).send("Invalid data.");
     return;
   }

   // Lưu vào Firestore
   await admin.firestore().collection("scores").add({
     name: playerName,
     score: score,
     timestamp: admin.firestore.FieldValue.serverTimestamp(),
   });

   res.status(200).send({ message: "Score saved!" });
 });
 */

/*
 * 3. ƯU ĐIỂM:
 *    - Tiết kiệm chi phí: Bạn chỉ trả tiền khi function được thực thi.
 *    - Tự động co giãn (Scalability): Nền tảng tự xử lý hàng ngàn request cùng lúc.
 *    - Không cần quản lý server: Không lo về OS, patching, security...
 *
 * 4. NHƯỢC ĐIỂM:
 *    - Cold Starts: Lần đầu tiên một function được gọi sau một thời gian không hoạt động, nó
 *      có thể mất vài giây để khởi động, gây ra độ trễ.
 *    - Giới hạn thời gian thực thi: Các function thường có giới hạn thời gian chạy (ví dụ: vài phút).
 */

Sử dụng các dịch vụ đám mây như Firebase Functions hoặc AWS Lambda để chạy code backend cho các tính năng phụ trợ mà không cần quản lý một máy chủ chuyên dụng.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Nền tảng của game multiplayer. Hiểu rõ vai trò của Client (người chơi) và Server (máy chủ), cách chúng giao tiếp và tại sao Server phải là nơi quyết định logic game để chống hack/cheat.

3D
2D
Architecture
Network
Multiplayer

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization

Giới thiệu về mẫu thiết kế Dependency Injection (DI) và tại sao nó giúp code của bạn dễ bảo trì, dễ test và giảm sự phụ thuộc cứng (hard dependencies).

Architecture
Design Pattern
Optimization

Hướng dẫn cài đặt và sử dụng Zenject, một framework Dependency Injection phổ biến cho Unity, để quản lý các phụ thuộc trong dự án một cách hiệu quả.

Architecture
Design Pattern
DI
Zenject
Optimization

Một mẫu Singleton cơ bản trong Unity để đảm bảo chỉ có một thực thể của một lớp tồn tại trong game. Hữu ích cho các hệ thống toàn cục như GameManager, AudioManager.

Design Pattern
Singleton
Architecture

Expression Trees là một tính năng C# nâng cao cho phép bạn biểu diễn code dưới dạng cây dữ liệu. Trong Unity, nó mở ra khả năng xây dựng các hệ thống phức tạp như trình tạo truy vấn động, hệ thống AI có thể sửa đổi hành vi tại runtime, hoặc các công cụ editor tùy chỉnh mà không cần sinh mã code mới.

Architecture
Algorithm
Optimization
C#

Một hệ thống kho đồ cơ bản sử dụng ScriptableObject cho dữ liệu vật phẩm và quản lý các ô chứa trong UI.

UI
Gameplay
Inventory
ScriptableObject
Architecture

Một cấu trúc cơ bản để tạo, theo dõi và hoàn thành nhiệm vụ, sử dụng ScriptableObject để định nghĩa nhiệm vụ.

Gameplay
Quest
ScriptableObject
Architecture

Một cấu trúc Finite State Machine (FSM) đơn giản sử dụng enum và switch-case để quản lý các trạng thái khác nhau của AI, như đi tuần, truy đuổi và tấn công.

AI
Architecture
Design Pattern
Gameplay

Một hệ thống linh hoạt cho phép người chơi tương tác với nhiều loại đối tượng (cửa, vật phẩm, NPC, công tắc) chỉ bằng một nút bấm (E) khi ở trong tầm, kèm hiển thị gợi ý trên màn hình.

Interaction
Gameplay
Player
Architecture
Interface
UI