FacingCamera 카메라를 바라봄
FacingCameraWorldUp 세로 방향을 유지하며 카메라를 봄
VelocityParallel 이동 방향과 평행
VelocityPerpendicular 이동 방향과 수직
생성 영역 Shape
옵션뜻입력 예시
Shape
파티클 생성 영역 모양
Sphere
ShapeStyle
영역 내부/표면 생성
Volume
ShapeInOut
안쪽/바깥쪽 방출
Outward
ShapePartial
Shape 일부만 사용
0.5
Shape
Box
Sphere
Cylinder
Disc
ShapeStyle
Volume 내부 전체에서 생성
Surface 표면에서만 생성
ShapeInOut
Outward 바깥쪽으로
Inward 안쪽으로
InAndOut 양쪽 랜덤
Flipbook 애니메이션
옵션뜻입력 예시
FlipbookLayout
스프라이트 프레임 배열
Grid4x4
FlipbookSizeX
Custom 가로 프레임 수
4
FlipbookSizeY
Custom 세로 프레임 수
4
FlipbookFramerate
애니메이션 FPS
12
FlipbookMode
애니메이션 재생 방식
Loop
FlipbookStartRandom
랜덤 프레임부터 시작
true
FlipbookBlendFrames
프레임 사이 부드럽게 보간
true
FlipbookLayout
None
Grid2x2
Grid4x4
Grid8x8
Custom
FlipbookMode
Loop 반복
OneShot 한 번 재생
PingPong 정방향 → 역방향 반복
Random 랜덤
거의 안 쓰는 옵션
옵션뜻입력 예시
LocalTransparencyModifier
로컬 투명도 추가 보정
0
VelocitySpread
구형 퍼짐 옵션, Deprecated
사용 안 함
FlipbookIncompatible
Flipbook 사용 불가 상태 확인
읽기용
가장 자주 쓰는 핵심만 뽑으면
Rate 초당 생성량 20
Lifetime 생존시간 1 ~ 2
Size 크기 변화 0 → 2 → 0
Transparency 투명도 변화 1 → 0 → 1
Speed 초기 속도 5 ~ 10
Acceleration 가속도 0, 10, 0
Drag 감속 3
EmissionDirection 방출 방향 Top
SpreadAngle 퍼짐 각도 30, 30
Rotation 시작 회전 0 ~ 360
RotSpeed 회전 속도 -90 ~ 90
Color 색 변화 흰색 → 파랑
Texture 이미지 rbxassetid://123
성능을 개선하고 서버에 대한 요청 수를 줄이기 위해 데이터 저장소의 데이터를 임시로 저장하는 데 캐싱을 사용하세요. 예를 들어, 게임은 데이터의 복사본을 캐시하여 데이터 저장소에 다른 호출을 할 필요 없이 빠르게 접근할 수 있습니다.
실제 구현은?
Roblox 데이터 저장소(DataStore)에서 GetAsync(), SetAsync(), UpdateAsync(), IncrementAsync(), RemoveAsync() 등의 작업 명령어를 호출하면, 기본적으로 엔진 차원에서 4초간의 로컬 캐싱이 자동으로 작동합니다.
따라서 개발자가 별도의 캐시 시스템을 구현하지 않아도 데이터 저장소를 사용하는 것만으로 캐싱이 자연스럽게 적용됩니다.
캐싱 비활성화
local ok = pcall(function()
store:UpdateAsync(key, transform)
end)
if not ok then
local options = Instance.new("DataStoreGetOptions")
options.UseCache = false
local success, value = pcall(function()
return store:GetAsync(key, options)
end)
if success then
-- 캐시된 상태가 아닌 백엔드 상태에 따라 결정
end
end
UTC 기준 하루 첫 쓰기 시점: 특정 데이터(키)를 SetAsync(), UpdateAsync(), IncrementAsync()로 처음 변경할 때, 그 시점의 이전 데이터가 백업 버전으로 저장됩니다.
같은 날 추가 변경 시: 같은 UTC 날짜(24시간) 안에서 랭킹이나 점수가 10번, 100번 변경되어 계속 업데이트되더라도, 이전 데이터를 덮어쓸 뿐 매번 새 백업 버전이 생기지는 않습니다.
2. 이전 데이터 복구 (백업)
만약 플레이어의 데이터가 손상되거나 버그가 발생하면, ListVersionsAsync()로 해당 날짜에 저장된 백업 목록을 조회하고, GetVersionAsync()로 해당 시점의 데이터를 가져와 복구할 수 있습니다.
이 백업 버전 데이터는 30일 동안 보관된 후 자동으로 삭제됩니다.
특정 유저 데이터가 깨졌다면
개발자가 직접 구현해야 하는 부분
복구 스크립트
복구할 플레이어의 Key(예: User_12345)를 지정합니다.
ListVersionsAsync()를 호출하여 과거 저장된 버전 목록(시간대별 백업 목록)을 가져옵니다.
복구하고자 하는 특정 시간대의 버전을 선택합니다.
GetVersionAsync()로 해당 버전의 데이터를 읽어옵니다.
읽어온 옛날 데이터를 SetAsync()로 현재 최신 데이터 위치에 덮어씌웁니다.
예시)
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
local function rollbackPlayerData(userId, targetDateTime)
local key = "User_" .. userId
-- 1. 지정한 시간(targetDateTime) 이전의 가장 가까운 버전 목록 조회
local success, pages = pcall(function()
return playerDataStore:ListVersionsAsync(
key,
Enum.SortDirection.Descending,
nil,
targetDateTime.UnixTimestampMillis
)
end)
if success then
local items = pages:GetCurrentPage()
if #items > 0 then
local targetVersion = items[1].Version -- 가장 가까운 과거 버전 번호
-- 2. 해당 버전의 데이터값 읽어오기
local getSuccess, oldData = pcall(function()
return playerDataStore:GetVersionAsync(key, targetVersion)
end)
-- 3. 읽어온 옛날 데이터로 현재 데이터 덮어쓰기 (복구 실행)
if getSuccess and oldData then
playerDataStore:SetAsync(key, oldData)
print(userId .. "번 유저 데이터 복구 완료!")
end
end
end
end