インタラクティブなエクスペリエンスを作成するときは、オブジェクトのプロパティと属性を操作することが多いです:
プロパティはオブジェクトクラスの一部です。たとえば、BasePart.Anchored プロパティは、パーツの物理を制御します。トラック & フィールドエクスペリエンスでは、ディスクやジャベリンを着地する瞬間にアンカーして、プレイヤーがどれほど遠くまで移動したかの視覚的な指標を持つことがあります。
属性は、基本的に定義するカスタムプロパティです。たとえば、植物 参照プロジェクトは、アトリビュートを使用して、種の購入価格と植木鉢が保持できる最大プラントサイズを設定します。
レプリケーション順序
オブジェクトの取得と操作を開始する前に、レプリケーション順序について理解する必要があります。
Roblox エンジンは、オブジェクトがサーバーからクライアントにレプリケートされる順序を保証しないため、Instance:WaitForChild() メソッドは、特に Workspace オブジェクトにクライアントスクリプトにアクセスするのに不可欠です。しかし、プロセスのいくつかの側面は予測可能です:
クライアントは、ロード画面、アセット、スクリプトなどの ReplicatedFirst のコンテンツをロードします。
(および に の ) を実行中。これらのスクリプトは、 を使用せずに、安全にオブジェクトを取得できます:
-- 安全local ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)これらのスクリプト は、他の サービス から安全にオブジェクトを取得できません、因みに未読み込みの可能性があります:
-- 安全ではないlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)あなた は これらのスクリプトで WaitForChild() を使用して、他のサービスからオブジェクトを取得できますが、そうすると ReplicatedFirst の使用のメリットが無効になります。
クライアントは経験の残りを読み込み続けます。
終了すると、game.Loaded イベントが発動し、game:IsLoaded() が真に返されます。
LocalScripts において、Players.Player.PlayerScripts (StarterPlayerScripts からコピー)、およびクライアント Scripts において、ReplicatedStorage が実行されます。これらのスクリプトは、ReplicatedStorageを使用せずに、安全にオブジェクトを取得できます。WaitForChild()。
プレイヤーの Character モデルがエクスペリエンスにスポーンします。
LocalScripts 在 Workspace.Character (StarterCharacterScripts からコピー)実行。
経験が インスタンスストリーミング ( Workspace.StreamingEnabled ) を使用している場合、一部またはほとんどのオブジェクトがワークスペースにロードされない可能性があるため、ワークスペースオブジェクトにアクセスするために WaitForChild() を使用することがさらに重要な安全対策になります。特に、 ストリームにおけるストリーミング動作のロードとチューニングに関する追加情報は、 と パーモデルストリーミングコントロール を参照してください。
オブジェクトを取得する
オブジェクトのプロパティと属性を変更する最初のステップは、オブジェクトの参照を取得することです。最も簡単な解決策は、スクリプトをエクスプローラーのオブジェクトの子にして、script.Parent を使用してオブジェクトを参照することです。

local sign = script.Parent
より一般的な解決策は、メソッド like または 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() メソッドでは、1つのプロパティの変更を聞き、パラメータを渡さないようにできます。
- Instance:GetAttributeChangedSignal() メソッドでは、1つの属性の変更を聞き、パラメータを渡さないことができます。
これらのイベントやメソッドがパラメータとして伝える最小限の情報のため、すべてが匿名関数に適しています、特に 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)
-- 変更された炎、属性変更、および GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)