Permainan sering perlu menyimpan data permanen di antara sesi, seperti tingkat pemain, poin pengalaman, uang, barang inventaris, lokasi, dan banyak lagi.
Tutorial ini menunjukkan cara membuat toko data dasar , menyimpan data pemain, dan membaca data kembali ke sesi permainan.
Aktifkan akses Studio
Secara default, permainan yang diuji di Studio tidak dapat mengakses penyimpanan data, jadi Anda harus mengaktifkannya terlebih dahulu:
Publikasikan pengalaman.
Pilih File dan Pengaturan Permainan .
Di bagian Keamanan , aktifkan Aktifkan Akses Studio ke Layanan API dan klik Simpan .
Buat penyimpanan data
Penyimpanan data membutuhkan nama unik **** .Contoh ini membuat penyimpanan data bernama PemainEmas yang menyimpan emas setiap pemain di penyimpanan permanen:
Buat Script di dalam ServerScriptService yang disebut GoldManager .
Penyimpanan data dikelola oleh DataStoreService, jadi dapatkan layanannya:
local DataStoreService = game:GetService("DataStoreService")Panggil DataStoreService:GetDataStore() dengan string "PlayerGold" .Metode ini mengakses penyimpanan data Pemain Emas jika sudah ada.Jika tidak ada, metode membuat penyimpanan data baru dan menamainya PlayerGold .
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
Menyimpan data
Toko data pada dasarnya adalah kamus, seperti tabel Luau.Setiap nilai di penyimpanan data diindeks oleh kunci unik , yang mungkin menjadi unik pemain atau hanya sebuah string berlabel untuk promosi permainan.
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Untuk menyimpan data pemain di toko data:
Buat variabel dengan nama playerUserID untuk kunci penyimpanan data. Kemudian, gunakan playerGold untuk menyimpan jumlah emas awal pemain.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Kunci dan nilai penyedia datalocal playerUserID = 505306092local playerGold = 250Untuk menyimpan data ke penyimpanan data PlayerGold, panggil SetAsync dalam panggilan terlindungi, dengan mengirimkan variabel kunci dan nilai yang sebelumnya dibuat.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Kunci dan nilai penyedia datalocal playerUserID = 505306092local playerGold = 250-- Tetapkan kunci penyimpan datalocal success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
Fungsi seperti SetAsync() adalah panggilan jaringan yang kadang-kadang bisa gagal.Seperti yang ditunjukkan di atas, pcall() digunakan untuk mendeteksi dan menangani ketika kegagalan seperti itu terjadi
Dalam bentuk paling dasarnya, pcall() menerima fungsi dan mengembalikan dua nilai:
- Status, yang adalah true jika fungsi dieksekusi tanpa kesalahan, atau false jika tidak.
- Nilai pengembalian fungsi atau pesan kesalahan
Sampel di atas memeriksa status pada baris 13. Jika SetAsync() gagal karena alasan apa pun, sampel menampilkan kesalahan di jendela Output.
Membaca data
Untuk membaca data dari penyimpan data, panggil GetAsync() dengan nama kunci yang diinginkan.
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Kunci dan nilai penyedia data
local playerUserID = 505306092
local playerGold = 250
-- Tetapkan kunci penyimpan data
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Membaca kunci penyimpan data
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end
Untuk menguji skrip, klik Jalankan dan perhatikan nilai currentGold yang dicetak ke jendela Keluaran .Perhatikan bahwa mungkin diperlukan beberapa detik, karena fungsi harus terhubung ke server penyimpan data.
Baca dan simpan secara otomatis
Skrip sebelumnya berfungsi, tetapi memiliki masalah fundamental: ia termasuk nilai yang diberi kode keras untuk playerUserID dan playerGold , jadi tidak mendukung banyak pemain dengan jumlah emas yang berbeda.Solusi yang lebih realistis membaca nilai emas ketika pemain terhubung ke pengalaman dan kemudian menyimpannya saat pemain pergi.Pendekatan ini berarti menghubungkan panggilan penyimpanan data ke peristiwa dari layanan Players
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Tambahkan nilai emas untuk setiap pemain ke tabel lokal untuk menghindari menyerang data
-- simpan berulang kali.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Membaca kunci penyimpan data
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Menguji peningkatan emas
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Tetapkan kunci penyimpan data
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Bersihkan entri sehingga tabel tidak tumbuh selama masa pakai server
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
Baca dan simpan posisi karakter
Untuk menyimpan posisi pemain, Anda bekerja dengan Character daripada Player, tetapi prinsipnya miripKali ini, buat Script dalam ServerScriptService yang disebut Manajer Posisi :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Memuat posisi pada penambahan karakter
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Tangani pemain respawn saat mati
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Simpan posisi saat menghapus karakter
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
Skrip ini menambahkan toko data baru, playerPositionStore .Karena penyimpanan data hanya menyimpan jenis dasar daripada objek, Anda harus menyimpan koordinat X, Y, dan Z sebagai angka individu daripada satu nilai Vector3 atau CFrame tunggalSaat Anda menguji pengalaman Anda, bergerakkan karakter Anda di sekitar.Perhatikan bagaimana karakter Anda kembali ke posisi yang sama saat Anda menguji pengalaman Anda lain kali.
Contoh proyek
Sekarang Anda memahami penggunaan penyimpanan data dasar, uji coba di game contoh Gold Rush.Anda juga dapat mengedit permainan di Studio dan menjelajahi skrip Manajer Emas yang ditingkatkan, yang menampilkan emas sebagai bagian dari UI dan termasuk penyimpanan otomatis.