Hướng dẫn trung cấp

Thêm âm thanh 2D

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Âm thanh 2D là âm thanh không định hướng không phát ra từ một vị trí cụ thể nào, vẫn giữ nguyên bất kể vị trí hoặc hướng của người nghe trong không gian 3D. Điều này có nghĩa là khi người chơi di chuyển vị trí nghe của họ trong môi trường, họ có thể nghe thấy âm thanh 2D từ bất kỳ đâu họ quay.

Sử dụng tệp .rbxl Gingerbread House - Start làm điểm khởi đầu và Gingerbread House - Complete Audio làm tài liệu tham khảo, hướng dẫn này cho bạn biết cách thêm cả âm thanh 2D lặp lại và một lần vào trải nghiệm của bạn, bao gồm hướng dẫn về:

  • Nhạc nền lặp lại phát ngay khi người chơi kết nối với máy chủ.
  • Kích hoạt âm thanh cung cấp phản hồi tức thì cho người chơi dựa theo mục tiêu chơi game của họ.
  • Kích hoạt các âm thanh khác nhau để chỉ ra các tương tác giao diện người dùng khác nhau.

Nếu bạn gặp khó khăn trong quá trình này, bạn có thể sử dụng Gingerbread House - Complete Audio làm tài liệu tham khảo để so sánh tiến trình của mình.

Đối tượng âm thanh 2D

Để tạo âm thanh không định hướng, điều quan trọng là hiểu các đối tượng âm thanh mà bạn sẽ làm việc trong suốt hướng dẫn này. Có ba loại đối tượng âm thanh chính cho âm thanh 2D:

  • Đối tượng AudioPlayer tải và phát tệp âm thanh.
  • Đối tượng AudioDeviceOutputthiết bị phần cứng vật lý trong thế giới thực, chẳng hạn như loa hoặc tai nghe.
  • Wires mang âm thanh từ một đối tượng này tới đối tượng khác.

Tất cả những đối tượng âm thanh này hoạt động cùng nhau để truyền âm thanh từ việc phát tệp tới phần cứng của từng người chơi. Hãy cùng xem cách điều này hoạt động trên thực tế bằng một ví dụ về một người chơi đang đeo tai nghe trong khi chơi trải nghiệm trên máy tính xách tay của họ:

  • Đối tượng AudioPlayer tải ID tài sản âm thanh 127645268874265 vào trải nghiệm cho âm thanh mua tiền tệ.
  • Một Wire truyền dòng âm thanh từ AudioPlayer tới AudioDeviceOutput để dòng âm thanh phát ra từ tai nghe của người chơi.
  • Đối tượng AudioDeviceOutput truyền âm thanh tới loa vật lý của người chơi, hoặc trong trường hợp này, tới tai nghe của họ.

Các phần tiếp theo sẽ đi sâu hơn và tham chiếu các đối tượng này khi bạn học cách phát cả âm thanh 2D lặp lại và một lần. Khi bạn xem xét các đối tượng này với các kỹ thuật sắp tới, bạn có thể dự đoán chính xác hơn cách thu nhận và truyền âm thanh từ trải nghiệm tới người chơi.

Âm thanh lặp lại

Âm thanh 2D lặp lại, hoặc âm thanh không định hướng lặp lại liền mạch ngay khi người chơi kết nối tới máy chủ, là một kỹ thuật thiết kế âm thanh phổ biến để cung cấp một nền tảng âm thanh thống nhất bất kể người chơi đang làm gì hoặc họ ở đâu trong không gian 3D. Hơn nữa, âm thanh 2D lặp lại đảm bảo rằng trải nghiệm của bạn không bao giờ hoàn toàn im lặng, thứ có thể làm lạc hướng và gây phân tâm cho người chơi khỏi các mục tiêu của họ.

Để minh họa khái niệm này, hãy xem xét cách âm thanh 2D dưới đây nâng cao đáng kể chất lượng của mẫu Hazardous Space Station. Nếu không có nhạc nền, trạm không gian cảm thấy trống rỗng và không có sinh khí. Tuy nhiên, khi trạm không gian bao gồm nhạc nền, nó cảm thấy vừa đáng sợ vừa nguy hiểm, làm tăng bầu không khí hồi hộp.

Không có âm thanh 2D lặp lại
Có âm thanh 2D lặp lại

Âm thanh lặp lại đặc biệt hữu ích để thiết lập cảm giác mà bạn muốn người chơi cảm nhận ngay khi họ gia nhập trải nghiệm của bạn. Ví dụ, mẫu này nhằm mang lại cho người chơi một cuộc phiêu lưu vui vẻ trong một vùng đất mùa đông, vì vậy nó sử dụng một bản nhạc vui tươi để ảnh hưởng tích cực đến tâm trạng của họ ngay khi họ bước vào môi trường. Để thấy kỹ thuật này có thể ảnh hưởng như thế nào, hãy xem xét trải nghiệm của người chơi sẽ thay đổi ra sao nếu bạn thay thế âm thanh lặp lại bằng một bản nhạc metal.

Để tái tạo âm thanh 2D lặp lại trong mẫu tệp Gingerbread House - Complete Audio:

  1. Kích hoạt một trình nghe mặc định gắn với nhân vật người chơi của bạn.

    1. Trong cửa sổ Explorer, chọn SoundService.
    2. Trong cửa sổ Properties, đặt DefaultListenerLocation thành Character. Khi bạn chạy trải nghiệm, engine sẽ tự động tạo một AudioDeviceOutput dưới SoundService.
  2. Trong cửa sổ Explorer, điều hướng đến SoundService, sau đó:

    1. Chèn một đối tượng AudioPlayer để tạo âm thanh nguồn.
    2. Chèn một đối tượng AudioDeviceOutput để tạo một loa phát trong suốt trải nghiệm.
    3. Chèn một đối tượng Wire để truyền dòng âm thanh từ trình phát âm thanh tới loa.
  3. Chọn AudioPlayer, sau đó ở trong cửa sổ Properties,

    1. Đặt AssetID thành rbxassetid://1841461968 để phát một bản nhạc vui tươi.
    2. Kích hoạt Looping để âm thanh phát lại liền mạch.
    3. Đặt Volume thành 0.2 để phát âm thanh ở mức âm lượng thấp để bạn có thể nghe thấy các nguồn âm thanh khác trong trải nghiệm.
  4. Chọn Wire, sau đó ở trong cửa sổ Properties,

    1. Đặt SourceInstance thành AudioPlayer mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh từ trình phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioDeviceOutput mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh đến loa cụ thể này.
  5. Quay lại cửa sổ Explorer, chèn một Script vào AudioPlayer, đổi tên thành LoopBackgroundMusic, đặt thuộc tính RunContext thành Client, sau đó dán mã sau vào script:


    local audioPlayer = script.Parent
    audioPlayer:Play()

    Script bắt đầu bằng cách khai báo một biến để đại diện cho cha của script AudioPlayer. Script sau đó thiết lập nguồn âm thanh để phát từ thời điểm người chơi gia nhập trải nghiệm đến thời điểm họ thoát khỏi trải nghiệm.

  6. Chơi thử trải nghiệm để nghe nhạc nền lặp lại.

Âm thanh một lần

Âm thanh 2D một lần, hoặc âm thanh không định hướng phát một lần vào một thời điểm và vị trí cụ thể trừ khi một người chơi kích hoạt lại, cung cấp cho người chơi thông tin quan trọng về bất kì điều gì mà bạn không muốn họ bỏ lỡ. Sử dụng loại phản hồi âm thanh này trong trải nghiệm của bạn là điều thiết yếu vì nó cung cấp phản hồi tức thì, rõ ràng cho các chức năng chơi game quan trọng và hành động của người chơi, chẳng hạn như bắt đầu một trận đánh boss hoặc mất một lượng lớn sức khỏe.

Các phần tiếp theo cung cấp chi tiết thực hiện cho các tình huống chơi game chung mà người chơi cần phản hồi kịp thời, không định hướng, bao gồm phản hồi về gameplay, tương tác với các yếu tố giao diện người dùng, và lồng ghép giọng nói cho các hướng dẫn.

Phản hồi gameplay

Khi người chơi tiến bộ qua trải nghiệm của bạn, điều quan trọng là họ nhận được phản hồi âm thanh ngay lập tức về trạng thái của bất kì điều gì ảnh hưởng đến gameplay của họ, chẳng hạn như điểm số, sức khỏe hoặc tiến trình cấp độ. Bởi vì loại âm thanh này kết nối trực tiếp với mục tiêu của người chơi, điều quan trọng là những âm thanh này phải rõ ràng, có thể nghe thấy và truyền tải thông tin hữu ích và chính xác.

Để minh họa khái niệm này, hãy xem xét âm thanh một lần từ mẫu Platformer phát ra khi người chơi nhảy và thu thập tiền xu:

  • Một âm thanh vù vù nhẹ nhàng phát ra ngay khi người chơi nhấn phím nhảy trên thiết bị của họ.
  • Một âm thanh ding cao và âm thanh tiền xu lăn lóc phát ra ngay khi nhân vật của người chơi chạm vào một đồng tiền.

Cả hai âm thanh này đều ngay lập tức nhận dạng được trong ngữ cảnh của không gian 3D, và chúng giúp người chơi hiểu được sự thành công của hành động của họ mà không chỉ dựa vào các tín hiệu thị giác.

Khi bạn phát nhiều âm thanh cùng một lúc, một số âm thanh có thể quan trọng hơn khi người chơi nghe hơn những âm thanh khác. Trong trường hợp này, âm thanh thu thập tiền xu đang truyền đạt thông tin gameplay có giá trị hơn âm thanh nhảy, vì vậy trải nghiệm sẽ phát nó ở một mức âm lượng hơi cao hơn. Tuy nhiên, không có tiêu chuẩn hoặc quy tắc nào để đạt được một bản phối tuyệt vời, vì vậy hãy điều chỉnh âm thanh trong trải nghiệm của bạn để phản ánh điều mà bạn cảm thấy quan trọng nhất.

Ví dụ, mẫu bao gồm nhiều chất kích thích âm thanh trong suốt trải nghiệm, nhưng chúng không đều ở cùng một mức độ quan trọng cho việc hiểu mục tiêu chính của trải nghiệm: thu thập bánh kẹo để mở ngôi nhà gừng. Để đảm bảo rằng người chơi thấy được điều họ cần làm, mẫu này nhân ba biên độ của phản hồi âm thanh mỗi khi người chơi thu thập một bánh kẹo.

Để tái tạo phản hồi âm thanh trạng thái một lần trong mẫu Gingerbread House - Complete Audio:

  1. Trong cửa sổ Explorer, điều hướng đến WorkspaceGumdropsGumdrop, sau đó:

    1. Chèn một đối tượng AudioPlayer để tạo một âm thanh nguồn.
    2. Chèn một đối tượng AudioDeviceOutput để tạo một loa phát trong suốt trải nghiệm.
    3. Chèn một đối tượng Wire để truyền dòng âm thanh từ trình phát âm thanh tới loa.
  2. Chọn AudioPlayer, sau đó ở trong cửa sổ Properties,

    1. Đặt AssetID thành rbxassetid://9113723699 để phát một bản nhạc gặm nhấm nhẹ nhàng.
    2. Đặt TimePosition thành 0.15 để bắt đầu tệp âm thanh gần hơn với âm thanh gặm nhấm thực tế.
    3. Đặt Volume thành 3 để phát âm thanh ở mức âm lượng cao để bạn có thể nghe thấy âm thanh bánh kẹo so với các nguồn âm thanh khác trong trải nghiệm.
  3. Chọn Wire, sau đó ở trong cửa sổ Properties,

    1. Đặt SourceInstance thành AudioPlayer mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh từ trình phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioDeviceOutput mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh đến loa cụ thể này.
  4. Nhân đôi Gumdrop cho đến khi bạn có ba bánh kẹo, sau đó rải chúng xung quanh môi trường.

  5. Quay lại cửa sổ Explorer, điều hướng đến ServerScriptService, sau đó chèn một Script, đổi tên thành GumdropService, đặt thuộc tính RunContext thành Server, sau đó dán mã sau vào script:


    -- Khởi tạo dịch vụ
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Các mô-đun
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Biến
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- Cập nhật bảng bánh kẹo
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Cập nhật bảng xếp hạng bánh kẹo
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Kiểm tra xem người chơi có thu thập ba bánh kẹo
    if newGumdropAmount >= 3 then
    -- Phát âm thanh sự kiện cánh cửa khi người chơi thu thập ba bánh kẹo
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Animation cánh cửa di chuyển xuống dưới
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- Định nghĩa trình xử lý sự kiện
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Active") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Người chơi đã chạm vào một bánh kẹo
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Active", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    end
    end
    end
    -- Thiết lập trình lắng nghe sự kiện
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Active", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Script này bắt đầu bằng việc khởi tạo các dịch vụ Workspace, Players, ServerStorage, và TweenService để có thể tham chiếu tới các đối tượng con và chức năng của chúng. Sau đó, nó yêu cầu mô-đun LeaderboardPlayerData trong ServerStorage; các mô-đun này chịu trách nhiệm tạo và cập nhật bảng xếp hạng ở góc trên bên phải của màn hình theo dõi số lượng bánh kẹo mà người chơi thu thập trong môi trường.

    Hàm updatePlayerGumdrops của script chủ yếu chịu trách nhiệm cập nhật bảng xếp hạng mỗi khi người chơi thu thập một bánh kẹo, và chờ thời điểm mà họ thu thập tất cả ba bánh kẹo để có thể kích hoạt âm thanh định hướng và hoạt ảnh cho cánh cửa ngôi nhà gừng. Để biết thêm thông tin về phần này của script, xem Thêm âm thanh 3D - Phản hồi sự kiện.

    Hàm onGumdropTouched của script là nơi diễn ra phần lớn công việc cho việc kích hoạt âm thanh 2D cho phản hồi gameplay, và nó nhận hai tham số:

    • otherPart - Một phần mà va chạm với bánh kẹo.
    • gumdrop - Một phần hình cầu đại diện cho một bánh kẹo.

    Khi bất kỳ điều gì va chạm với phần bánh kẹo, script trước tiên kiểm tra xem bánh kẹo có đang hoạt động hay không. Nếu có, nó kiểm tra xác nhận rằng đối tượng va chạm là một người chơi. Nếu có, script sau đó:

    • Phát âm thanh 2D từ trình phát âm thanh.
    • Biến bánh kẹo thành vô hình.
    • Vô hiệu hóa bánh kẹo để người chơi không thể tương tác với bánh kẹo vô hình.
    • Cập nhật bảng xếp hạng cho người chơi đã chạm vào bánh kẹo.

    Cuối cùng, script thiết lập các trình lắng nghe sự kiện để mỗi bánh kẹo đều kết nối một hàm tới sự kiện Touched, điều này gọi hàm onGumdropTouched khi một người chơi chạm vào bánh kẹo.

  6. Chơi thử trải nghiệm để nghe âm thanh gặm nhấm sau khi bạn thu thập một bánh kẹo.

Tương tác giao diện người dùng

Khi người chơi tương tác với các yếu tố giao diện người dùng (UI) của bạn, chẳng hạn như di chuột qua một ô chọn hoặc chọn một nút mua, điều quan trọng là cung cấp phản hồi tức thì để họ trực giác hiểu cách họ đang tương tác với giao diện người dùng của bạn. Ví dụ, nhiều nhà thiết kế thay đổi các đặc điểm hình ảnh của giao diện người dùng khi người chơi bật hoặc tắt các cài đặt để truyền đạt trạng thái của cài đặt.

Tuy nhiên, đối với những người chơi có khiếm khuyết thị giác, nơi mà những thay đổi màu sắc hoặc hoạt ảnh khó khăn hơn để hiểu chỉ bằng chính chúng, việc cung cấp nhiều hình thức phản hồi cảm giác cho các tương tác giao diện người dùng của bạn là rất hữu ích để giữ cho chúng luôn dễ tiếp cận và trực giác cho càng nhiều người chơi càng tốt. Để mở rộng khái niệm này, hãy xem xét các trạng thái giao diện người dùng sau đây mà là quan trọng cho các nút mua của mẫu UGC Homestore:

  • Đang tập trung - Chỉ ra rằng người chơi đang làm nổi bật một yếu tố giao diện người dùng chuẩn bị chọn nó.
  • Trên hover - Chỉ ra rằng người chơi đang di chuột qua một yếu tố giao diện người dùng với con trỏ của họ.
  • Đã chọn - Chỉ ra rằng người chơi đã chọn một yếu tố giao diện người dùng thông qua đầu vào của họ.

Tất cả ba tương tác này đều cần thiết cho quy trình người dùng chính của mẫu, gồm người chơi duyệt, chọn và mua trang phục và phụ kiện avatar, vì vậy điều quan trọng nhất là không ai bị nhầm lẫn về cách tương tác với giao diện người dùng. Để chuẩn bị cho người chơi thành công, mẫu cung cấp cả phản hồi hình ảnh và âm thanh cho mỗi tương tác giao diện người dùng.

Phản hồi hình ảnh
Chế độ xem mặc định
Chế độ đang tập trung
Chế độ trên hover
Chế độ đã chọn

Để cung cấp một ví dụ về cách bạn có thể cấu hình nhiều hình thức phản hồi cảm giác, mẫu cung cấp cả phản hồi hình ảnh và âm thanh bất cứ khi nào người chơi nhấn nút bạc hà trên màn hình. Khi người chơi không tương tác với nút, nó giống như một viên kẹo bạc hà điển hình, nhưng khi họ nhấn nút, mẫu này:

  • Phát một bản nhạc jingle vui vẻ.
  • Tô màu nút bằng một sắc xanh.
  • Đưa nút xuống một chút trên màn hình.

Từ đây, bạn có thể kết nối tương tác này với tất cả các loại hành động chơi game hữu ích, chẳng hạn như mở một menu hoặc mua một item.

Chế độ xem mặc định
Chế độ đã nhấn

Để tái tạo âm thanh tương tác giao diện người dùng một lần trong mẫu Gingerbread House - Complete Audio:

  1. Trong cửa sổ Explorer, điều hướng đến StarterGui2DAudioButton, sau đó:

    1. Chèn một đối tượng AudioPlayer để tạo âm thanh nguồn.
    2. Chèn một đối tượng AudioDeviceOutput để tạo một loa phát trong suốt trải nghiệm.
    3. Chèn một đối tượng Wire để truyền dòng âm thanh từ trình phát âm thanh tới loa.
  2. Chọn AudioPlayer, sau đó ở trong cửa sổ Properties, đặt AssetID thành rbxassetid://3422389728 để phát một bản nhạc jingle retro.

  3. Chọn Wire, sau đó ở trong cửa sổ Properties,

    1. Đặt SourceInstance thành AudioPlayer mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh từ trình phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioDeviceOutput mới của bạn để chỉ định rằng bạn muốn dây cáp này truyền âm thanh đến loa cụ thể này.
  4. Quay lại cửa sổ Explorer, chèn một LocalScript vào 2DAudioButton, đổi tên thành PlayAudioWhenPressed, sau đó dán mã sau vào script:


    local TweenService = game:GetService("TweenService")
    local buttonGui = script.Parent
    local buttonImageButton = buttonGui.ButtonFrame.ButtonImageButton
    local buttonAudioPlayer = buttonGui.AudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- Đã nhấn
    [true] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position + UDim2.fromScale(0, .1),
    ImageColor3 = Color3.fromRGB(117, 255, 255),
    }),
    -- Mặc định
    [false] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position,
    ImageColor3 = Color3.fromRGB(255, 255, 255),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonImageButton.Activated:Connect(function(_hit)
    buttonAudioPlayer:Play()
    end)

    Script bắt đầu bằng việc lấy:

    • TweenService để có thể thực hiện hoạt ảnh cho các yếu tố giao diện.
    • Đối tượng 2DAudioButton ScreenGui của cha của script.
    • ImageButton của kẹo bạc hà.
    • Đối tượng trình phát âm thanh có bản nhạc jingle của bạn.

    Script sau đó định nghĩa:

    • Một đối tượng TweenInfo chỉ định rằng hoạt ảnh của nút sẽ phát với kiểu hoạt ảnh số mũ.
    • Hai tween đại diện cho trạng thái đã nhấn hoặc không nhấn của nút.
      • Trạng thái true đã nhấn sẽ di chuyển nút xuống một chút trên màn hình và tô sáng nó với một sắc xanh.
      • Trạng thái false không nhấn sẽ đưa nút trở lại vị trí ban đầu trên màn hình và xóa màu sắc trước đó.

    Phần còn lại của script là nơi phần lớn công việc diễn ra để kích hoạt phản hồi giao diện người dùng 2D, vì vậy hãy xem xét cách hàm onIsPlayingChanged và các trình lắng nghe sự kiện làm việc cùng nhau cho quy trình người dùng giao diện:

    1. buttonImageButton.Activated lắng nghe người chơi nhấn nút, sau đó gọi hàm Play() để bắt đầu phát âm thanh liên quan từ trình phát âm thanh. Quy trình này chuyển đổi thuộc tính AudioPlayer.IsPlaying từ false thành true.
    2. buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying") lắng nghe sự thay đổi thuộc tính IsPlaying của trình phát âm thanh, sau đó gọi hàm onIsPlayingChanged.
    3. Hàm onIsPlayingChanged sử dụng thông tin này để kích hoạt tween thay đổi hình ảnh của nó trên màn hình.
    4. Để ngăn người chơi vô tình khởi động lại âm thanh nếu họ nhấp vào nút liên tục, buttonAudioPlayer.Ended lắng nghe trình phát âm thanh để hoàn tất việc phát trước khi gọi hàm onIsPlayingChanged một lần nữa.

    Điều quan trọng cần lưu ý là sự kiện onIsPlayingChanged chỉ được kích hoạt khi nó chuyển đổi từ false sang true, có nghĩa là nó không được kích hoạt khi chuyển từ true sang false. Đây là hành vi dự định do những phức tạp với thời gian của việc tái tạo các thuộc tính từ máy chủ tới máy khách. Vì lý do này, sự kiện Ended được cung cấp và lắng nghe trong ví dụ này để bao trùm cả hai trường hợp.

  5. Chơi thử trải nghiệm để nghe bản nhạc jingle mỗi khi bạn nhấn vào nút trên màn hình.

©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.