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
-- 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àm | Là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
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) endGiá 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
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:
-- 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
| Tag | Nghĩa |
|---|---|
Climbable | Nhân vật leo được: thang, dây leo, giàn |
Built | Khối người chơi đặt bằng tính năng xây dựng |