エクスペリエンスをインタラクティブにすると、オブジェクトプロパティと属性を操作することがあります:
プロパティはオブジェクトクラスの一部です。たとえば、BasePart.Anchored プロパティは、部品の物理を制御します。トラックとフィールドエクスペリエンスで、ディスクまたはジャベリンを即座にアンカーして、プレイヤーが視覚的な示示を持って、部品がどれくらい遠くにあるかを追跡できます。
属性は、基本的に定義したカスタムプロパティです。たとえば、植物 参照プロジェクトは、属性を使用して種の購入価格を設定し、ポットが持つことのできる最大植物サイズを設定します。
レプリケーションオーダー
オブジェクトを取得し、操作する前に、レプリケーションオーダーを理解する必要があります。
Roblox エンジンは、サーバーからクライアントにオブジェクトがどのようにレプリケートされるかを保証しません。これにより、クライアントスクリプトのオブジェクトにアクセスするために Instance:WaitForChild() メソッドが必須になります。ただし、プロセスの一部は予測可能です:
クライアントは、ReplicatedFirst のコンテンツ、例えばロード画面、アセット、スクリプトをロードします。
Class.LocalScript|LocalScripts (and Scripts with a RunContext of 0> Enum.RunContext.Client|Client0>) in LocalScripts3> run. These scripts can safely get objects from
-- 安全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 を StarterPlayerScripts で実行すると、クライアント Scripts も 0> Class.ReplicatedStorage0> で安全にオブジェクトを取得できます。これらのスクリプトは LocalScripts3>
プレイヤーの Character モデルはエクスペリエンスで生成されます。
LocalScripts を StarterCharacterScripts で実行します。
エクスペリエンスが インスタンスストリーミングを使用する (Workspace.StreamingEnabled ) を使用している場合、ワークスペースのオブジェクトの多くは読み込まれていない可能性があり、WaitForChild() を使用してワー
オブジェクトを取得する
オブジェクトプロパティと属性を変更するための第一歩は、オブジェクトに参照を取得することです。最も簡単なソリューションは、スクリプトを Explorer の子として作成し、script.Parent を使用してオブジェクトに参照することです。
local sign = script.Parent
より一般的な解決方法は、Class.Instance:FindFirstChild() やInstance:FindFirstChild() などのメソッドを使用してオブジェクトを取得することです。
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 ユーザーインターフェイスでデフォルトの値で作成することです。その後、スクリプトを使用してプレイヤーのアクションに応答してプラパティを変更できます。
For information on creating attributes in Studio, see インスタンスアトリビューション .
アトリビューションを設定する
属性の値を変更するには、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
アトリビューションを削除する
アトリビュートを削除するには、その値を n に設定します。
アトリビューションを削除
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
変更を検知する
プロパティと属性の変更を聞くためには、いくつかの方法があります:
イベント Instance.Changed は、変更を任意のプロパティ (包括属性) に対して聞きます および、変更されたプロパティの名前をパラメーターとして渡します。
イベント Instance.AttributeChanged は、変更されたアトリビュートにリストを聞き、変更されたアトリビュートの名前をパラメーターとして渡します。
Class.Instance:GetPropertyChangedSignal() メソッドは、1つのプロパティの変更をリスニングし、パラメーターを渡さないようにします。
Class.Instance:GetAttributeChangedSignal() メソッドは、1つの属性の変更をリスニングし、パラメーターを渡さない。
これらのイベントとメソッドがパラメーターとして渡す最小限の情報により、Instance:GetPropertyChangedSignal() およびInstance:GetAttributeChangedSignal() など、すべてが匿名の機能に最適です。イベント に関する詳細は、1> イベント1> を参照してください。
変更を聞く
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)) --> false、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)