저장 데이터

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

게임은 종종 플레이어의 레벨, 경험 포인트, 돈, 인벤토리 아이템, 위치 등의 영구적인 데이터를 세션 사이에 저장해야 합니다.

이 자습서에서는 기본 데이터 저장소 를 만드는 방법, 플레이어 데이터를 저장하는 방법 및 데이터를 게임 세션으로 다시 읽는 방법을 보여줍니다.

Studio 액세스 설정

기본적으로 Studio에서 테스트된 게임은 데이터 저장소에 액세스할 수 없으므로 먼저 활성화해야 합니다:

  1. 파일게임 설정 을 선택하십시오.

  2. 보안 섹션에서 스튜디오 API 서비스에 대한 액세스 활성화 를 켜고 저장 을 클릭합니다.

데이터 저장소 만들기

데이터 저장소는 고유한 이름 을 필요로 합니다.이 예제에서는 영구 저장소에 각 플레이어의 골드를 저장하는 데이터 저장소 PlayerGold 을 만듭니다:

  1. Create a Script within ServerScriptService called GoldManager .

  2. 데이터 저장소는 DataStoreService에서 관리되므로 서비스를 가져옵니다:


    local DataStoreService = game:GetService("DataStoreService")
  3. 문자열 DataStoreService:GetDataStore() 을 사용하여 호출 "PlayerGold".이 메서드는 이미 존재하는 경우 플레이어골드 데이터 저장소에 액세스합니다존재하지 않으면 메서드가 새 데이터 저장소를 만들고 이름을 PlayerGold 로 지정합니다.


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

저장 데이터

데이터 저장소는 루아우 테이블과 같은 사전과 같습니다.데이터 저장소의 각 값은 고유한 에 의해 인덱싱되며, 플레이어의 독특한 UserId 또는 게임 홍보를 위한 명명된 문자열일 수 있습니다.

KeyValue
3125060850
35167597920
50530609278000

데이터 저장소에 플레이어 데이터를 저장하려면:

  1. 데이터 저장소 키에 대한 변수 playerUserID 를 만들고, playerGold 를 사용하여 플레이어의 시작 골드 금액을 저장하십시오.


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")
    -- 데이터 저장소 키 및 값
    local playerUserID = 505306092
    local playerGold = 250
  2. 데이터를 PlayerGold에 저장하려면 보호된 호출 내에서 SetAsync를 호출하여 이전에 만든 키와 값 변수를 전달하십시오.


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")
    -- 데이터 저장소 키 및 값
    local playerUserID = 505306092
    local playerGold = 250
    -- 데이터 스토어 키 설정
    local success, error = pcall(function()
    goldStore:SetAsync(playerUserID, playerGold)
    end)
    if not success then
    warn(error)
    end

SetAsync()와 같은 기능은 때때로 실패할 수 있는 네트워크 호출입니다.위에 표시된 것처럼, pcall()는 이러한 오류가 발생할 때 감지하고 처리하는 데 사용됩니다.

가장 기본적인 형태로, pcall() 는 함수를 수락하고 두 값을 반환합니다:

  • 함수가 오류 없이 실행된 경우의 상태는 true이고, 그렇지 않으면 false입니다.
  • 함수의 반환 값 또는 오류 메시지.

위의 샘플은 라인 13에서 상태를 확인합니다. SetAsync() 에서 어떤 이유로든 실패하면 샘플은 출력 창에 오류를 표시합니다.

데이터를 읽기

데이터 저장소에서 데이터를 읽으려면 원하는 키 이름으로 GetAsync()를 호출하십시오.


local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- 데이터 저장소 키 및 값
local playerUserID = 505306092
local playerGold = 250
-- 데이터 스토어 키 설정
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- 데이터 저장소 키 읽기
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end

스크립트를 테스트하려면 실행 을 클릭하고 currentGold 창에 인쇄된 을 확인하십시오.함수가 데이터 저장소 서버에 연결해야 하므로 몇 초가 걸릴 수 있습니다.

자동으로 읽고 저장하기

이전 스크립트는 작동하지만 근본적인 문제가 있습니다: playerUserIDplayerGold 에 대한 하드코딩된 값을 포함하므로 금의 양이 다른 여러 플레이어를 지원하지 않습니다.더 현실적인 솔루션은 플레이어가 경험에 연결하면 골드 값을 읽고 플레이어가 떠날 때 저장합니다.이 방법은 데이터 저장소 호출을 이벤트에서 Players로 연결하는 것을 의미합니다.


local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- 각 플레이어에 대한 골드 값을 로컬 테이블에 추가하여 데이터 충돌 방지
-- 반복해서 저장합니다.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- 데이터 저장소 키 읽기
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
-- 테스트 증가 골드
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- 데이터 스토어 키 설정
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- 서버의 수명 동안 테이블이 증가하지 않도록 입력을 정리합니다
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

문자 위치 읽기 및 저장

플레이어 위치를 저장하려면 Character 대신 Player 와 함께 작업하지만, 원리는 유사합니다.이번에는 에서 PositionManager라는 이름의 내부를 생성하십시오:


local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- 문자 추가 시 위치 불러오기
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
-- 사망 시 플레이어 리스폰 처리 Handle player respawn on death
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- 문자 제거 시 위치 저장
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)

이 스크립트는 새로운 데이터 저장소, playerPositionStore를 추가합니다.데이터 저장소는 개체가 아닌 기본 유형만 저장하기 때문에 X, Y, Z 좌표를 단일 Vector3 또는 CFrame 값이 아닌 개별 숫자로 저장해야 합니다.경험을 테스트할 때 캐릭터를 이동합니다.경험을 테스트할 때 다음에 캐릭터가 같은 위치로 돌아오는 방법을 확인하십시오.

예제 프로젝트

이제 기본 데이터 저장소 사용을 이해했으므로, 골드 러시 샘플 게임에서 테스트해 보세요Studio에서 게임을 편집하고 향상된 GoldManager 스크립트를 탐색하여 사용자 인터페이스의 일부로 골드를 표시하고 자동 저장을 포함할 수 있습니다.