값 관리
개요
Attribute나 Value 오브젝트를 사용하면, 스크립트 없이 에디터에서 직접 값을 수정할 수 있어 작업 효율을 높일 수 있습니다.
Attribute는 다양한 타입을 지원하고 메모리 사용 측면에서 더 가벼워 성능에 유리한 반면, Value 오브젝트는 상대적으로 무겁지만 Instance 단위로 구성되어 재사용이나 참조 연결에 강점이 있습니다.
Attribute
개요
Part와 같은 오브젝트의 프로퍼티 패널에서 Attribute를 추가하면 스크립트가 아닌 에디터에서도 값을 쉽게 수정할 수 있어 작업 효율이 높아집니다.
또한 RemoteEvent로 직접적인 통신을 하지 않고도 클라이언트에서 서버의 값을 직접 접근할 수 있어, 네트워크 통신 구조를 간결하게 유지하고 코드 복잡도를 줄이면서 쉽게 최적화할 수 있습니다.
Attribute는 Value 오브젝트처럼 별도의 인스턴스를 생성하거나 파괴하지 않으므로 Instance.new()나 Destroy()에 비해 훨씬 빠르게 처리되며, 특히 다수의 오브젝트에 값을 동적으로 생성하거나 제거해야 하는 상황과 같이 고빈도 처리, 대량 오브젝트 제어, 반복적인 동기화가 필요한 경우에 유리합니다.
지원되는 데이터 타입
String
O
Boolean
O
Number
O
UDim
O
UDim2
O
BrickColor
O
Color3
O
Vector2
O
Vector3
O
CFrame
O
사용 방법
Attribute 값을 서버에서 변경하면 별도의 RemoteEvent를 사용하지 않아도 클라이언트에서 해당 값을 읽을 수 있어, 통신 구조를 단순화하고 코드 유지보수를 용이하게 만듭니다.
또한 몬스터의 데미지나 체력, 플레이어의 점수와 같은 주요 게임 데이터를 스크립트 변수로 관리하는 대신, Attribute 단위로 구조화하여 관리함으로써 디버깅이 쉬워지고, Level Browser를 통해 시각적으로 상태를 파악할 수 있어 개발 효율이 크게 향상됩니다.
특히 디자이너나 비개발자도 Studio의 프로퍼티창에서 직접 값을 수정하거나 오브젝트 간 연결이 가능하기 때문에, 비프로그래머와의 협업 환경에도 적합한 구조입니다.

Attribute가 설정된 오브젝트에 GetAttributeChangedSignal 이벤트나 AttributeChanged 이벤트를 연결하면 값이 변경될 때만 필요한 처리를 실행할 수 있어, 전체적인 데이터 흐름의 가시성과 유지보수성을 크게 개선할 수 있습니다.
local Monster = script.Parent
-- 프로퍼티 패널에서 추가한 Attribute의 값이 로드될때까지 대기합니다.
repeat wait() until Monster:GetAttribute("HP")
local Init_MonsterType = Monster:GetAttribute("MonsterType")
local Init_IsElite = Monster:GetAttribute("IsElite")
local Init_HP = Monster:GetAttribute("HP")
local MaxHP = Init_HP
local Init_Damage = Monster:GetAttribute("Damage")
local Init_MoveSpeed = Monster:GetAttribute("MoveSpeed")
-- 특정 Attribute 값 변경 감지
local function OnChangedHP()
local hp = Monster:GetAttribute("HP")
print("[Server OnChangedHP] " .. hp .. " / " .. MaxHP)
end
Monster:GetAttributeChangedSignal("HP"):Connect(OnChangedHP)
-- 모든 Attribute 값 변경 감지
local function OnAttributeChanged(attribute)
print(attribute, "is Changed : ", Monster:GetAttribute(attribute))
end
Monster.AttributeChanged:Connect(OnAttributeChanged)
클라이언트에서도 같은 Attribute에 대한 Change 이벤트를 연결하면, 값이 변경될 때 필요한 처리를 실행 할 수 있습니다.
-- 특정 Attribute 값 변경 감지
local function OnChangedHP()
RefreshMonsterHpUI()
end
Monster:GetAttributeChangedSignal("HP"):Connect(OnChangedHP)
-- 모든 Attribute 값 변경 감지
local function OnAttributeChanged(attribute)
...
end
Monster.AttributeChanged:Connect(OnAttributeChanged)
Value Objects
개요
IntValue, StringValue와 같은 Value 오브젝트를 사용하면 스크립트가 아닌 에디터에서도 값을 쉽게 수정할 수 있어 작업 효율이 높아집니다.
또한 RemoteEvent로 직접적인 통신을 하지 않고도 클라이언트에서 서버의 값을 직접 접근할 수 있어, 네트워크 통신 구조를 간결하게 유지하고 코드 복잡도를 줄이면서 쉽게 최적화할 수 있습니다.
Value 오브젝트는 오브젝트 단위로 존재하기 때문에 Attribute에 비해 상대적으로 무겁고 객체 수가 많아지면 성능에 영향을 줄 수 있지만, Instance 간 참조 연결이나 반복 사용이 필요한 경우에 유리합니다.
지원되는 데이터 타입
IntValue
O
정수값 전용
NumberValue
O
정수 및 실수 포함
StringValue
O
BoolValue
O
ObjectValue
X
CFrameValue
X
Vector3Value
X
Color3Value
X
사용 방법
Value 오브젝트의 값을 서버에서 변경하면 별도의 RemoteEvent를 사용하지 않아도 클라이언트에서 해당 값을 읽을 수 있어, 통신 구조를 단순화하고 코드 유지보수를 용이하게 만듭니다.
또한 몬스터의 데미지나 체력, 플레이어의 점수와 같은 주요 게임 데이터를 스크립트 변수로 관리하는 대신, 오브젝트 단위로 구조화하여 관리함으로써 디버깅이 쉬워지고, Level Browser를 통해 시각적으로 상태를 파악할 수 있어 개발 효율이 크게 향상됩니다.
특히 디자이너나 비개발자도 Studio의 프로퍼티창에서 직접 값을 수정하거나 오브젝트 간 연결이 가능하기 때문에, 비프로그래머와의 협업 환경에도 적합한 구조입니다.

Value 오브젝트에 Changed 이벤트를 연결하면 값이 변경될 때만 필요한 처리를 실행할 수 있어, 전체적인 데이터 흐름의 가시성과 유지보수성을 크게 개선할 수 있습니다.
local Monster = script.Parent
local Parameter = Monster:WaitForChild("Parameter")
-- WaitForChild를 통해 Value 오브젝트가 로드된 다음 참조하도록 대기합니다.
local MonsterType = Parameter:WaitForChild("MonsterType")
local IsElite = Parameter:WaitForChild("IsElite")
local HP = Parameter:WaitForChild("HP")
local MaxHP = HP.Value
local Damage = Parameter:WaitForChild("Damage")
local MoveSpeed = Parameter:WaitForChild("MoveSpeed")
local function OnChangedHP(newValue)
print("[Server OnChangedHP] " .. HP.Value .. " / " .. MaxHP)
end
HP.Changed:Connect(OnChangedHP)
클라이언트에서도 같은 Value 오브젝트에 대한 Change 이벤트를 연결하면, 값이 변경될 때 필요한 처리를 실행 할 수 있습니다.
local function OnChangedHP(newValue)
RefreshMonsterHpUI()
end
HP.Changed:Connect(OnChangedHP)
활용 예시
서버에서 HP가 변화할 때, 클라이언트에서 값 변경을 감지하여 HpBar UI를 갱신
서버에서 스킬 사용을 처리할 때, 클라이언트에서 값 변경을 감지하여 스킬 사용 버튼을 비활성화 처리
서버에서 특정 오브젝트의 활성 상태를 바꿀 때, 클라이언트에서 값 변경을 감지하여 UI 아이콘 표시
서버에서 플레이어 상태(예: 스턴, 기절 등)를 변경할 때, 클라이언트에서 값 변경을 감지하여 화면 효과 적용
주의 사항
초기화단에서 값을 참조할 때는 로딩 타이밍 문제를 방지하기 위해 항상 repeat이나 WaitForChild()를 사용하는 것이 안전합니다.
Attribute와 Value 오브젝트는 서버에서 값을 변경한 경우에만 클라이언트와 동기화됩니다. 반대로, 클라이언트에서 값을 변경해도 다른 클라이언트나 서버에는 동기화되지 않습니다.
복잡한 구조나 대규모 데이터를 다루는 용도로는 적합하지 않으며, 간단한 상태값이나 단일 정보에 사용하는 것이 좋습니다.
Value 오브젝트를 과도하게 사용하면 Level Browser가 복잡해지고 구조 파악이 어려워질 수 있으므로, 적절한 폴더 정리와 네이밍 규칙이 필요합니다.
값이 자주 바뀌는 경우, Changed 이벤트의 과도한 사용은 성능에 영향을 줄 수 있으므로, 더 이상 필요하지 않은 연결은 반드시 Disconnect()로 해제해야 합니다.
보안에 민감한 값은 절대 클라이언트에 노출되지 않도록, ServerScriptService와 같은 서버 전용 영역에만 저장해야 합니다.
Last updated