プロパティと属性

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

インタラクティブなエクスペリエンスを作成するときは、オブジェクトのプロパティと属性を操作することが多いです:

  • プロパティはオブジェクトクラスの一部です。たとえば、BasePart.Anchored プロパティは、パーツの物理を制御します。トラック & フィールドエクスペリエンスでは、ディスクやジャベリンを着地する瞬間にアンカーして、プレイヤーがどれほど遠くまで移動したかの視覚的な指標を持つことがあります。

  • 属性は、基本的に定義するカスタムプロパティです。たとえば、植物 参照プロジェクトは、アトリビュートを使用して、種の購入価格と植木鉢が保持できる最大プラントサイズを設定します。

レプリケーション順序

オブジェクトの取得と操作を開始する前に、レプリケーション順序について理解する必要があります。

Roblox エンジンは、オブジェクトがサーバーからクライアントにレプリケートされる順序を保証しないため、Instance:WaitForChild() メソッドは、特に Workspace オブジェクトにクライアントスクリプトにアクセスするのに不可欠です。しかし、プロセスのいくつかの側面は予測可能です:

  1. クライアントは、ロード画面、アセット、スクリプトなどの ReplicatedFirst のコンテンツをロードします。

  2. (および に の ) を実行中。これらのスクリプトは、 を使用せずに、安全にオブジェクトを取得できます:


    -- 安全
    local ReplicatedFirst = game:GetService("ReplicatedFirst")
    local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

    これらのスクリプト は、他の サービス から安全にオブジェクトを取得できません、因みに未読み込みの可能性があります:


    -- 安全ではない
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    あなた これらのスクリプトで WaitForChild() を使用して、他のサービスからオブジェクトを取得できますが、そうすると ReplicatedFirst の使用のメリットが無効になります。

  3. クライアントは経験の残りを読み込み続けます。

  4. 終了すると、game.Loaded イベントが発動し、game:IsLoaded() が真に返されます。

  5. LocalScripts において、Players.Player.PlayerScriptsStarterPlayerScripts からコピー)、およびクライアント Scripts において、ReplicatedStorage が実行されます。これらのスクリプトは、ReplicatedStorageを使用せずに、安全にオブジェクトを取得できます。WaitForChild()

  6. プレイヤーの Character モデルがエクスペリエンスにスポーンします。

  7. LocalScriptsWorkspace.CharacterStarterCharacterScripts からコピー)実行。

経験が インスタンスストリーミング ( Workspace.StreamingEnabled ) を使用している場合、一部またはほとんどのオブジェクトがワークスペースにロードされない可能性があるため、ワークスペースオブジェクトにアクセスするために WaitForChild() を使用することがさらに重要な安全対策になります。特に、 ストリームにおけるストリーミング動作のロードとチューニングに関する追加情報は、 と パーモデルストリーミングコントロール を参照してください。

オブジェクトを取得する

オブジェクトのプロパティと属性を変更する最初のステップは、オブジェクトの参照を取得することです。最も簡単な解決策は、スクリプトをエクスプローラーのオブジェクトの子にして、script.Parent を使用してオブジェクトを参照することです。

A script parented to a model in the Explorer.

local sign = script.Parent

より一般的な解決策は、メソッド like または 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)
-- 変更された炎、属性変更、および GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)