-
안녕하세요.
이번 글에서는 데이터 저장을 하는 방법에 대해 다뤄 보려고 합니다.
우선 사용한 방식은 도구상자 / 데이터 매니저를 사용하였습니다.
보다 더 상세한 내용은
https://www.youtube.com/watch?v=qYXex74gGYI
제가 참고했던 유튜브 링크를 남겨 드립니다.
DataManager와 ProfileService는 크게 건드리지 않고
현재 사용 하려는 곳은
이 공간 입니다.
초기 단계는 레벨을 0에서 시작하도록 만들었습니다.
이제 제가 원하는 기능 구현은 플레이어가
일정 영역에서 Prompt와 상호작용을 하면
Level이 1로 올라가게 되는 것이 첫 번째이고.
두 번째는 재접속을 했을 때 데이터를 유지하면서 로비에서 텔레포트를 타면 Level1의 Spawn 위치로 이동되게 하는 것입니다.
위 영상과 같은 방법으로 해도 상관은 없지만, 데이터를 저장할 곳이 많다면 매번 데이터를 불러오는 과정이 필요했고
실시간으로 동기화하는 작업에는 적합하지가 않았습니다.
두 번째로 데이터를 스크립트마다 미리 불러온다고 해도 관리 측면에서 어려웠습니다.
그렇기에 선택한 방법이
1. 게임 시작 시 데이터를 불러와 특정 공간에 담아둔다.
2. 특정 공간의 데이터를 실시간으로 읽는다.
3. 이 특정 공간의 데이터가 값이 변경되면 기존 데이터를 같이 업데이트를 해준다.
첫 번째로 서버스크립트로 'PlayerInfo'를 만들어 주었습니다.
위 영상과 같이 DataManager에서 데이터를 받아 오는 과정은 같으나 간략하게 보자면
플레이어가 로드(PlayerAdded)가 되고 나면
플레이어 하위에 playerInfo라는 폴더를 생성해 주고
이 폴더에 IntValue 값으로 'level'을 지정해 주었습니다.
이후 DataManager의 데이터를 불러오고
생성한 IntValue 값에 동기화해 주었습니다.
이대로 게임을 실행해 보면, 에러가 발생하는 걸 볼 수 있는데요
Roblox 스튜디오에서 API 액세스가 활성화되지 않았기 때문에 Data를 저장할 수 없다는 뜻입니다.
해결방법
게임 설정 / 보안 / Studio의 API 서비스 이용 활성화
다음은 SaveZoneLevel1의 파트와 그 하위에 Prompt를 두었습니다.
캐릭터가 파트에 가까이 다가가가면 활성화가 될 것입니다.
Prompt 속성에 보시면 MaxActivationDistance라고 있는데
이것이 Prompt가 보이게 될 거리를 뜻합니다.
다음은 Local 스크립트에 Prompt를 받아와 Triggered를 연결시켜 주었습니다.
캐릭터가 프롬프트와 상호작용 하면 이벤트가 발생되어 Print가 실행되는데
saveZoneLevel1 Prompt : Prompt
Triggered : 트리거 이벤트
Connect : 뒤에 있는 인자를 연결
function : 함수
라고 보시면 됩니다.
다음은 데이터를 업데이트해 주었습니다.
우선 Players 하위 제 캐릭터에 playerInfo의 폴더와 level의 IntValue가 잘 적용되어 있는 것을 볼 수 있습니다.
다음은 로컬과 서버의 통신을 도와줄 RemoteEvent를 만들어 주었습니다.
서버스크립트 PlayerInfoUpdate에서
OnServerEvent로 신호를 받으면 실행될 로직을 구현하였습니다.
UpdateData의 인자는
player와, 키, 그리고 데이터입니다.
이 데이터는 PlayerInfo 하위의 IntValue의 값이 됩니다.
즉 DataManager의 Level에 IntValue 값을 업데이트하여 주는 동작 구현입니다.
마지막 코드를 보겠습니다.
local Players = game:GetService("Players")
Players 서비스에 접근하여 현재 게임에 접속해 있는 모든 플레이어의 정보를 관리할 수 있습니다.
local player = Players.LocalPlayer
현재 로컬에서 플레이 중인 player에 해당합니다.
local playerInfo = player:WaitForChild("playerInfo")
저희가 만든 폴더입니다.
local playerLevel
받아온 데이터를 담을 변수입니다.
local PlayerInfoUpdateEvent = ReplicatedStorage:WaitForChild("PlayerInfoUpdateEvent")
ReplicatedStorage 하위에 생성한 RemoteEvent입니다.
playerLevel = playerInfo:WaitForChild("level")
playerInfo 내에서 level을 찾아 변수에 할당한 뒤 제어 하는 모습입니다.
FireServer
서버로 이벤트를 전송합니다.
추가로 기존 로비에서 서버로부터 신호를 받고 OnClientEvent로 실행하는 로직에서
level에 따라 스폰 위치를 다르게 해 주었습니다.
즉 저장한 level의 데이터가 1이라면
level1 SpawnPos 위치로 텔레포트할 때 스폰이 될 거고
(else) 아니 라면기존 위치대로 스폰이 될 것입니다.
로블록스의 글은 여기까지 하겠습니다.
미니게임 및 콘텐츠나 애니메이션 등 보다 많은 것을 직접 다루면서 글을 올리려고 했었는데,
기능 및 예외처리 위주의 작업이 될 것 같았고..
로블록스로 게임 출시나 무언갈 하려는 것은 아닌 관계로
더 이상 추가적인 것을 만드는 것보다는 여기서 마무리를 하게 되었습니다.
기회가 된다면 로블록스 관련하여 다시 글을 올리는 날이 오기를 기다리겠습니다.
감사합니다.
'로블록스 > 첫 프로젝트' 카테고리의 다른 글
로브록스 재미 요소 추가 (0) 2024.11.11 로블록스 텔레포트 (0) 2024.11.05 로블록스 루아 스크립트 (0) 2024.11.05 로블록스 스튜디오 작업공간 (0) 2024.11.02 로블록스 (0) 2024.11.01