Đèn nhấp nháy là một lực lượng mạnh mẽ trong việc ảnh hưởng đến tông màu của một môi trường. Ví dụ, một ngôi nhà có ánh sáng nhất quán có thể cảm thấy ấm áp và mời gọi, nhưng nếu bạn thêm đèn nhấp nháy vào hành lang của ngôi nhà đó, nó trở nên ám ảnh và có thể báo hiệu sự nguy hiểm phía trước. Bằng cách mô hình hóa và lập trình chiến lược các nguồn sáng khác nhau trong trải nghiệm của bạn, bạn có thể thêm một cấp độ mới cho câu chuyện môi trường của mình.
Như với tất cả các sáng tạo 3D, có nhiều cách để đạt được bất kỳ mục tiêu cụ thể nào. Trong hướng dẫn này, bạn có thể nhanh chóng tạo ra một hoạt ảnh đèn nhấp nháy chỉ với một vài tài sản cơ bản, bao gồm một tệp .rbxm cho mô hình đèn ngân hàng có chứa các phần Class.MeshParts con mà bạn có thể tùy chỉnh để phù hợp với thẩm mỹ của những trải nghiệm của riêng bạn.
Trong phương pháp sau để tạo ra đèn nhấp nháy, hãy làm theo từng phần để tìm hiểu cách tạo ra:
- Một NumberSequence độ sáng để ảnh hưởng đến độ sáng của đèn theo thời gian.
- Một thuộc tính thời gian vòng lặp để xác định thời gian mà mỗi chu kỳ nhấp nháy phải mất.
Nhập mô hình đèn mẫu
Hướng dẫn này sử dụng một tệp .rbxm chất lượng cao, có thể tùy chỉnh của mô hình đèn ngân hàng để minh họa một kỹ thuật đèn nhấp nháy. Bạn có thể sử dụng mô hình này để hiểu các nguyên tắc cơ bản, sau đó áp dụng chúng vào các mô hình của riêng bạn mà bạn tạo ra trong Studio hoặc các phần mềm mô hình bên thứ ba khác.
Để nhập mô hình BankersLamp .rbxm:
Trong cửa sổ Explorer, nhấp chuột phải vào Workspace. Một menu ngữ cảnh sẽ hiển thị.
Chọn Insert From File… Một trình duyệt tệp sẽ hiển thị.
Chọn tệp BankersLamp .rbxm, sau đó nhấp vào nút Open. Mô hình sẽ hiển thị trong khung nhìn.

Tạo một NumberSequence độ sáng
NumberSequence là một kiểu dữ liệu đại diện cho một chuỗi các giá trị số từ 0 đến 1 trong suốt vòng đời của một thể hiện. Kiểu dữ liệu này rất hữu ích cho việc tạo ra đèn nhấp nháy vì bạn có thể chỉ định cách mà độ sáng của ánh sáng đèn thay đổi trong suốt vòng đời của nó, và khi bạn thay đổi độ sáng từ cường độ tối đa đến không có ánh sáng nào trong thời gian ngắn, bạn có thể đạt được hiệu ứng nhấp nháy.
Trục X của NumberSequence đại diện cho thời gian, và trục Y đại diện cho độ sáng tương đối. Mỗi điểm vuông ở đầu và cuối chuỗi số là một điểm chính xác định giá trị của thuộc tính tại thời điểm đó trong vòng đời độ sáng của ánh sáng. Khi bạn lần đầu tiên tạo ra một NumberSequence, đồ thị là một đường thẳng và ánh sáng giữ nguyên cường độ sáng suốt vòng đời của nó, nhưng bằng cách thêm và di chuyển các điểm chính, bạn có thể tạo ra các đường cong trong chuỗi và thay đổi độ sáng của đèn theo thời gian.

Mặc dù đèn không có NumberSequence độ sáng theo mặc định, nhưng bạn có thể tạo thuộc tính độ sáng, đặt nó thành loại NumberSequence, sau đó thử nghiệm bằng cách thêm các điểm chính với các giá trị khác nhau cho đến khi ánh sáng nhấp nháy với nhịp mà bạn đã đặt.
Để tạo một NumberSequence độ sáng:
Thêm một thuộc tính NumberSequence mới vào mô hình đèn.
Trong cửa sổ Explorer, chọn mô hình đèn.
Trong cửa sổ Properties, điều hướng đến phần Attributes và nhấp vào nút Add Attribute. Hộp thoại Add Attribute sẽ hiển thị.
Trong hộp thoại Add Attribute,
Trong trường Name, nhập BrightnessCurve.
Nhấp vào menu thả xuống Type, sau đó chọn NumberSequence.
Nhấp vào nút Save. Thuộc tính mới sẽ hiển thị trong phần Attributes của cửa sổ Properties.

Chọn thuộc tính BrightnessCurve mới, sau đó nhấp vào nút …. Một pop-up chuỗi số sẽ hiển thị.

Thực hiện một trong các hành động sau:
- Để thay đổi độ sáng tại một điểm, nhấp vào một điểm chính và kéo nó lên hoặc xuống, hoặc nhập giá trị vào trường Value.
- Để chèn các điểm chính mới, nhấp vào bất kỳ điểm nào trong đồ thị.
- Để xóa một điểm chính, chọn điểm chính đó, sau đó nhấp vào nút Delete.
- Để thêm một khoảng ngẫu nhiên cho độ sáng, nhấp vào bất kỳ điểm chính nào và kéo các đường bao (envelope lines) lên hoặc xuống. Lúc đó, ánh sáng sẽ tạo ra với độ sáng ngẫu nhiên giữa các đường bao màu hồng.
Ví dụ, đồ thị sau làm cho ánh sáng nhấp nháy đến độ sáng tối đa trong lần nhấp nháy đầu tiên, độ sáng 50% trong lần nhấp nháy thứ hai, sau đó độ sáng 75% trong lần nhấp nháy thứ ba.

Tạo một thời gian vòng lặp
Bây giờ bạn đã có một NumberSequence để xác định cách mà độ sáng của ánh sáng đèn thay đổi trong suốt vòng đời của nó, bạn phải xác định thời gian mà bạn muốn vòng lặp nhấp nháy này sẽ kéo dài. Nói cách khác, thời gian vòng lặp này chủ yếu kiểm soát việc NumberSequence lặp lại bao nhiêu lần, tính bằng giây.
Để tạo một thời gian vòng lặp:
Thêm một thuộc tính thời gian vòng lặp mới vào mô hình đèn.
Trong cửa sổ Explorer, chọn mô hình đèn.
Trong cửa sổ Properties, điều hướng đến phần Attributes và nhấp vào nút Add Attribute. Hộp thoại Add Attribute sẽ hiển thị.
Trong hộp thoại Add Attribute,
Trong trường Name, nhập LoopDuration.
Nhấp vào menu thả xuống Type, sau đó chọn Number.
Nhấp vào nút Save. Thuộc tính mới sẽ hiển thị trong phần Attributes của cửa sổ Properties.

Đặt thuộc tính LoopDuration mới thành 1. Điều này thông báo cho NumberSequence lặp lại sau một giây.
Lập trình sự nhấp nháy của ánh sáng
Bây giờ bạn đã có tất cả các yếu tố để kiểm soát độ sáng của đèn trong suốt vòng đời của nó, đã đến lúc tạo ra một Script để kết hợp mọi thứ lại với nhau và làm nhấp nháy ánh sáng.
Để lập trình sự nhấp nháy của ánh sáng:
- Trong cửa sổ Explorer, di chuột qua mô hình đèn và nhấp vào nút ⊕. Một menu ngữ cảnh sẽ hiển thị.
- Từ menu, chèn một Script.
- Trong script mới, nhập mã sau:
local RunService = game:GetService("RunService")
-- Lấy giá trị thuộc tính được thiết lập trên mô hình.
local brightnessCurve = script.Parent:GetAttribute("BrightnessCurve")
local loopDuration = script.Parent:GetAttribute("LoopDuration")
-- Lưu trữ tham chiếu đến các thể hiện của mô hình sẽ thay đổi.
local light = script.Parent.lamp_hood.SpotLight
local bulb = script.Parent.lightbulb
local beam = script.Parent.lamp_hood.Beam
-- Lưu trữ các giá trị thuộc tính gốc sẽ thay đổi.
local origLightBrightness = light.Brightness
local origBeamBrightness = beam.Brightness
local origBulbColor = bulb.Color
-- Lấy giá trị của NumberSequence (ns) tại một thời điểm cụ thể (nsTime)
function evaluateNumberSequence(ns: NumberSequence, nsTime: number)
-- Nếu chúng ta ở 0 hoặc 1, trả về giá trị của điểm chính đầu tiên hoặc cuối cùng, tương ứng.
if nsTime == 0 then
return ns.Keypoints[1].Value
end
if nsTime == 1 then
return ns.Keypoints[#ns.Keypoints].Value
end
-- Nếu không, bước qua từng cặp điểm chính liên tiếp.
for i = 1, #ns.Keypoints - 1 do
-- Lấy điểm chính hiện tại và điểm chính tiếp theo.
local currKp = ns.Keypoints[i]
local nextKp = ns.Keypoints[i + 1]
-- Nếu nsTime ở giữa thời gian của các điểm chính,
if nsTime >= currKp.Time and nsTime < nextKp.Time then
-- Tính toán vị trí nsTime nằm giữa thời gian của các điểm chính, gọi là alpha.
local alpha = (nsTime - currKp.Time) / (nextKp.Time - currKp.Time)
-- Trả về giá trị giữa các điểm cho nsTime sử dụng alpha.
return currKp.Value + (nextKp.Value - currKp.Value) * alpha
end
end
end
RunService.Heartbeat:Connect(function()
-- Giải quyết thời gian của NumberSequence (giữa 0 và 1).
local t = time() / loopDuration
local numberSequenceTime = t - (t // 1)
-- Lấy giá trị của NumberSequence tại thời điểm này.
local brightnessValue = evaluateNumberSequence(brightnessCurve, numberSequenceTime)
-- Điều chỉnh độ sáng và màu sắc dựa trên giá trị này.
light.Brightness = origLightBrightness * brightnessValue
beam.Brightness = origBeamBrightness * brightnessValue
bulb.Color = Color3.new(
origBulbColor.r * brightnessValue,
origBulbColor.g * brightnessValue,
origBulbColor.b * brightnessValue
)
end)
Khi bạn chơi thử trải nghiệm của mình, kết nối sự kiện Heartbeat sẽ thực thi các việc sau mỗi khung hình:
- Giải quyết thời gian (numberSequenceTime) trong brightnessCurve NumberSequence dựa trên thời gian hiện tại.
- Thời gian nằm giữa 0 và 1 vì chúng đại diện cho sự bắt đầu và kết thúc của NumberSequence.
- Giải quyết giá trị (brightnessValue) của brightnessCurve NumberSequence tại thời gian numberSequenceTime.
- evaluateNumberSequence() tính toán giá trị liên quan đến thời gian cho bất kỳ NumberSequence nào.
- Giá trị này phục vụ như một giá trị độ sáng tương đối để áp dụng cho các thuộc tính thay đổi theo thời gian.
- Thay đổi các thuộc tính của đèn bằng cách nhân brightnessValue với độ sáng của đèn, độ sáng của chùm sáng và màu của bóng đèn.
Các thay đổi đến những thuộc tính này theo thời gian dẫn đến hiệu ứng nhấp nháy như dưới đây.