คุณสมบัติและคุณลักษณะ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

การทำให้ประสบการณ์มีปฏิสัมพันธ์บ่อยครั้งหมายถึงการควบคุมคุณสมบัติและลักษณะของวัตถุ:

  • คุณสมบัติเป็นส่วนหนึ่งของคลาสวัตถุตัวควบคุมคุณสมบัติ BasePart.Anchored เช่น ควบคุมฟิสิกส์สำหรับชิ้นส่วนในประสบการณ์สนามและสนาม คุณอาจต้องการที่จะยึดดิสก์หรือหอกในทันทีที่มันลงจอดเพื่อให้ผู้เล่นมีตัวบ่งบอกทางภาพว่ามันเดินทางไกลแค่ไหน

  • ลักษณะที่เป็นอยู่เป็นคุณสมบัติที่กําหนดเองที่คุณกําหนดไว้ตัวอย่างเช่นโครงการอ้างอิงของ พืช ใช้คุณสมบัติในการตั้งราคาซื้อสำหรับเมล็ดและขนาดพืชสูงสุดที่หม้อสามารถจัดเก็บได้

ลำดับการเลียนแบบ

ก่อนที่คุณจะเริ่มกู้คืนและจัดการวัตถุ คุณต้องมีความเข้าใจเกี่ยวกับลำดับการเลียนแบบ

เครื่อง Roblox ไม่รับประกันลำดับที่วัตถุถูกสําเนาจากเซิร์ฟเวอร์ไปยังไคลเอนต์ซึ่งทําให้วิธี Instance:WaitForChild() เป็นสิ่งจําเป็นสําหรับการเข้าถึงวัตถุในสคริปต์ไคลเอนต์โดยเฉพาะอย่างยิ่งวัตถุใน Workspaceยังคงมีบางด้านของกระบวนการที่คาดเดาได้:

  1. ไคลเอนต์โหลดเนื้อหาของ ReplicatedFirst เช่นหน้าจอโหลด ทรัพยากร และสคริปต์

  2. LocalScripts (และ Scripts ด้วย RunContext ของ Client ) ในการดำเนินการ ReplicatedFirstสคริปต์เหล่านี้สามารถรับวัตถุได้อย่างปลอดภัยจาก ReplicatedFirst โดยไม่ต้องใช้ WaitForChild() :


    -- ปลอดภัย
    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.PlayerScripts (คัดลอกจาก StarterPlayerScripts ) วิ่งรวมทั้งไคลเอนต์ Scripts ใน ReplicatedStorageสคริปต์เหล่านี้สามารถรับวัตถุได้อย่างปลอดภัยจาก ReplicatedStorage โดยไม่ต้องใช้ WaitForChild()

  6. โมเดลของผู้เล่น Character จะปรากฏในประสบการณ์

  7. LocalScripts ใน Workspace.Character (คัดลอกจาก StarterCharacterScripts ) ดำเนินการ

หากประสบการณ์ของคุณใช้การสตรีมตัวอย่าง ( ) บางหรือส่วนใหญ่อาจไม่ได้โหลดลงในพื้นที่ทำงาน ดังนั้นการใช้ ( ) เพื่อเข้าถึงวัตถุในพื้นที่ทำงานจึงเป็นมาตรการรักษาความปลอดภัยที่สำคัญยิ่งขึ้นโดยเฉพาะอย่างยิ่งดู สตรีมใน และ การควบคุมการสตรีมตามรูปแบบแต่ละรายการ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการโหลดและปรับแต่งพฤติกรรมการสตรีม

รับวัตถุ

ขั้นตอนแรกในการแก้ไขคุณสมบัติและลักษณะของวัตถุคือการรับการอ้างอิงถึงวัตถุทางออกที่ง่ายที่สุดคือการทำให้สคริปเป็นลูกของวัตถุใน Explorer และใช้ script.Parent เพื่ออ้างอิงถึงวัตถุ

A script parented to a model in the Explorer.

local sign = script.Parent

ทางออกที่เป็นสากลมากขึ้นคือการรับวัตถุจากบริการ โดยใช้วิธีการเช่น หรือ

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.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)
-- ไฟได้เปลี่ยนแปลงคุณลักษณะเปลี่ยนแปลง และรับสัญญาณการเปลี่ยนแปลงคุณลักษณะ()
cabbage:SetAttribute("GrowthRate", 3)