속성과 특성

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

경험을 자주 상호 작용하게 만드는 것은 개체 속성과 특성을 조작하는 것을 의미합니다:

  • 속성은 개체 클래스의 일부입니다.예를 들어, BasePart.Anchored 속성은 부품의 물리학을 제어합니다.트랙 및 필드 경험에서 디스크나 창을 착지하는 순간에 고정하여 플레이어가 이동한 거리에 대한 시각적 지표를 갖도록 할 수 있습니다.

  • 특성은 본질적으로 정의하는 사용자 지정 속성입니다.예를 들어, 식물 참조 프로젝트는 특성을 사용하여 씨앗의 구매 가격과 화분이 보유할 수 있는 최대 식물 크기를 설정합니다.

복제 순서

개체를 검색하고 조작하기 전에 복제 순서에 대한 이해가 있어야 합니다.

Roblox 엔진은 서버에서 클라이언트로 복제되는 개체의 순서를 보장하지 않으므로 Instance:WaitForChild() 메서드가 클라이언트 스크립트에서 개체에 액세스하는 데 필수적으로 사용되며, 특히 Workspace에 있는 개체에 액세스합니다.그러나 프로세스의 일부 측면은 예측 가능합니다:

  1. 클라이언트는 로딩 화면, 자산 및 스크립트와 같은 ReplicatedFirst의 콘텐츠를 로드합니다.

  2. (그리고 에서 의 )에서 실행됩니다.이 스크립트는 ReplicatedFirst를 사용하지 않고 안전하게 개체를 가져올 수 있습니다: WaitForChild() :


    -- 안전
    local ReplicatedFirst = game:GetService("ReplicatedFirst")
    local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

    이 스크립트 는 다른 서비스에서 개체를 안전하게 가져올 수 없으며, 아직 로드되지 않았을 수 있기 때문입니다:


    -- 안전하지 않음
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    당신은 이러한 스크립트에서 다른 서비스에서 개체를 가져오기 위해 을 사용할 수 있지만, 그렇게 하면 을 사용하는 이점이 무효화됩니다.

  3. 클라이언트는 경험의 나머지를 계속 로드합니다.

  4. 완료되면 game.Loaded 이벤트가 발생하고 game:IsLoaded() 가 참으로 반환됩니다.

  5. 에서 실행되며, 클라이언트 에서도 실행됩니다( 에서 복사).이 스크립트는 ReplicatedStorage 를 사용하지 않고도 안전하게 개체를 가져올 수 있습니다 WaitForChild() .

  6. 플레이어의 Character 모델이 경험에서 생성됩니다.

  7. LocalScripts 에서 Workspace.Character (StarterCharacterScripts 에서 복사) 실행.

경험이 인스턴스 스트리밍(Workspace.StreamingEnabled)을 사용하는 경우, 일부 또는 대부분의 개체가 작업 영역에 로드되지 않을 수 있으므로 작업 영역 개체에 액세스하기 위해 WaitForChild()를 사용하는 것이 더 중요한 안전 조치가 됩니다.특히, 스트림에서모델별 스트리밍 컨트롤에 대한 추가 정보는 스트리밍 동작 로드 및 튜닝에 대한 추가 정보를 참조하십시오.

개체 가져오기

개체 속성과 특성을 수정하는 첫 번째 단계는 개체에 대한 참조를 가져오는 것입니다.가장 간단한 해결책은 탐색기의 개체에 스크립트를 자식으로 만들고 script.Parent를 사용하여 개체를 참조하는 것입니다.

A script parented to a model in the Explorer.

local sign = script.Parent

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

A Model within a Folder in ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")

속성 수정

속성에 액세스하는 것은 간단합니다 — 개체 참조 뒤에 .를 사용하면 됩니다 — 모델로 작업하는 경우 모델 자체가 아닌 개별 부품을 선택해야 할 수도 있습니다.

A Model within ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)

특성 만들기

프로그래밍 방식으로 특성을 만들 수는 있지만, 더 일반적인 솔루션은 Studio 사용자 인터페이스에서 기본값으로 만드는 것입니다.그런 다음 스크립트를 사용하여 플레이어 작업에 대한 응답으로 값을 수정할 수 있습니다.

A script within a folder in ReplicatedStorage.

Studio에서 특성을 만드는 방법에 대한 자세한 내용은 인스턴스 특성을 참조하십시오.

특성 설정

특성 값을 수정하려면 이름과 값으로 Instance:SetAttribute()를 호출하십시오.

특성 생성 또는 수정

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)

특성이 아직 존재하지 않는 경우 이 메서드가 생성합니다.

특성 값 가져오기

기존 특성의 값을 가져오려면 인스턴스에서 Instance:GetAttribute()를 호출하십시오.

특성 값 가져오기

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)
local isHarvestable = cabbage:GetAttribute("Harvestable")
print(isHarvestable) --> true

마찬가지로, Instance:GetAttributes() 를 호출하여 모든 특성을 가져올 수 있습니다. 이 메서드는 키-값 쌍 사전을 반환합니다.

모든 특성 가져오기

local cabbage = script.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

특성 삭제

특성을 삭제하려면 값을 nil로 설정합니다.

특성 삭제

local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)

변경 사항 감지

속성과 특성의 변경 사항을 감지하는 방법은 여러 가지가 있습니다.

이러한 이벤트와 메서드가 매개 변수로 전달하는 최소한의 정보로 인해, 모두 익명 함수에 적합합니다, 특히 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)