# การบันทึกบนคลาวด์สำหรับเกม PlayDrop

บันทึกและโหลดความคืบหน้าของผู้เล่นด้วย sdk.me.appData และ updateAppData สำหรับผู้เยี่ยมชมและผู้เล่นที่เข้าสู่ระบบ พร้อมกฎการเขียน การแสดงตัวอย่าง และการเล่นออฟไลน์

Source: https://www.playdrop.ai/th/create/learn/cloud-saves

การบันทึกบนคลาวด์เก็บความคืบหน้าของผู้เล่นแต่ละคนในเกมของคุณไว้บน PlayDrop เพื่อให้ความคืบหน้าตามผู้เล่นไปจากเว็บไซต์ถึงแอป ระบบเก็บออบเจ็กต์ JSON หนึ่งชิ้นต่อผู้เล่นหนึ่งคนต่อเกมหนึ่งเกม ไม่ต้องใช้เซิร์ฟเวอร์หรือห้องผู้เล่นหลายคน

## อ่านและเขียน

หลัง `init()` แล้ว `sdk.me.appData` คือสแนปช็อตที่บันทึกไว้: `{ data, seq, ts_event, ts_arrival }` หรือ `null` ก่อนการบันทึกครั้งแรก อ่านออบเจ็กต์ของคุณจาก `data` เขียนทั้งออบเจ็กต์ด้วย `updateAppData` ซึ่งจะส่งคืนสแนปช็อตที่บันทึกแล้วและอัปเดต `sdk.me.appData`

```js
const sdk = await playdrop.init();
let progress = { level: 1, coins: 0, ...(sdk.me.appData?.data ?? {}) };
let queue = Promise.resolve();

// Resolves with the saved snapshot; rejects when the save failed.
function save(changes) {
  progress = { ...progress, ...changes };
  const snapshot = { ...progress };
  const attempt = queue.then(() => sdk.me.updateAppData(snapshot));
  queue = attempt.catch(() => {}); // a failed save must not block the next one
  return attempt;
}

try {
  await save({ level: 2 });
  showSaved();
} catch (error) {
  showSaveError(); // progress stays in memory; the next save sends it again
}
```

- การเขียนแต่ละครั้งจะแทนที่ออบเจ็กต์ที่บันทึกไว้ทั้งหมด: เก็บทุกฟิลด์ที่ยังต้องใช้ไว้
- เขียนตามลำดับทีละครั้งเหมือนตัวอย่างด้านบน เพื่อไม่ให้ข้อมูลบันทึกเก่าไปทับข้อมูลที่ใหม่กว่า และให้คิวทำงานต่อได้แม้การบันทึกครั้งก่อนล้มเหลว
- แสดง "บันทึกแล้ว" หลังจาก promise เสร็จสิ้นเท่านั้น การเปลี่ยน `appData.data` ในหน่วยความจำไม่ได้บันทึกอะไรเลย
- `appData` ไม่มีเมธอด `get`, `set` หรือ `save`

## ควรบันทึกเมื่อไร

บันทึกที่จุดเช็กพอยต์ ตอนจบด่าน และหลังการซื้อ แทนที่จะบันทึกทุกเฟรม ห้ามบันทึกระหว่างการแสดงตัวอย่างหรือการจับภาพเด็ดขาด: เขียนเฉพาะเมื่อ `sdk.host.phase` เป็น `play` เก็บข้อมูลบันทึกให้เล็กและใส่เวอร์ชันด้วยฟิลด์ของคุณเอง เช่น `saveVersion: 2` เพื่อให้เกมเวอร์ชันหลังย้ายข้อมูลได้

## ผู้เยี่ยมชมและผู้เล่นที่เข้าสู่ระบบ

ไม่ต้องตรวจสอบ `sdk.me.isLoggedIn` ก่อนบันทึก: ผู้เยี่ยมชมของ PlayDrop ก็เก็บข้อมูลบันทึกไว้ได้เช่นกัน ผู้เล่นที่ไม่มีเซสชันเลยจะเก็บข้อมูลบันทึกไว้ในหน่วยความจำเฉพาะการเข้าชมครั้งนั้น การเขียนที่เสร็จสิ้นจึงไม่ได้พิสูจน์ว่าข้อมูลถึงคลาวด์แล้ว ใช้ `isLoggedIn` เฉพาะกับฟีเจอร์ที่ต้องมีบัญชีจริง เช่น การซื้อและการเล่นหลายคนผ่านเซิร์ฟเวอร์ที่ PlayDrop โฮสต์

## ออฟไลน์

ในเบราว์เซอร์ การบันทึกต้องใช้การเชื่อมต่อและไม่มีคิวออฟไลน์: เล่นต่อเมื่อบันทึกล้มเหลวและลองอีกครั้งที่จุดเช็กพอยต์ถัดไป โฮสต์ที่ประกาศว่ารองรับข้อมูลบนอุปกรณ์ เช่น แอป PlayDrop ที่เล่นออฟไลน์ได้ จะเก็บข้อมูลบันทึกไว้บนอุปกรณ์และซิงค์เมื่อออนไลน์

## สิ่งที่การบันทึกไม่ใช่

ข้อมูลบันทึกเป็นของผู้เล่นหนึ่งคนในเกมหนึ่งเกมแบบส่วนตัว แยกจาก[ลีดเดอร์บอร์ด](https://www.playdrop.ai/th/create/learn/leaderboards)และ[ความสำเร็จ](https://www.playdrop.ai/th/create/learn/achievements) ซึ่งมี API ของตัวเองและแสดงบน PlayDrop สถานะที่ผู้เล่นใช้ร่วมกัน เช่น แมตช์หรือโลก ควรอยู่บน[เซิร์ฟเวอร์เกม](https://www.playdrop.ai/th/create/learn/game-servers)ในคอลเลกชัน MongoDB ของเกมคุณ

## ทดสอบ

ข้อมูลบันทึกผูกกับเกมที่อัปโหลดแล้ว อัปโหลดเวอร์ชันส่วนตัวอย่างน้อยหนึ่งครั้ง แล้วทดสอบจาก `url` ในใบยืนยัน หรือจากเฟรม Dev ในเครื่องที่อธิบายไว้ใน[การเผยแพร่จากแอป AI ของคุณ](https://www.playdrop.ai/th/create/learn/mcp-publishing)

## คู่มือที่เกี่ยวข้อง

- [ลีดเดอร์บอร์ด](https://www.playdrop.ai/th/create/learn/leaderboards): ประกาศลีดเดอร์บอร์ดใน catalogue.json ส่งคะแนนด้วย sdk.leaderboards และแสดงอันดับสูงสุดกับผู้เล่นรอบข้าง พร้อมชนิดคะแนน ขีดจำกัด และกฎการอัปเดต
- [ความสำเร็จ](https://www.playdrop.ai/th/create/learn/achievements): ประกาศความสำเร็จแบบมาตรฐานและแบบสะสมพร้อมไอคอนใน catalogue.json แล้วปลดล็อกและรายงานความคืบหน้าด้วย sdk.achievements
- [เซิร์ฟเวอร์เกมเรียลไทม์](https://www.playdrop.ai/th/create/learn/game-servers): รันเซิร์ฟเวอร์ Colyseus 0.17 ที่โฮสต์ให้พร้อมฐานข้อมูล MongoDB สำหรับเกมของคุณ เชื่อมต่อจากเบราว์เซอร์ด้วย SDK ทดสอบด้วยผู้เล่นสองคน และรู้ขีดจำกัด
