คู่มือการใช้งานระดับกลาง

บันทึกข้อมูลผู้เล่นด้วยมาตรฐานข้อมูลจัดเก็บ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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

มีข้อมูลจัดเก็บสองประเภท: มาตรฐานและตามลำดับ ในบทแนะนำนี้ใช้ ข้อมูลจัดเก็บมาตรฐาน ซึ่งเก็บข้อมูล เช่น ตัวเลข สตริง และตารางที่ไม่จำเป็นต้องจัดอันดับหรือจัดเรียง

การใช้ Gold Rush data store tutorial - Start ไฟล์ .rbxl เป็นจุดเริ่มต้นและ Gold Rush data store tutorial - Complete ไฟล์ .rbxl เป็นข้อมูลอ้างอิง บทแนะนำนี้ให้พื้นฐานที่คุณต้องการในการบันทึกความก้าวหน้าของผู้เล่นและสร้างเกมที่มีความสม่ำเสมอมากขึ้น รวมถึงแนวทางเกี่ยวกับ:

  • การบันทึกและโหลดจำนวนทองที่ผู้เล่นสะสม
  • การปรับปรุง UI เพื่อแสดงสินค้าคงคลังทองของผู้เล่น
  • การบันทึกสินค้าคงคลังทองของผู้เล่นโดยอัตโนมัติทุก 30 วินาที
  • การบันทึกตำแหน่งของผู้เล่นเมื่อพวกเขาออกจากเกม
  • การคืนตำแหน่งของผู้เล่นเมื่อพวกเขาเข้าร่วมเกมอีกครั้ง

เมื่อสิ้นสุดบทแนะนำนี้ คุณควรมีสองสคริปต์ที่มีข้อมูลจัดเก็บภายใต้ ServerScriptService:

  1. สคริปต์ GoldManager ที่อัปเดต ซึ่งติดตาม โหลด และบันทึกทองของผู้เล่นโดยอัตโนมัติ
  2. สคริปต์ PositionManager ที่อัปเดต ซึ่งบันทึกตำแหน่งของผู้เล่นเมื่อพวกเขาออกจากเกมและคืนตำแหน่งให้กับพวกเขาเมื่อกลับเข้าสู่เกม

เปิดการเข้าถึง Studio สู่บริการ API

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

เพื่อเปิดการเข้าถึง Studio สู่บริการ API เพื่อให้คุณสามารถใช้ข้อมูลจัดเก็บ:

  1. เปิดไฟล์ Gold Rush data store tutorial - Start .rbxl ใน Studio และสร้างสำเนาในเครื่อง
  2. กลับไปที่ Studio ไปที่ ไฟล์การตั้งค่าประสบการณ์ความปลอดภัย
  3. เปิดใช้งาน เปิดการเข้าถึง Studio สู่บริการ API
  4. บันทึกการเปลี่ยนแปลงของคุณ

สร้างข้อมูลจัดเก็บมาตรฐาน

เมื่อสร้างข้อมูลจัดเก็บ คุณควรเรียก DataStoreService จาก Script ด้านเซิร์ฟเวอร์เสมอ การทำเช่นนี้มีความสำคัญเพราะ:

  • Roblox จะบล็อกการเข้าถึงข้อมูลจัดเก็บทั้งหมดจากฝั่งลูกค้า เพื่อให้เฉพาะเซิร์ฟเวอร์เท่านั้นที่มีสิทธิ์ในการเข้าถึงและแก้ไขข้อมูลผู้เล่นที่คงอยู่
  • สคริปต์ฝั่งเซิร์ฟเวอร์ทำงานในสภาพแวดล้อมที่รวมศูนย์ โดยทำให้แน่ใจว่าข้อมูลที่อ่านและเขียนในข้อมูลจัดเก็บของคุณมีความถูกต้องและถูกต้อง
  • เนื่องจากสคริปต์ฝั่งลูกค้าเรียกใช้งานบนอุปกรณ์ของผู้เล่น ผู้เล่นใดๆ ก็อาจใช้ประโยชน์จากเกมและขโมยหรือเขียนทับข้อมูลของผู้เล่นคนอื่นหากลูกค้าสามารถเข้าถึงข้อมูลจัดเก็บของคุณได้

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

เพื่อสร้างข้อมูลจัดเก็บ PlayerGold:

  1. เปิดสคริปต์ GoldManager ที่มีอยู่ภายใต้ ServerScriptService

  2. ที่ด้านบนของสคริปต์ ให้อินิชial DataStoreService และเรียก GetDataStore ด้วยสตริง "PlayerGold"


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")

บันทึกและโหลดข้อมูลผู้เล่น

ข้อมูลจัดเก็บประกอบด้วยกุญแจซึ่งใช้ระบุข้อมูลและค่า ซึ่งเก็บข้อมูล

กุญแจค่า
คำอธิบายกุญแจเป็นตัวระบุเฉพาะที่คุณสามารถใช้เพื่อเข้าถึงข้อมูลชิ้นเฉพาะ

กุญแจช่วยให้คุณจัดระเบียบข้อมูลของคุณเพื่อให้คุณสามารถจัดการและแก้ไขข้อผิดพลาดได้อย่างง่ายดาย
ค่าคือข้อมูลจริงที่คุณต้องการบันทึกหรือโหลด เช่น สินค้าคงคลังของผู้เล่นหรือการตั้งค่าของพวกเขา

ค่าช่วยให้คุณเก็บความก้าวหน้าระหว่างเซสชัน และเรียกคืนข้อมูลผู้เล่นในครั้งถัดไปที่พวกเขาเข้าร่วมเกมของคุณ
รูปแบบที่อนุญาตสามารถเป็นสตริงเท่านั้นสามารถเป็นตัวเลข สตริง บูลีน หรือ ตารา
ตัวอย่าง"Player_A", "TopScore", "GameSetting"100, "Level_5", true, {gold = 100, level = 5}

ในบทแนะนำนี้ กุญแจคือ userId ของผู้เล่นและค่า คือจำนวนทองที่พวกเขาได้สะสม เพื่อใช้กุญแจและค่าเหล่านี้ในการบันทึกและโหลดข้อมูลผู้เล่น:

  1. ในสคริปต์ GoldManager ให้เพิ่มฟังก์ชันช่วย saveGold เพื่อบันทึกทองของผู้เล่นไปยังข้อมูลจัดเก็บ PlayerGold


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` คือ ID เฉพาะของผู้เล่น
    -- `value` คือจำนวนทองที่ต้องบันทึกสำหรับผู้เล่นนั้น
    goldStore:SetAsync(userId, value)
    end)
    end
  2. OPTIONAL
    เพิ่มการแจ้งเตือนใน saveGold ที่พิมพ์ ID ของผู้เล่นและข้อความแสดงข้อผิดพลาด ขณะที่ไม่เป็นสิ่งจำเป็น ขั้นตอนนี้ถือเป็นการปฏิบัติที่ดีเพื่อให้การแก้ข้อผิดพลาดง่ายขึ้นในกรณีที่ฟังก์ชันของคุณล้มเหลว


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` คือ ID เฉพาะของผู้เล่น
    -- `value` คือจำนวนทองที่ต้องบันทึกสำหรับผู้เล่นนั้น
    goldStore:SetAsync(userId, value)
    end)
    if not success then
    warn("[SAVE ERROR] ไม่สามารถบันทึกทองสำหรับ", userId, ":", err)
    end
    end
  3. แก้ไขเหตุการณ์ onPlayerAdded เพื่อโหลดทองของผู้เล่นเมื่อพวกเขาเข้าร่วมเกมครั้งแรก ฟังก์ชัน onPlayerAdded ที่อัปเดต:

    • พยายามโหลดเนื้อหาภายในข้อมูลจัดเก็บ PlayerGold ซึ่งมันจะคืนค่าทองที่บันทึกไว้ของผู้เล่นหรือค่า 0 หากผู้เล่นไม่มีทองหรือไม่เคยเล่นเกมนี้มาก่อน
    • ให้คุณมีบันทึกการดีบักเพื่อช่วยให้คุณสามารถดีบักโค้ดได้ง่ายขึ้น บันทึกดีบักนี้รวมถึงทองที่บันทึกได้ของผู้เข้าร่วม หรือข้อความแสดงข้อผิดพลาดหาก onPlayerAdded ไม่สามารถเข้าถึงข้อมูลจัดเก็บได้
    • อัปเดต UI เพื่อแสดงทองที่บันทึกได้ของผู้เล่นบนหน้าจอของพวกเขา

    local function onPlayerAdded(player)
    local userId = player.UserId
    local success, storedGold = pcall(function()
    return goldStore:GetAsync(userId)
    end)
    if success then
    local currentGold = storedGold or 0
    playerGold[userId] = currentGold
    uiEvent:FireClient(player, {
    gold = currentGold,
    doTween = false,
    showAlert = not success
    })
    else
    uiEvent:FireClient(player, { showAlert = true })
    warn("ไม่สามารถโหลดทองสำหรับ", player.Name)
    end
    end
  4. แก้ไขเหตุการณ์ onPlayerRemoving เพื่อเรียกฟังก์ชัน saveGold ที่คุณสร้างขึ้นก่อนหน้านี้และบันทึกทองของผู้เล่นเมื่อพวกเขาออกจากเกม


    local function onPlayerRemoving(player)
    local userId = player.UserId
    if playerGold[userId] then
    saveGold(userId, playerGold[userId])
    end
    end

บันทึกข้อมูลผู้เล่นโดยอัตโนมัติ

การบันทึกข้อมูลผู้เล่นโดยอัตโนมัติเป็นการปฏิบัติที่ดีเพราะมันปกป้องผู้เล่นจากการสูญเสียข้อมูลของพวกเขา หากคุณบันทึกข้อมูลของผู้เล่นเพียงเมื่อพวกเขาออกจากเกมด้วย onPlayerRemoving คุณอาจสูญเสียความก้าวล่าสุดของพวกเขาหากพวกเขาตัดการเชื่อมต่อจากเซิร์ฟเวอร์โดยไม่คาดคิด

เพื่อบันทึกข้อมูลผู้เล่นโดยอัตโนมัติ:

  1. สร้างค่าคงที่ใหม่เพื่อตัดสินใจว่าคุณต้องการให้เกมบันทึกข้อมูลของผู้เล่นโดยอัตโนมัติบ่อยเพียงใด ค่าคงที่คือหมวดที่ค่าของมันไม่เปลี่ยนแปลงในขณะที่เกมกำลังทำงาน คุณสามารถใช้ค่าคงที่นี้เพื่ออ้างอิงถึงช่วงเวลาการบันทึกโดยอัตโนมัติในสคริปต์ของคุณและเพื่อปรับความถี่ในการบันทึกโดยง่าย


    -- ตัวเลขนี้เป็นวินาที
    local AUTOSAVE_INTERVAL = 30
  2. เพิ่ม coroutine การบันทึกโดยอัตโนมัติไปยังฟังก์ชัน onPlayerAdded ที่มีอยู่เพื่อสร้างลูปพื้นหลังที่ทำงานในขณะที่ผู้เล่นอยู่ภายในเกม coroutine เป็นฟังก์ชันที่ทำงานแบบอะซิงโครนัส; มันสามารถหยุดชั่วคราวที่บางจุด เริ่มต้นใหม่จากจุดที่มันหยุดเดิน และทำงานขนานกับส่วนอื่นของสคริปต์ของคุณได้โดยไม่ทำให้บล็อก

ในสคริปต์นี้ ลูปพื้นหลังของ coroutine จะรอจำนวนวินาทีในค่าคงที่ AUTOSAVE_INTERVAL จากนั้นเรียกฟังก์ชัน saveGold ที่คุณสร้างขึ้นเมื่อก่อน


coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
print("[AUTOSAVE] บันทึก", playerGold[userId], "ทองสำหรับ", player.Name)
saveGold(userId, playerGold[userId])
end
end
end)()

บันทึกและโหลดตำแหน่งของผู้เล่น

ในการบันทึกตำแหน่งของผู้เล่น ให้ทำงานกับ Character แทนที่จะเป็นวัตถุ Player เอง ตัวละครของผู้เล่นแสดงถึงโมเดลทางกายภาพของพวกเขาในโลก 3D และมีพิกัดสำหรับตำแหน่งและทิศทางปัจจุบันของพวกเขา ในขณะที่วัตถุ Player แสดงถึงบัญชีผู้ใช้เท่านั้น

เนื่องจากข้อมูลจัดเก็บสามารถบันทึกได้เฉพาะประเภทข้อมูลพื้นฐาน เช่น ตัวเลข สตริง และตาราง คุณจึงไม่สามารถจัดเก็บอ็อบเจ็กต์ที่ซับซ้อนเช่นค่าของ Vector3 หรือ CFrame ได้โดยตรง เพื่อบันทึกตำแหน่งของผู้เล่น คุณต้องแยกมันออกเป็นตัวเลขสามตัว (พิกัด X, Y และ Z) และบันทึกมันอย่างแยกย่อย เมื่อโหลดตำแหน่งในภายหลัง คุณสามารถสร้าง Vector3 ขึ้นมาใหม่โดยใช้พิกัดที่บันทึกไว้

เพื่อบันทึกและโหลดตำแหน่งของตัวละคร:

  1. เปิดสคริปต์ PositionManager ที่มีอยู่ภายใต้ ServerScriptService

  2. ที่ด้านบนของสคริปต์ ให้เริ่มต้น DataStoreService และเรียก GetDataStore โดยใช้สตริง "PlayerPosition"


    local DataStoreService = game:GetService("DataStoreService")
    local positionStore = DataStoreService:GetDataStore("PlayerPosition")
  3. เพิ่มฟังก์ชันช่วยที่เรียกว่า savePosition ซึ่งรับ userId ของผู้เล่นและตำแหน่ง Vector3 เนื่องจากคุณไม่สามารถบันทึกค่าของ Vector3 ได้โดยตรง ให้แปลงตำแหน่งเป็นตารางของตัวเลข X, Y, Z


    local function savePosition(player, position)
    local userId = player.UserId
    local success, err = pcall(function()
    positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
    end)
    end
  4. OPTIONAL
    เพิ่มการแจ้งเตือนใน savePosition ที่พิมพ์ข้อความแสดงข้อผิดพลาดและชื่อของผู้เล่นที่คุณไม่สามารถบันทึกตำแหน่งได้ สำหรับการแก้ข้อผิดพลาดได้ง่ายขึ้นในกรณีที่ฟังก์ชันของคุณล้มเหลว


    local function savePosition(player, position)
    local userId = player.UserId
    local success, err = pcall(function()
    positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
    end)
    if not success then
    warn("ไม่สามารถบันทึกตำแหน่งสำหรับ", player.Name, ":", err)
    end
    end
  5. เพิ่มฟังก์ชันช่วยอีกฟังก์ชันหนึ่งชื่อ loadPosition เพื่อโหลดพิกัดที่บันทึกไว้สำหรับผู้เล่นในข้อมูลจัดเก็บ PlayerPosition ใช้ PivotTo ฟังก์ชันเพื่อคืนตำแหน่งของตัวละครในโลก เนื่องจากตำแหน่งที่บันทึกของผู้เล่นถูกคืนค่ามาเป็นตาราง คุณต้องสร้าง Vector3 ขึ้นมาใหม่ จากนั้นแปลงเป็น CFrame เพื่อย้ายตัวละคร


    local function loadPosition(userId, character)
    local userId = player.UserId
    local success, savedCoords = pcall(function()
    return positionStore:GetAsync(userId)
    end)
    if success and savedCoords then
    local pos = Vector3.new(savedCoords[1], savedCoords[2], savedCoords[3])
    print("คืนตำแหน่งสำหรับ", player.Name)
    character:PivotTo(CFrame.new(pos))
    elseif not success then
    warn("ไม่สามารถโหลดตำแหน่งสำหรับ", player.Name)
    end
    end
  6. แก้ไขเหตุการณ์ onPlayerAdded เพื่อจัดตั้งตรรกะตำแหน่งสำหรับผู้เล่นแต่ละคนที่เข้าร่วมเกมของคุณ ภายในฟังก์ชัน onPlayerAdded ที่อัปเดต:

    • CharacterAdded เรียก loadPosition เพื่อคืนตำแหน่งสุดท้ายที่รู้จักของตัวละครเมื่อผู้เล่นเข้ามา
    • CharacterRemoving เรียก savePosition เพื่อบันทึกตำแหน่งปัจจุบันของตัวละครของผู้เล่นหากพวกเขาถูกลบออกจากเกม
    • GetPivot ดึงตำแหน่งที่แน่นอนของตัวละครในโลกในขณะที่พวกเขาถูกลบออก

    local function onPlayerAdded(player)
    local userId = player.UserId
    player.CharacterAdded:Connect(function(character)
    loadPosition(player, character)
    end)
    player.CharacterRemoving:Connect(function(character)
    local pos = character:GetPivot().Position
    savePosition(player, pos)
    end)
    end
    Player.PlayerAdded:Connect(onPlayerAdded)

โค้ดสุดท้าย

ดูสคริปต์โค้ดด้านล่างสำหรับสคริปต์ GoldManager และ PositionManager ที่สมบูรณ์ คุณสามารถวางและเรียกใช้ได้โดยตรงในไฟล์ Gold Rush save data tutorial - Start .rbxl ใน Studio

GoldManager


-- รับบริการ
-- รับบริการ
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local DataStoreService = game:GetService("DataStoreService")
-- อีเวนต์ระยะไกลเพื่ออัปเดต UI
local uiEvent = ReplicatedStorage:WaitForChild("UIEvent")
-- ข้อมูลจัดเก็บเพื่อบันทึกทองของผู้เล่น
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- ตารางเพื่อเก็บทองของผู้เล่นสำหรับเซสชันเดียว
local playerGold = {}
-- ค่าคงที่
local GOLD_VALUE = 10 -- มูลค่าของทองแต่ละชิ้น
local GOLD_REGEN_DELAY = 2 -- ความล่าช้าก่อนที่ชิ้นทองจะเกิดใหม่ (เป็นวินาที)
local AUTOSAVE_INTERVAL = 30 -- ความถี่ในการบันทึกชิ้นทองของผู้เล่น (เป็นวินาที)
-- ฟังก์ชันเพื่อจัดการการสะสมทองของผู้เล่น
local function processGoldTouch(chunk, player)
-- ซ่อนชิ้นทองเมื่อผู้เล่นเก็บมันไป
chunk.Parent = nil
-- เพิ่มชิ้นทองลงในคะแนนทองในเซสชันของผู้เล่น
local userId = player.UserId
playerGold[userId] = (playerGold[userId] or 0) + GOLD_VALUE
print(player.Name, "ตอนนี้มี", playerGold[userId], "ทอง")
-- อัปเดต UI เพื่อสะท้อนคะแนนทองใหม่สำหรับเซสชันนี้
uiEvent:FireClient(player, {
gold = playerGold[userId],
doTween = true,
showAlert = false
})
-- รอสักครู่และจากนั้นเกิดชิ้นทองที่เพิ่งถูกเก็บ
task.delay(GOLD_REGEN_DELAY, function()
chunk.Parent = workspace.GoldChunks
end)
end
-- ลูปผ่านส่วนทั้งหมดที่ติดแท็กด้วย "Gold" และเชื่อมต่อกับการตรวจจับการสัมผัส
for _, chunk in ipairs(CollectionService:GetTagged("Gold")) do
chunk.Touched:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
processGoldTouch(chunk, player)
end
end)
end
-- ฟังก์ชันเพื่อบันทึกทองของผู้เล่นไปยังข้อมูลจัดเก็บ
local function saveGold(player, value)
local userId = player.UserId
local success, err = pcall(function()
goldStore:SetAsync(userId, value)
end)
if not success then
warn("ไม่สามารถบันทึกทองสำหรับ", player.Name, ":", err)
end
end
-- ฟังก์ชันเพื่อจัดการผู้เล่นที่เข้าร่วมเกม
local function onPlayerAdded(player)
local userId = player.UserId
print(player.Name, "เข้าร่วมเกม")
-- พยายามโหลดทองของผู้เล่นจากข้อมูลจัดเก็บ
local success, storedGold = pcall(function()
return goldStore:GetAsync(userId)
end)
if success then
-- ตั้งค่าคะแนนทองในเซสชันปัจจุบันโดยใช้ค่าจากข้อมูลจัดเก็บสำหรับผู้เล่น
local currentGold = storedGold or 0
playerGold[userId] = currentGold
-- อัปเดต UI ด้วยค่าจากข้อมูลจัดเก็บสำหรับผู้เล่น
uiEvent:FireClient(player, {
gold = currentGold,
doTween = false,
showAlert = false
})
print("โหลด", currentGold, "ทองสำหรับ", player.Name)
else
-- แจ้งผู้เล่นว่าทองของพวกเขาไม่สามารถโหลดได้
uiEvent:FireClient(player, { showAlert = true })
warn("ไม่สามารถโหลดทองสำหรับ", player.Name)
end
-- เริ่ม coroutine การบันทึกโดยอัตโนมัติเพื่อบันทึกทองของผู้เล่นทุก 30 วินาที
coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
saveGold(player, playerGold[userId])
print("บันทึกโดยอัตโนมัติ", playerGold[userId], "ทองสำหรับ", player.Name)
end
end
end)()
end
-- ฟังก์ชันเพื่อจัดการผู้เล่นที่ออกจากเกม
local function onPlayerRemoving(player)
local userId = player.UserId
print(player.Name, "ออกจากเกม")
-- ตรวจสอบว่าทองของผู้เล่นถูกติดตามหรือไม่
if playerGold[userId] then
-- บันทึกทองของผู้เล่นไปยังข้อมูลจัดเก็บก่อนที่พวกเขาจะออก
saveGold(player, playerGold[userId])
end
end
-- เชื่อมต่อเหตุการณ์ผู้เล่นที่เข้าร่วมและออกจากเกม
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

PositionManager


-- รับบริการ
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- ข้อมูลจัดเก็บเพื่อบันทึกตำแหน่งของผู้เล่น
local positionStore = DataStoreService:GetDataStore("PlayerPosition")
-- ฟังก์ชันเพื่อบันทึกตำแหน่งของผู้เล่นเป็นตารางของ {X, Y, Z}
local function savePosition(player, position)
local userId = player.UserId
local success, err = pcall(function()
positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
end)
if not success then
warn("ไม่สามารถบันทึกตำแหน่งสำหรับ", player.Name, ":", err)
end
end
-- ฟังก์ชันเพื่อโหลดตำแหน่งสุดท้ายที่บันทึกไว้ของผู้เล่นและย้ายตัวละครของพวกเขา
local function loadPosition(player, character)
local userId = player.UserId
local success, savedCoords = pcall(function()
return positionStore:GetAsync(userId)
end)
if success and savedCoords then
local pos = Vector3.new(savedCoords[1], savedCoords[2], savedCoords[3])
print("คืนตำแหน่งสำหรับ", player.Name)
character:PivotTo(CFrame.new(pos))
elseif not success then
warn("ไม่สามารถโหลดตำแหน่งสำหรับ", player.Name)
end
end
-- ฟังก์ชันเพื่อจัดการผู้เล่นที่เข้าร่วมเกม
local function onPlayerAdded(player)
local userId = player.UserId
-- พยายามโหลดตำแหน่งของผู้เล่นเมื่อตัวละครของพวกเขาเกิด
player.CharacterAdded:Connect(function(character)
loadPosition(player, character)
end)
-- บันทึกตำแหน่งของผู้เล่นเมื่อตัวละครของพวกเขาถูกลบ
player.CharacterRemoving:Connect(function(character)
local pos = character:GetPivot().Position
savePosition(player, pos)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ