Memulai
Tutorial menengah

Simpan data pemain dengan data store standar

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Data store adalah layanan yang dapat Anda gunakan untuk menyimpan dan memuat data pemain yang persisten di berbagai sesi pemain yang berbeda. Mereka menyimpan informasi penting, seperti kemajuan atau inventaris pemain, dan memungkinkan Anda untuk mengambilnya untuk pemain di lain waktu ketika mereka bergabung kembali dengan game Anda. Tanpa data store, seorang pemain akan kehilangan semua kemajuan mereka setiap kali mereka meninggalkan game.

Ada dua jenis data store: standar dan terurut. Tutorial ini menggunakan data store standar, yang menyimpan data seperti angka, string, dan tabel yang tidak perlu diurutkan atau diberi peringkat.

Menggunakan berkas Gold Rush data store tutorial - Start .rbxl sebagai tempat awal dan berkas Gold Rush data store tutorial - Complete .rbxl sebagai referensi, tutorial ini memberikan fondasi yang Anda butuhkan untuk menyimpan kemajuan pemain dan membuat game yang lebih konsisten, termasuk panduan tentang:

  • Menyimpan dan memuat jumlah emas yang telah dikumpulkan pemain.
  • Memperbarui UI untuk menampilkan inventaris emas pemain.
  • Secara otomatis menyimpan inventaris emas pemain setiap 30 detik.
  • Menyimpan posisi pemain ketika mereka meninggalkan game.
  • Mengembalikan posisi pemain ketika mereka bergabung kembali dengan game.

Pada akhir tutorial ini, Anda seharusnya memiliki dua skrip dengan data store di bawah ServerScriptService:

  1. Skrip GoldManager yang diperbarui yang melacak, memuat, dan secara otomatis menyimpan emas pemain.
  2. Skrip PositionManager yang diperbarui yang menyimpan posisi pemain ketika mereka meninggalkan game dan mengembalikan posisi mereka ketika mereka kembali ke game.

Aktifkan akses Studio ke layanan API

Data store tidak disimpan secara lokal di perangkat Anda, jadi game Anda bergantung pada komunikasi server-ke-server dengan backend Roblox untuk menggunakannya. Secara default, Studio membatasi komunikasi ini untuk mencegah penyalahgunaan atau penggunaan yang tidak disengaja. Akses ke layanan API di Studio dinonaktifkan sampai Anda secara eksplisit mengaktifkannya untuk memastikan bahwa hanya game yang terpercaya yang dapat membaca dan menulis ke server backend Roblox.

Untuk mengaktifkan akses Studio ke layanan API sehingga Anda dapat menggunakan data store:

  1. Buka berkas Gold Rush data store tutorial - Start .rbxl di Studio dan buat salinan lokal.
  2. Kembali ke Studio, buka FilePengaturan PengalamanKeamanan.
  3. Aktifkan Aktifkan Akses Studio ke Layanan API.
  4. Simpan perubahan Anda.

Buat data store standar

Saat membuat data store, Anda harus selalu memanggil DataStoreService dari Script sisi server. Melakukannya penting karena:

  • Roblox memblokir semua akses data store dari klien sehingga hanya server yang memiliki izin untuk mengakses dan memodifikasi data pemain yang persisten.
  • Skrip sisi server berjalan di lingkungan terpusat, memastikan bahwa data yang dibaca dan ditulis ke data store Anda akurat dan valid.
  • Karena skrip sisi klien berjalan di perangkat pemain, pemain mana pun dapat mengeksploitasi game dan mencuri atau menimpa data pemain lain jika klien memiliki akses ke data store Anda.

Anda juga harus memberi data store Anda nama yang unik agar data Anda tetap terorganisir dan untuk mencegahnya bertabrakan atau berbenturan di data store yang berbeda. Dalam tutorial ini, data store yang menyimpan dan menyimpan inventaris emas pemain disebut PlayerGold.

Untuk membuat data store PlayerGold:

  1. Buka skrip GoldManager yang ada di bawah ServerScriptService.

  2. Di bawah layanan lain di bagian atas skrip, inisialisasi DataStoreService dan panggil GetDataStore dengan string "PlayerGold".


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

Simpan dan muat data pemain

Data store terdiri dari kunci, yang mengidentifikasi data, dan nilai, yang menyimpan data.

KunciNilai
DeskripsiSebuah kunci adalah pengidentifikasi unik yang dapat Anda gunakan untuk mengakses sepotong data tertentu.

Kunci memungkinkan Anda mengorganisir data Anda sehingga Anda dapat dengan mudah mengelola dan memecahkan masalahnya.
Sebuah nilai adalah data aktual yang ingin Anda simpan atau muat, seperti inventaris pemain atau pengaturan mereka.

Nilai memungkinkan Anda menyimpan kemajuan di antara sesi, serta mengambil data pemain ketika mereka bergabung kembali dengan game Anda.
Format yang DiizinkanHanya dapat berupa string.Dapat berupa angka, string, boolean, atau tabel.
Contoh"Player_A", "TopScore", "GameSetting"100, "Level_5", true, {gold = 100, level = 5}

Dalam tutorial ini, kuncinya adalah userId pemain dan nilainya adalah jumlah emas yang telah mereka kumpulkan. Untuk menggunakan kunci dan nilai ini untuk menyimpan dan memuat data pemain:

  1. Di dalam skrip GoldManager, tambahkan fungsi pembantu bernama saveGold untuk menyimpan emas pemain ke data store PlayerGold.


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` adalah ID unik dari pemain
    -- `value` adalah jumlah emas yang akan disimpan untuk pemain tersebut
    goldStore:SetAsync(userId, value)
    end)
    end
  2. OPTIONAL
    Tambahkan peringatan ke saveGold yang mencetak ID pemain dan pesan kesalahan. Meskipun tidak wajib, langkah ini adalah praktik yang baik untuk memudahkan pemecahan masalah jika fungsi Anda gagal.


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` adalah ID unik dari pemain
    -- `value` adalah jumlah emas yang akan disimpan untuk pemain tersebut
    goldStore:SetAsync(userId, value)
    end)
    if not success then
    warn("[SAVE ERROR] Tidak dapat menyimpan emas untuk", userId, ":", err)
    end
    end
  3. Modifikasi event onPlayerAdded untuk memuat emas pemain ketika mereka pertama kali bergabung dengan game. Fungsi onPlayerAdded yang diperbarui:

    • Mencoba memuat konten di dalam data store PlayerGold. Ini mengembalikan emas yang disimpan pemain atau nilai 0 jika pemain tidak memiliki emas atau belum pernah bermain game sebelumnya.
    • Memberikan log debug untuk membantu Anda memecahkan masalah kode lebih mudah. Log debug ini mencakup emas yang disimpan pemain yang bergabung, atau pesan kesalahan jika onPlayerAdded tidak dapat mengakses data store.
    • Memperbarui UI untuk menampilkan emas yang disimpan pemain di layar mereka.

    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("Tidak dapat memuat emas untuk", player.Name)
    end
    end
  4. Modifikasi event onPlayerRemoving untuk memanggil fungsi saveGold yang Anda buat sebelumnya dan menyimpan emas pemain ketika mereka meninggalkan game.


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

Simpan data pemain secara otomatis

Menyimpan data pemain secara otomatis adalah praktik yang baik karena melindungi pemain dari kehilangan data mereka. Jika Anda hanya menyimpan data pemain ketika mereka meninggalkan game dengan onPlayerRemoving, Anda mungkin kehilangan kemajuan terbaru mereka jika mereka terputus dari server secara tak terduga.

Untuk menyimpan data pemain secara otomatis:

  1. Buat konstanta baru untuk menentukan seberapa sering Anda ingin game Anda secara otomatis menyimpan data pemain. Konstanta adalah variabel yang nilainya tidak berubah selama game berlangsung. Anda dapat menggunakan konstanta ini untuk merujuk ke interval penyimpanan otomatis sepanjang skrip Anda dan untuk dengan mudah menyesuaikan frekuensi penyimpanan otomatis.


    -- Bilangan ini dalam detik
    local AUTOSAVE_INTERVAL = 30
  2. Tambahkan sebuah korutin penyimpanan otomatis ke fungsi onPlayerAdded yang ada untuk membuat loop latar belakang yang berjalan saat pemain berada dalam game. Korutin adalah fungsi yang berjalan secara asinkron; ia dapat pause pada titik tertentu, melanjutkan dari tempatnya berhenti, dan berjalan sejajar dengan bagian lain dari skrip Anda tanpa memblokirnya.

    Dalam skrip ini, loop latar belakang korutin penyimpanan otomatis menunggu untuk jumlah detik di dalam konstanta AUTOSAVE_INTERVAL Anda, kemudian memanggil fungsi saveGold yang Anda buat sebelumnya.


    coroutine.wrap(function()
    while player.Parent do
    task.wait(AUTOSAVE_INTERVAL)
    if playerGold[userId] then
    print("[AUTOSAVE] Menyimpan", playerGold[userId], "emas untuk", player.Name)
    saveGold(userId, playerGold[userId])
    end
    end
    end)()

Simpan dan muat posisi pemain

Untuk menyimpan posisi pemain, kerjakan dengan Character mereka daripada objek Player itu sendiri. Character seorang pemain mewakili model fisik mereka dalam dunia 3D dan memiliki koordinat untuk posisi dan orientasi mereka saat ini, sementara objek Player hanya mewakili akun pengguna.

Karena data store hanya dapat menyimpan tipe data dasar seperti angka, string, dan tabel, Anda tidak dapat langsung menyimpan objek kompleks seperti nilai Vector3 atau CFrame. Untuk menyimpan posisi pemain, Anda perlu membaginya menjadi tiga angka terpisah (koordinat X, Y, dan Z) dan menyimpannya secara individual. Saat memuat posisi nanti, Anda dapat membangun kembali Vector3 menggunakan koordinat yang disimpan.

Untuk menyimpan dan memuat posisi karakter:

  1. Buka skrip PositionManager yang ada di bawah ServerScriptService.

  2. Di bagian atas skrip, inisialisasi DataStoreService dan panggil GetDataStore dengan string "PlayerPosition".


    local DataStoreService = game:GetService("DataStoreService")
    local positionStore = DataStoreService:GetDataStore("PlayerPosition")
  3. Tambahkan fungsi pembantu bernama savePosition yang menerima userId pemain dan posisi Vector3. Karena Anda tidak dapat menyimpan nilai Vector3 secara langsung, ubah posisi menjadi tabel angka 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
    Tambahkan peringatan ke savePosition yang mencetak pesan kesalahan dan nama pemain yang gagal Anda simpan posisinya. Meskipun tidak wajib, langkah ini adalah praktik yang baik untuk memudahkan pemecahan masalah jika fungsi Anda gagal.


    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("Tidak dapat menyimpan posisi untuk", player.Name, ":", err)
    end
    end
  5. Tambahkan fungsi pembantu lain bernama loadPosition untuk memuat koordinat yang disimpan untuk pemain di data store PlayerPosition. Gunakan PivotTo untuk mengembalikan posisi karakter di dunia. Karena posisi yang disimpan pemain dikembalikan sebagai tabel, Anda harus membangun kembali Vector3 dan kemudian mengubahnya menjadi CFrame untuk memindahkan karakter.


    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("Posisi untuk", player.Name, "telah dipulihkan")
    character:PivotTo(CFrame.new(pos))
    elseif not success then
    warn("Tidak dapat memuat posisi untuk", player.Name)
    end
    end
  6. Modifikasi event onPlayerAdded untuk menyiapkan logika posisi untuk setiap pemain yang bergabung dengan game Anda. Di dalam fungsi onPlayerAdded yang diperbarui:

    • CharacterAdded memanggil loadPosition untuk mengembalikan lokasi terakhir karakter yang diketahui ketika karakter pemain muncul.
    • CharacterRemoving memanggil savePosition untuk menyimpan posisi saat ini dari karakter pemain jika mereka dihapus dari game.
    • GetPivot mendapatkan lokasi tepat karakter di dunia saat mereka dihapus.

    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)

Kode akhir

Lihat potongan kode berikut untuk skrip GoldManager dan PositionManager yang lengkap. Anda dapat menempel dan menjalankannya langsung di berkas Gold Rush save data tutorial - Start .rbxl di Studio.

GoldManager


-- Dapatkan layanan
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local DataStoreService = game:GetService("DataStoreService")
-- Event remote untuk memperbarui UI
local uiEvent = ReplicatedStorage:WaitForChild("UIEvent")
-- Data store untuk menyimpan kepingan emas pemain
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Tabel untuk menyimpan kepingan emas pemain untuk satu sesi
local playerGold = {}
-- Konstanta
local GOLD_VALUE = 10 -- Nilai masing-masing kepingan emas
local GOLD_REGEN_DELAY = 2 -- Penundaan sebelum kepingan muncul kembali (dalam detik)
local AUTOSAVE_INTERVAL = 30 -- Seberapa sering kepingan pemain disimpan (dalam detik)
-- Fungsi untuk menangani pemain yang mengumpulkan kepingan emas
local function processGoldTouch(chunk, player)
-- Sembunyikan kepingan ketika pemain mengumpulkannya
chunk.Parent = nil
-- Tambahkan kepingan ke skor emas sesi pemain
local userId = player.UserId
playerGold[userId] = (playerGold[userId] or 0) + GOLD_VALUE
print(player.Name, "sekarang memiliki", playerGold[userId], "emas")
-- Perbarui UI untuk mencerminkan skor emas baru untuk sesi ini
uiEvent:FireClient(player, {
gold = playerGold[userId],
doTween = true,
showAlert = false
})
-- Tunggu sebentar dan kemudian muncul kembali kepingan emas yang baru saja dikumpulkan
task.delay(GOLD_REGEN_DELAY, function()
chunk.Parent = workspace.GoldChunks
end)
end
-- Loop melalui semua bagian yang ditandai dengan "Gold" dan sambungkan mereka ke deteksi sentuhan
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
-- Fungsi untuk menyimpan emas pemain ke data store
local function saveGold(player, value)
local userId = player.UserId
local success, err = pcall(function()
goldStore:SetAsync(userId, value)
end)
if not success then
warn("Tidak dapat menyimpan emas untuk", player.Name, ":", err)
end
end
-- Fungsi untuk menangani pemain yang bergabung dengan game
local function onPlayerAdded(player)
local userId = player.UserId
print(player.Name, "telah bergabung dengan game")
-- Mencoba memuat emas pemain dari data store
local success, storedGold = pcall(function()
return goldStore:GetAsync(userId)
end)
if success then
-- Set skor emas sesi saat ini menggunakan nilai data store untuk pemain
local currentGold = storedGold or 0
playerGold[userId] = currentGold
-- Perbarui UI dengan nilai data store untuk pemain
uiEvent:FireClient(player, {
gold = currentGold,
doTween = false,
showAlert = false
})
print("Memuat", currentGold, "emas untuk", player.Name)
else
-- Beri tahu pemain bahwa emas mereka tidak dapat dimuat
uiEvent:FireClient(player, { showAlert = true })
warn("Tidak dapat memuat emas untuk", player.Name)
end
-- Mulai korutin penyimpanan otomatis untuk menyimpan emas pemain setiap 30 detik
coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
saveGold(player, playerGold[userId])
print("Menyimpan otomatis", playerGold[userId], "emas untuk", player.Name)
end
end
end)()
end
-- Fungsi untuk menangani pemain yang meninggalkan game
local function onPlayerRemoving(player)
local userId = player.UserId
print(player.Name, "telah meninggalkan game")
-- Periksa apakah emas pemain dilacak
if playerGold[userId] then
-- Simpan emas pemain ke data store sebelum mereka pergi
saveGold(player, playerGold[userId])
end
end
-- Sambungkan event pemain yang bergabung dan meninggalkan
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

PositionManager


-- Dapatkan layanan
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- Data store untuk menyimpan posisi pemain
local positionStore = DataStoreService:GetDataStore("PlayerPosition")
-- Fungsi untuk menyimpan posisi pemain sebagai tabel {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("Tidak dapat menyimpan posisi untuk", player.Name, ":", err)
end
end
-- Fungsi untuk memuat posisi terakhir yang disimpan pemain dan memindahkan karakter mereka
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("Posisi untuk", player.Name, "telah dipulihkan")
character:PivotTo(CFrame.new(pos))
elseif not success then
warn("Tidak dapat memuat posisi untuk", player.Name)
end
end
-- Fungsi untuk menangani pemain yang bergabung dengan game
local function onPlayerAdded(player)
local userId = player.UserId
-- Mencoba memuat posisi pemain ketika karakter mereka muncul
player.CharacterAdded:Connect(function(character)
loadPosition(player, character)
end)
-- Simpan posisi pemain ketika karakter mereka dihapus
player.CharacterRemoving:Connect(function(character)
local pos = character:GetPivot().Position
savePosition(player, pos)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.