Chạm, Prompt và Zone
Cách người chơi tương tác với world: chạm vào part, bấm vào chúng, bấm phím khi đứng gần, đi vào một vùng. Phần lớn không cần code.
Gameplay không cần code
Đặt một trong các đối tượng này vào trong part (Insert Object > Gameplay (no script needed)), chỉnh một hai con số trong Inspector, và bấm Play. Cả bộ đồ nghề của một obby chỉ là vài lần chèn.
| Đối tượng | Khi người chơi chạm vào part | Cài đặt |
|---|---|---|
| Teleporter | Họ xuất hiện đứng trên một part khác | destination (một part). Hai Teleporter trỏ vào nhau thành cổng hai chiều |
| Hazard | Trừ máu ngay, và trừ tiếp mỗi giây họ còn đứng đó | damage (100, cả thanh máu: chết ngay; số âm thì hồi máu) |
| Checkpoint | Từ giờ chết sẽ hồi sinh ở đây | - |
| Pickup | Cộng vào chỉ số của họ và part biến mất một lúc | stat ("Coins"), amount (1), respawnTime (10 giây; 0 = không quay lại) |
| Boost | Tăng tốc độ đi và lực nhảy trong một lúc | walkSpeed, jumpPower, duration (giây) |
Và bốn đối tượng không cần người chơi chạm:
| Đối tượng | Làm gì | Cài đặt |
|---|---|---|
| Motion | Part (và các part bên trong) tự di chuyển và xoay: bệ di động, thang máy, lưỡi dao quay, búa lắc | move (một vec3 tính bằng unit), turn (độ), pivot, time (mỗi chiều), pause (ở mỗi đầu), delay, reverses, looped, smooth, relative |
| Spawner | Cứ vài giây tạo một bản sao của một part hay Model tại vị trí part của nó: quặng của máy thả, đá rơi | template, interval, limit (tối đa cùng lúc), lifetime, velocity, relative |
| Seat | Người chơi chạm vào là ngồi xuống; nhảy để đứng lên | occupant, sat, left, sit(player), stand() |
| VehicleSeat | Ghế lái: phím của người ngồi điều khiển các Hinge có motor trong Model của nó. Insert > Vehicle (car) tạo sẵn một chiếc xe chạy được | maxSpeed, torque, turnSpeed; đọc throttle, steer |
Server làm tất cả, nên người chơi không thể gian lận để nhặt xu hay vượt dung nham.
Thêm vào bằng script
Mỗi đối tượng chạy triggered(player) khi nó hoạt động, và một event có tên rõ nghĩa hơn: Teleporter teleported, Hazard hurt, Checkpoint reached, Pickup collected, Boost boosted. Script thêm hành vi mà không thay thế nó:
world.Coin.Pickup.collected:connect(function(player)
print(player.name .. " có " .. player.stats.Coins .. " xu")
end)
world.Finish.Checkpoint.reached:connect(function(player)
chat.send(player.displayName .. " đã về đích!")
end)
local lava = new("Hazard", world.Floor) -- và tạo chúng như mọi thứ khác
lava.damage = 25Đối tượng nào cũng có enabled.
Chạm
touched chạy khi có gì chạm vào part - nhân vật người chơi hoặc part khác. touchEnded khi thôi chạm.
local pad = world.SpeedPad
pad.touched:connect(function(hit)
local player = players.fromPart(hit)
if player then
player.walkSpeed = 40
end
end)touched chạy nhiều lần khi có người đứng trên part. Muốn làm một lần, hãy nhớ ai đang đứng đó:
local onPad = {}
pad.touched:connect(function(hit)
local player = players.fromPart(hit)
if not player or onPad[player.name] then return end
onPad[player.name] = true
player:damage(10) -- một lần, không phải mỗi khung hình họ đứng đó
task.wait(1)
onPad[player.name] = nil
end)Bấm chuột: Clickable
Đặt một Clickable vào part là người chơi bấm (hoặc chạm trên điện thoại) vào được:
local button = world.Button
local clicker = new("Clickable", button)
clicker.maxDistance = 20 -- unit
clicker.clicked:connect(function(player)
print(player.name .. " đã bấm nút")
end)Bấm phím: Prompt
Prompt trong một part hiện một bảng nhỏ - "[E] Mở" - cho người chơi đứng gần. Bấm phím đó, hoặc bấm/chạm vào bảng, sẽ chạy triggered trên server:
local door = world.Door
local prompt = new("Prompt", door)
prompt.text = "Mở"
prompt.key = "E"
prompt.maxDistance = 8
prompt.triggered:connect(function(player)
door.canCollide = false
door.transparency = 0.7
task.wait(3)
door.canCollide = true
door.transparency = 0
end)Chỉ Prompt gần nhất trong tầm mới hiện, và server kiểm tra lại người chơi có thật sự ở trong tầm.
Chữ trên part: Billboard
local sign = new("Billboard", world.Shop)
sign.text = "CỬA HÀNG"
sign.offset = 2 -- số unit phía trên mặt trên của part
sign.textSize = 24
sign.maxDistance = 80Nó luôn quay về phía camera, giữ nguyên cỡ trên màn hình, và mờ đi khi có vật chắn giữa nó và camera. Để viết chữ lên một mặt của part, dùng Sign (text, face, textColor, fit).
Vùng: Zone
Zone biến part thành một vùng báo ai đi vào, ai đi ra - cửa hàng, vùng an toàn, vạch đích. KHIM Engine làm part trong suốt, neo và đi xuyên được khi bạn thêm Zone.
local zone = world.ShopArea.Zone
zone.entered:connect(function(player)
net.send(player, "openShop")
end)
zone.left:connect(function(player)
net.send(player, "closeShop")
end)
print(#zone:players() .. " người trong cửa hàng")| Thành viên | Là gì |
|---|---|
entered, left | Một người chơi vào / ra |
partEntered, partLeft | Một part không neo vào / ra |
players(), parts() | Ai và cái gì đang ở trong |
contains(position or player or part) | Có ở trong không |
enabled | Bật hay tắt |
Người chơi ở trong khi đường thẳng xuyên người họ, từ chân tới đầu, đi qua part - nên một tấm phẳng trên sàn cũng hoạt động như một khối cao.
Hẹn giờ: Timer
Timer chạy sau một khoảng thời gian, một lần hoặc lặp lại - đồng hồ của một vòng chơi, ngòi bom, một đợt quái:
local timer = new("Timer", world)
timer.interval = 30
timer.repeats = true
timer.fired:connect(function()
chat.send("Một đợt mới đang tới!")
end)
timer:start()
-- timer.timeLeft, timer.running, timer:stop()