경험을 자주 상호 작용하게 만드는 것은 개체 속성과 특성을 조작하는 것을 의미합니다:
속성은 개체 클래스의 일부입니다.예를 들어, BasePart.Anchored 속성은 부품의 물리학을 제어합니다.트랙 및 필드 경험에서 디스크나 창을 착지하는 순간에 고정하여 플레이어가 이동한 거리에 대한 시각적 지표를 갖도록 할 수 있습니다.
특성은 본질적으로 정의하는 사용자 지정 속성입니다.예를 들어, 식물 참조 프로젝트는 특성을 사용하여 씨앗의 구매 가격과 화분이 보유할 수 있는 최대 식물 크기를 설정합니다.
복제 순서
개체를 검색하고 조작하기 전에 복제 순서에 대한 이해가 있어야 합니다.
Roblox 엔진은 서버에서 클라이언트로 복제되는 개체의 순서를 보장하지 않으므로 Instance:WaitForChild() 메서드가 클라이언트 스크립트에서 개체에 액세스하는 데 필수적으로 사용되며, 특히 Workspace에 있는 개체에 액세스합니다.그러나 프로세스의 일부 측면은 예측 가능합니다:
클라이언트는 로딩 화면, 자산 및 스크립트와 같은 ReplicatedFirst의 콘텐츠를 로드합니다.
(그리고 에서 의 )에서 실행됩니다.이 스크립트는 ReplicatedFirst를 사용하지 않고 안전하게 개체를 가져올 수 있습니다: WaitForChild() :
-- 안전local ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)이 스크립트 는 다른 서비스에서 개체를 안전하게 가져올 수 없으며, 아직 로드되지 않았을 수 있기 때문입니다:
-- 안전하지 않음local ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)당신은 이러한 스크립트에서 다른 서비스에서 개체를 가져오기 위해 을 사용할 수 있지만, 그렇게 하면 을 사용하는 이점이 무효화됩니다.
클라이언트는 경험의 나머지를 계속 로드합니다.
완료되면 game.Loaded 이벤트가 발생하고 game:IsLoaded() 가 참으로 반환됩니다.
에서 실행되며, 클라이언트 에서도 실행됩니다( 에서 복사).이 스크립트는 ReplicatedStorage 를 사용하지 않고도 안전하게 개체를 가져올 수 있습니다 WaitForChild() .
플레이어의 Character 모델이 경험에서 생성됩니다.
LocalScripts 에서 Workspace.Character (StarterCharacterScripts 에서 복사) 실행.
경험이 인스턴스 스트리밍(Workspace.StreamingEnabled)을 사용하는 경우, 일부 또는 대부분의 개체가 작업 영역에 로드되지 않을 수 있으므로 작업 영역 개체에 액세스하기 위해 WaitForChild()를 사용하는 것이 더 중요한 안전 조치가 됩니다.특히, 스트림에서 및 모델별 스트리밍 컨트롤에 대한 추가 정보는 스트리밍 동작 로드 및 튜닝에 대한 추가 정보를 참조하십시오.
개체 가져오기
개체 속성과 특성을 수정하는 첫 번째 단계는 개체에 대한 참조를 가져오는 것입니다.가장 간단한 해결책은 탐색기의 개체에 스크립트를 자식으로 만들고 script.Parent를 사용하여 개체를 참조하는 것입니다.

local sign = script.Parent
더 일반적인 해결책은 방법 서비스 를 사용하여 개체를 가져오는 것입니다. Instance:FindFirstChild() 또는 Instance:WaitForChild() 같은 메서드를 사용합니다.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
속성 수정
속성에 액세스하는 것은 간단합니다 — 개체 참조 뒤에 .를 사용하면 됩니다 — 모델로 작업하는 경우 모델 자체가 아닌 개별 부품을 선택해야 할 수도 있습니다.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
특성 만들기
프로그래밍 방식으로 특성을 만들 수는 있지만, 더 일반적인 솔루션은 Studio 사용자 인터페이스에서 기본값으로 만드는 것입니다.그런 다음 스크립트를 사용하여 플레이어 작업에 대한 응답으로 값을 수정할 수 있습니다.

Studio에서 특성을 만드는 방법에 대한 자세한 내용은 인스턴스 특성을 참조하십시오.
특성 설정
특성 값을 수정하려면 이름과 값으로 Instance:SetAttribute()를 호출하십시오.
특성 생성 또는 수정
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
특성이 아직 존재하지 않는 경우 이 메서드가 생성합니다.
특성 값 가져오기
기존 특성의 값을 가져오려면 인스턴스에서 Instance:GetAttribute()를 호출하십시오.
특성 값 가져오기
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
마찬가지로, Instance:GetAttributes() 를 호출하여 모든 특성을 가져올 수 있습니다. 이 메서드는 키-값 쌍 사전을 반환합니다.
모든 특성 가져오기
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
특성 삭제
특성을 삭제하려면 값을 nil로 설정합니다.
특성 삭제
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
변경 사항 감지
속성과 특성의 변경 사항을 감지하는 방법은 여러 가지가 있습니다.
- Instance.AttributeChanged 이벤트는 모든 특성에 대한 변경을 감지하고 변경된 특성의 이름을 매개 변수로 전달합니다.
- Instance:GetPropertyChangedSignal() 메서드를 사용하면 하나의 속성에 대한 변경 사항을 감지하고 매개 변수를 전달할 수 없습니다.
- Instance:GetAttributeChangedSignal() 메서드를 사용하면 한 특성의 변경 사항을 감지하고 매개 변수를 전달할 수 없습니다.
이러한 이벤트와 메서드가 매개 변수로 전달하는 최소한의 정보로 인해, 모두 익명 함수에 적합합니다, 특히 Instance:GetPropertyChangedSignal() 및 Instance:GetAttributeChangedSignal().무명 함수와 이벤트 작업에 대해 자세히 알아보려면 이벤트를 참조하십시오.
변경 사항 감지
local cabbage = script.Parent
-- 로컬 함수
local function onAnyPropertyChange(property)
-- 특성 변경 무시
if property ~= "Attributes" then
print(property) --> 이름
print(cabbage[property]) --> 캐비지1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> 성장, 성장률
print(cabbage:GetAttribute(attribute)) --> 거짓, 3
end
-- 변경 사항 감지 및 로컬 함수에 연결
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- 변경 사항 감지 및 익명 함수에 연결
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> 캐비지1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- 변경된 화재 및 GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- 변경된 화재 및 특성 변경
cabbage:SetAttribute("Grow", false)
-- 변경된 화재, AttributeChanged 및 GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)