Skip to content

Tag và attribute ​

Tag đánh dấu một thứ thuộc một loại - mọi part là Lava, mọi Coin, mọi Door. Attribute là giá trị có tên gắn trên một thứ - Damage của dung nham, Speed của cánh cửa. Đặt cả hai trong Inspector, đọc chúng bằng một script cho tất cả: không cần chép script vào từng part.

Trong KHIM Engine ​

Chọn một part (hoặc Model, folder, đối tượng trên part); mục Tags và Attributes của Inspector nằm dưới cùng.

  • Tags: gõ một từ vào Add tag và bấm Enter. Mỗi tag là một nút có dấu x để gỡ. Chọn cả trăm đồng xu thì một tag gắn lên tất cả.
  • Attributes: Add hỏi tên và loại - số, chữ, true/false, Vector3, Vector2 hay màu - và thêm vào mọi part đang chọn. Rồi sửa giá trị trên dòng của nó.

Cả hai được lưu cùng world và chép theo part.

Một script cho mọi part có tag ​

lua
-- Mọi part có tag Lava làm đau theo attribute Damage của chính nó - bây giờ, và cả những cái clone sau này.
tags.each("Lava", function(lava)
    lava.touched:connect(function(hit)
        local player = players.fromPart(hit)
        if player then
            player:damage(lava.attributes.Damage or 10)
        end
    end)
end)

tags.each chạy hàm cho mọi part có tag bây giờ, và cho mọi part tới sau (một bản clone được gắn cha, một part được stream vào). Mỗi cái chạy trong luồng riêng, nên cái nào chờ cũng không làm chậm cái khác.

Module tags ​

HàmLàm gì
tags.get(tag)Mọi part và đối tượng trong game có tag đó
tags.each(tag, fn)fn cho từng cái bây giờ và từng cái tới sau; trả về connection
tags.added(tag)Event: một thứ vừa có tag, hoặc vào game cùng tag
tags.removed(tag)Event: một thứ mất tag, hoặc rời game cùng tag
tags.all()Mọi tag đang dùng

"Trong game" nghĩa là nó có cha liên tục tới gốc: bản clone chưa gắn cha, hay part đã bị xoá, thì không tính.

Trên một part hay đối tượng ​

lua
part:addTag("Coin")
part:removeTag("Coin")
print(part:hasTag("Coin"))
print(part:getTags())        -- danh sách đã sắp xếp

part:setAttribute("Speed", 12)
print(part:getAttribute("Speed"))   -- 12, hoặc nil nếu không có
part:setAttribute("Speed", nil)     -- gỡ đi

part.attributes.Damage = 25          -- cách viết ngắn, để đọc và gán
for name, value in part.attributes do print(name, value) end

Giá trị attribute là số, chữ (tối đa 4.096 byte), true/false, vec3, vec2 hoặc màu. Tên gồm chữ cái, chữ số và _.

Nghe thay đổi ​

lua
local door = world.Door
door:getAttributeChangedSignal("Speed"):connect(function()
    print("tốc độ giờ là", door:getAttribute("Speed"))
end)

door.attributeChanged:connect(function(name)
    print(name .. " đã đổi")
end)

Ai thấy gì ​

Tag và attribute của part được lưu cùng world và gửi tới mọi người chơi. Khi Script trên server đổi chúng, người chơi nhận bộ mới, và attributeChanged cũng chạy trên thiết bị của họ - nên server có thể đưa ClientScript một giá trị mà không cần gửi tin nhắn:

lua
-- Script
world.Scoreboard:setAttribute("TimeLeft", 90)

-- ClientScript
local board = world:waitFor("Scoreboard")
board:getAttributeChangedSignal("TimeLeft"):connect(function()
    timerLabel.text = tostring(board:getAttribute("TimeLeft"))
end)

Thay đổi của ClientScript chỉ ở người chơi đó. Part trong ServerService và StorageService không bao giờ rời khỏi server.

Giới hạn ​

  • Một tag: 1 tới 100 ký tự, không xuống dòng; 64 tag mỗi part.
  • 128 attribute mỗi part, và tổng tag cùng attribute tối đa 60 KB.

Vài tag KHIM hiểu ​

TagNghĩa
ClimbableNhân vật leo được: thang, dây leo, giàn
BuiltKhối người chơi đặt bằng tính năng xây dựng