Thêm âm thanh 3D

*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 3D là âm thanh định hướng phát ra từ một vị trí cụ thể trong không gian 3D, tăng hoặc giảm âm lượng tùy thuộc vào khoảng cách và hướng giữa bộ phát âm thanh và người nghe. Điều này có nghĩa là khi người nghe hoặc bộ phát di chuyển xung quanh môi trường, người chơi có thể nghe âm thanh đó một cách động từ các hướng và mức âm lượng khác nhau.

Sử dụng tệp Gingerbread House - Start .rbxl 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 sẽ chỉ cho bạn cách thêm cả âm thanh 3D lặp lại và âm thanh một lần vào trò chơi của bạn, bao gồm hướng dẫn về:

  • Âm thanh môi trường 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 để thông báo cho người chơi về các sự kiện tình huống quan trọng cho lối chơi của họ.
  • Kích hoạt âm thanh để cung cấp phản hồi âm thanh cho người chơi khi họ tương tác với các đối tượng 3D.
  • Phát các đoạn âm thanh của nhân vật để thu hút và hướng dẫn người chơi đến các điểm thú vị trong môi trường của họ.

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

Để tạo âm thanh đị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ó sáu loại đối tượng âm thanh chính cho âm thanh 3D:

  • Đối tượng AudioPlayer tải và phát tệp âm thanh.
  • Đối tượng AudioEmitter là một loa ảo phát âm thanh vào môi trường 3D.
  • Đối tượng AudioListener là một micro ảo thu âm thanh từ môi trường 3D.
  • Đối tượng AudioDeviceOutput là một thiế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.
  • Đối tượng AudioDeviceInput là một micro vật lý trong thế giới thực.
  • Wires mang các luồng âm thanh từ một đối tượng này sang đối tượng khác.

Tất cả các đối tượng âm thanh này làm việc cùng nhau để phát ra âm thanh giống như các đối tượng tương ứng trong thế giới thực. Hãy xem cách điều này hoạt động trong thực tế bằng cách sử dụng một ví dụ về một người chơi đeo tai nghe trong khi chơi trò chơi 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 1516791621 vào trò chơi cho một bản nhạc mưa.
  • Đối tượng AudioEmitter phát một luồng âm thanh của bản nhạc mưa vào môi trường 3D.
  • Một đối tượng Wire mang luồng từ AudioPlayer đến AudioEmitter để luồng âm thanh phát ra từ loa 3D.
  • Đối tượng con AudioListener của nhân vật lắng nghe âm thanh đó trong môi trường 3D và truyền lại cho tai nghe của họ.
  • Đối tượng AudioDeviceOutput mang âm thanh từ AudioListener đến loa vật lý của người chơi, hoặc trong trường hợp này, tai nghe của họ.
  • Đối tượng AudioDeviceInput thu âm thanh từ thế giới thực và truyền lại vào trò chơi cho trò chuyện bằng giọng nói.
Các đại diện đối tượng trong trò chơi
Các đại diện đối tượng trong thế giới thực

Các phần tiếp theo sẽ đi sâu hơn và tham chiếu đến các đối tượng này khi bạn học cách phát cả âm thanh 3D 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 và truyền âm thanh từ trò chơi đến người chơi và ngược lại.

Âm thanh lặp lại

Âm thanh 3D lặp lại, hoặc âm thanh định hướng lặp lại một cách liền mạch ngay khi người chơi kết nối với máy chủ, là một kỹ thuật thiết kế âm thanh phổ biến để nâng cao bầu không khí của không gian 3D bằng cách làm cho nó cảm thấy sống động và năng động. Ngoài ra, âm thanh 3D lặp lại giữ cho các nguồn âm thanh môi trường của bạn nhất quán, chẳng hạn như tiếng tĩnh của một chiếc tivi hoặc tiếng gầm của một thác nước; nếu những âm thanh này đột ngột dừng lại, môi trường sẽ cảm thấy không thực tế.

Để minh họa khái niệm này, hãy xem cách âm thanh 3D cho hai thác nước lớn dừng lại ngay khi bản nhạc không lặp lại hoàn thành. Trong khi âm thanh nước ban đầu làm cho người chơi đắm chìm vào môi trường ngoài trời, sự thay đổi âm thanh đột ngột là khó chịu và không tự nhiên với cách mà một thác nước hoạt động trong thế giới thực.

Tương tự, mẫu sử dụng kỹ thuật này cho thác nước sô cô la chảy, và điều chỉnh âm lượng của nó theo khoảng cách của người chơi từ bộ phát âm thanh. Khi người chơi cách dưới 20 studs, bộ phát phát ra âm thanh với âm lượng tối đa. Khi người chơi di chuyển xa hơn, âm thanh sóng nước giảm âm lượng mỗi 20 studs cách xa bộ phát âm thanh. Điều này mô phỏng âm thanh trong thế giới thực giảm âm lượng khi bạn càng xa nguồn phát.

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

  1. Kích hoạt một bộ lắng 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ò chơi, động cơ tự động:
      • Tạo một AudioListener dưới Humanoid.RootPart của mỗi nhân vật người chơi để bạn có thể nghe âm thanh thay đổi trong loa thực tế của bạn theo vị trí và quy mô của các nguồn âm thanh trong trò chơi.
      • Tạo một AudioDeviceOutput dưới SoundService.
  2. Trong cửa sổ Explorer, điều hướng đến WorkspaceWaterfallAudioObject, sau đó:

    1. Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho thác nước.
    2. Chèn một đối tượng AudioEmitter để phát một luồng định vị từ WaterfallAudioObject.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  3. Chọn AudioPlayer, sau đó trong cửa sổ Properties,

    1. Đặt AssetID thành rbxassetid://1516791621 để phát một bản nhạc âm thanh mưa.
    2. Kích hoạt Looping để âm thanh lặp lại một cách liền mạch.
  4. Chọn AudioEmitter, sau đó trong cửa sổ Properties, đặt DistanceAttenuation thành {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} để âm thanh giảm dần âm lượng mỗi 20 studs cách xa bộ phát âm thanh.

  5. 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 mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong thác nước.
  6. Quay lại cửa sổ Explorer, chèn một Script vào WaterfallAudioObject, đổi tên thành LoopWaterfallMusic, đặt thuộc tính RunContext của nó 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 tham gia trò chơi cho đến khi họ thoát khỏi trò chơi.

  7. Chơi thử trò chơi để nghe âm thanh mưa sô cô la lặp lại khi nhân vật của bạn gần thác nước. Khi bạn xoay đầu nhân vật để nhìn về một hướng khác, âm thanh sẽ thay đổi động trong loa thực tế của bạn theo vị trí của bộ phát trong không gian 3D.

Âm thanh một lần

Âm thanh 3D một lần, hoặc âm thanh định hướng phát ra một lần tại 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 ngữ cảnh về hành động của họ, môi trường và bất kỳ nhân vật nào xung quanh họ. Việc sử dụng loại phản hồi âm thanh này trong trò chơi của bạn là rất quan trọng vì nó cho phép người chơi đưa ra quyết định chiến lược như tránh kẻ thù đang đến hoặc nhặt các vật phẩm hữu ích.

Các phần tiếp theo cung cấp chi tiết triển khai cho các tình huống lối chơi phổ biến mà người chơi cần phản hồi định hướng kịp thời, bao gồm các sự kiện lối chơi tình huống, tương tác đối tượng và đối thoại của nhân vật không thể chơi được.

Phản hồi sự kiện

Khi người chơi kích hoạt các sự kiện tình huống quan trọng trong môi trường của họ, chẳng hạn như mở khóa các khu vực lối chơi mới hoặc kích hoạt hỏa lực của kẻ thù, điều quan trọng là họ hiểu nơi nào trong không gian 3D mà họ cần tập trung và chú ý. Nếu họ không nhận được phản hồi âm thanh ngay lập tức, họ có thể bỏ lỡ thông tin quan trọng cho lối chơi của họ, dẫn đến sự thất vọng vì không biết đi đâu hoặc làm gì tiếp theo.

Để minh họa tại sao điều này quan trọng, hãy xem âm thanh 3D một lần từ mẫu Laser Tag phát ra từ mỗi khẩu súng của người chơi:

  • Một âm thanh nổ sâu phát ra cho mỗi phát bắn mà người chơi bắn từ khẩu súng của họ.
  • Một âm thanh bíp và nhấp chuột phát ra mỗi khi người chơi nạp lại khẩu súng của họ với một viên đạn mới.

Cả hai âm thanh này cung cấp nhận thức tình huống bằng cách cảnh báo tất cả người chơi gần đó về hướng mà các phát bắn đang đến từ đó để họ có thể đưa ra quyết định thông minh để tham gia vào niềm vui hoặc tránh nguy hiểm tiềm tàng.

Mẫu sử dụng kỹ thuật này để cung cấp cho người chơi nhận thức tình huống về phần thưởng của họ khi hoàn thành mục tiêu chính trong trò chơi. Sau khi họ thu thập tất cả ba viên kẹo, cánh cửa của ngôi nhà gừng mở ra để cho phép người chơi truy cập vào món quà bên trong.

Vì không có thứ tự cụ thể mà người chơi cần thu thập các viên kẹo, điều quan trọng là người chơi nhận thức được cánh cửa mở ra bất kể viên kẹo nào họ thu thập cuối cùng. Âm thanh định vị làm điều này trở nên khả thi để người chơi nhận thức được thành công của họ và nơi họ cần đi tiếp theo bất kể khoảng cách và hướng tương đối từ cánh cửa.

Để tái tạo âm thanh phản hồi sự kiện 3D một lần trong tệp mẫu Gingerbread House - Complete Audio:

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

    1. Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho âm lượng.
    2. Chèn một đối tượng AudioEmitter để phát một luồng định vị từ Door.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  2. Chọn AudioPlayer, sau đó trong cửa sổ Properties, đặt AssetID thành rbxassetid://5930776613 để phát một bản nhạc âm thanh của cánh cửa kim loại trượt.

  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 mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong âm lượng.
  4. 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 của nó thành Server, sau đó dán mã sau vào script:

    -- Khởi tạo biến
    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 kẹo
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Cập nhật bảng xếp hạng kẹo
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Kiểm tra xem người chơi đã thu thập ba viên kẹo chưa
    if newGumdropAmount >= 3 then
    -- Phát âm thanh sự kiện cánh cửa khi người chơi thu thập ba viên kẹo
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Hoạt hình cánh cửa di chuyển xuống
    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("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Người chơi chạm vào một viên kẹo
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Người chơi đã thu thập kẹo")
    end
    end
    end
    -- Thiết lập trình lắng nghe sự kiện
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Script bắt đầu bằng cách khởi tạo các dịch vụ Workspace, Players, ServerStorage, và TweenService để nó có thể tham chiếu đến các đối tượng con và chức năng của chúng. Sau đó, nó yêu cầu các mô-đun LeaderboardPlayerData trong ServerStorage; các mô-đun này chịu trách nhiệm tạo và cập nhật mộ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 kẹo mà người chơi thu thập trong môi trường.

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

    • player - Một người chơi thu thập một viên kẹo.
    • updateFunction - Một hàm callback cập nhật số lượng kẹo mà người chơi đã thu thập.

    Khi một người chơi va chạm với một viên kẹo, script:

    • Lấy giá trị số lượng kẹo mới của người chơi bằng cách gọi hàm PlayerData.updateValue.
    • Cập nhật bảng xếp hạng với số lượng mới này bằng cách gọi hàm Leaderboard.setStat.
    • Kiểm tra xem số lượng có lớn hơn hoặc bằng 3 hay không.

    Khi giá trị này lớn hơn hoặc bằng 3, script:

    • Phát bản nhạc âm thanh 3D từ bộ phát âm thanh đến bộ phát âm thanh.
    • Di chuyển cánh cửa theo chiều dọc 15 studs dưới vị trí hiện tại của nó.

    Phần còn lại của script chủ yếu chịu trách nhiệm phát hiện bất kỳ thứ gì va chạm với viên kẹo là một người chơi để nó có thể kích hoạt âm thanh không định vị cho phản hồi thu thập. Để biết thêm thông tin về phần này của script, hãy xem Thêm âm thanh 2D - Phản hồi lối chơi.

  5. Chơi thử trò chơi để nghe âm thanh cánh cửa trượt sau khi bạn thu thập tất cả ba viên kẹo trong môi trường. Khi bạn xoay camera, âm thanh sẽ thay đổi động trong loa thực tế của bạn để bạn nghe theo vị trí của bộ phát trong không gian 3D.

Tương tác đối tượng

Khi người chơi tương tác với các đối tượng 3D trong môi trường của họ, chẳng hạn như bật công tắc đèn hoặc nhặt một vũ khí, điều quan trọng là cung cấp phản hồi ngay lập tức để họ hiểu một cách trực quan cách họ đang tương tác với đối tượng. Sự kết hợp giữa phản hồi hình ảnh và âm thanh củng cố mối quan hệ nguyên nhân và kết quả giữa hành động của người chơi và phản ứng của môi trường.

Để mở rộng khái niệm này, hãy xem xét âm thanh 3D một lần từ mẫu Plant cho quy trình người dùng của việc trồng một cây bắp cải:

  • Một âm thanh nhẹ phát ra khi người chơi trồng một hạt giống.
  • Một âm thanh bắn nước phát ra khi người chơi tưới cây đang phát triển của họ.
  • Một âm thanh cắt phát ra khi người chơi thu thập cây đã trưởng thành.
  • Một âm thanh nhẹ phát ra khi người chơi đặt bắp cải vào xe.

Tất cả các âm thanh này củng cố các tương tác chính của người chơi với đối tượng đang thay đổi hình thức trong không gian 3D. Đối với những người chơi có khiếm khuyết về thị giác mà việc thay đổi màu sắc hoặc hoạt hình khó khăn hơn để nhận biết, việc cung cấp nhiều hình thức phản hồi cảm giác này giúp các tương tác đối tượng 3D của bạn vẫn dễ tiếp cận và trực quan cho càng nhiều người chơi càng tốt.

Để đưa ra một ví dụ khác về cách bạn có thể cấu hình tương tác đối tượng với 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 bước lên nút 3D kẹo bạc hà trong ngôi nhà gừng. Khi người chơi không tương tác với nút, nó xuất hiện như một viên kẹo bạc hà thông thường, nhưng khi họ bước lên nút, mẫu:

  • Phát một bản nhạc âm thanh ăn mừng.
  • Tô màu các cạnh của nút với một màu xanh lá cây.
  • Di chuyển nút xuống đất.

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 lối chơi độc đáo, chẳng hạn như mở khóa một vật phẩm hoặc kích hoạt một khả năng đặc biệt.

Chế độ xem mặc định
Trạng thái đã nhấn

Để tái tạo âm thanh tương tác đối tượng 3D một lần trong tệp mẫu Gingerbread House - Complete Audio:

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

    1. Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho nút.
    2. Chèn một đối tượng AudioEmitter để phát một luồng định vị từ 3DAudioButton.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  2. Chọn AudioPlayer, sau đó trong cửa sổ Properties, đặt AssetID thành rbxassetid://1846248593 để phát một bản nhạc âm thanh vui vẻ, ăn mừng.

  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 mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong nút.
  4. Quay lại cửa sổ Explorer, chèn một Script vào 3DAudioButton, đổi tên thành PlayAudioWhenPressed, sau đó dán mã sau vào script:

    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- Đã nhấn
    [true] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size / Vector3.new(2, 1, 1),
    Color = Color3.fromRGB(75, 151, 75),
    }),
    -- Mặc định
    [false] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size,
    Color = Color3.fromRGB(196, 40, 28),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonPressedAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    Script bắt đầu bằng cách lấy:

    • Dịch vụ TweenService để nó có thể hoạt hình phần nút nhô ra khỏi mặt đất.
    • Mô hình 3DAudioButton cha của script.
    • Phần nút nhô ra khỏi mặt đất.
    • Bộ phát âm thanh liên quan với bản nhạc âm thanh ăn mừng của bạn.

    Script sau đó định nghĩa:

    • Một đối tượng TweenInfo xác định rằng hoạt hình của nút sẽ phát với kiểu hoạt hình mũi tên.
    • Hai tween đại diện cho trạng thái đã nhấn hoặc chưa nhấn của nút.
      • Trạng thái đã nhấn true di chuyển nút một chút xuống đất và tô màu các cạnh của phần với một màu xanh lá cây.
      • Trạng thái chưa nhấn false di chuyển nút trở lại vị trí ban đầu và loại bỏ 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 cho phản hồi tương tác đối tượng, vì vậy hãy xem xét cách mà hàm onIsPlayingChanged và các trình lắng nghe sự kiện hoạt động cùng nhau:

    1. buttonPart.Touched lắng nghe một người chơi chạm vào nút, sau đó gọi hàm Play() để bắt đầu phát âm thanh liên quan từ bộ phát âm thanh. Quá trình này chuyển thuộc tính AudioPlayer.IsPlaying từ false sang true.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") lắng nghe thuộc tính IsPlaying của bộ phát âm thanh thay đổi, 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 thức trực quan của nó trong không gian 3D.
    4. Để ngăn người chơi vô tình khởi động lại âm thanh nếu họ nhanh chóng nhảy lên nút liên tiếp, buttonPressedAudioPlayer.Ended lắng nghe bộ phát âm thanh hoàn thành phát trước khi gọi lại hàm onIsPlayingChanged.

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

  5. Chơi thử trò chơi để nghe âm thanh ăn mừng khi nhân vật người chơi của bạn chạm vào nút 3D trong ngôi nhà gừng. Khi bạn đi xa khỏi nút, âm lượng âm thanh giảm.

Đối thoại nhân vật

Cung cấp âm thanh định hướng từ các nhân vật không thể chơi được (NPC) của bạn là hữu ích để hướng dẫn người chơi đến các điểm thú vị trong môi trường của họ, và thêm chiều sâu cho các tương tác của họ với các nhân vật khác. Thực tế, trong các trò chơi có cốt truyện, nhiều nhà thiết kế sử dụng chiến lược đối thoại nhân vật để gián tiếp dạy người chơi về nhân vật của họ, các nhân vật đồng minh và kẻ thù, hoặc thế giới tự thân.

Các ví dụ phổ biến về kỹ thuật này bao gồm:

  • Phong cách đối thoại để thiết lập tông màu cho trò chơi của bạn.
  • Đối thoại để dạy người chơi về mối quan hệ giữa các nhân vật.
  • Cuộc trò chuyện của kẻ thù để thú nhận động cơ hoặc vị trí của họ liên quan đến người chơi.
  • Nhân vật người chơi nói ra suy nghĩ của họ để nhẹ nhàng hướng dẫn người chơi về những gì họ nên làm tiếp theo, chẳng hạn như tự chữa lành, di chuyển đến một vị trí khác hoặc tìm một vật phẩm.
  • Các nhân vật đồng minh nói chuyện với nhân vật người chơi để tiết lộ các chi tiết về thế giới trong trò chơi như lịch sử, văn hóa và các vấn đề xã hội.

Để minh họa điều này có thể trông như thế nào trong thực tế, hãy xem âm thanh 3D một lần từ mẫu Beyond the Dark phát ra định kỳ khi người chơi ở trong khu vực sảnh chính của trạm không gian.

Sử dụng trạm không gian như một nhân vật, đoạn đối thoại này cung cấp cho người chơi ngữ cảnh và truyền thuyết quan trọng về bối cảnh tổng thể. Ví dụ, từ câu này, người chơi biết:

  • Họ đang ở ngoài không gian, cụ thể là trên một trạm không gian có tên Kerr-Newman Deep Space Relay 14.
  • Môi trường của họ là tương lai và thân thiện.
  • Họ là một du khách và có thể sẽ rời đi sớm.

Những chi tiết này cùng nhau làm cho người chơi đắm chìm trong môi trường của họ, và thêm một cảm giác khẩn trương cho nhiệm vụ của họ. Tuy nhiên, nếu người chơi không biết nhiệm vụ chính của họ là gì, bạn cũng có thể sử dụng đối thoại nhân vật để thông báo cho người chơi những gì bạn muốn họ làm trong trò chơi của bạn.

Để minh họa, mẫu sử dụng một khối âm lượng, hoặc khu vực vô hình trong không gian 3D, để kích hoạt đối thoại nhân vật từ người tuyết để hướng dẫn người chơi thu thập ba viên kẹo để mở cánh cửa vào nhà của anh ta. Là một trong những điều đầu tiên mà người chơi thấy khi họ tham gia trò chơi, người chơi có khả năng kích hoạt đối thoại và biết những gì họ cần làm để thành công.

Âm lượng xung quanh người tuyết sử dụng phản hồi va chạm để phát âm thanh khi người chơi vào khu vực 3D.

Để tái tạo âm thanh đối thoại nhân vật 3D một lần trong tệp mẫu Gingerbread House - Complete Audio:

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

    1. Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho âm lượng.
    2. Chèn một đối tượng AudioEmitter để phát một luồng định vị từ DialogueVolume.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  2. Chọn AudioPlayer, sau đó trong cửa sổ Properties, đặt AssetID thành rbxassetid://92917410841704 để phát một bản nhạc âm thanh hướng dẫn cho mục tiêu của trò chơi.

  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 mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong âm lượng.
  4. Quay lại cửa sổ Explorer, điều hướng đến StarterPlayerStarterCharacterScripts, chèn một LocalScript, đổi tên thành PlayAudioWhenInVolume, và dán mã sau vào script cục bộ:

    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local volumeDetector = Workspace.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    Script này bắt đầu bằng cách lấy các dịch vụ Workspace và Players để nó có thể tham chiếu đến các đối tượng con và chức năng của chúng. Đối với mỗi nhân vật người chơi được tải hoặc hồi sinh vào trò chơi, script chờ đợi:

    • HumanoidAnimator của nhân vật.
    • Đối tượng âm lượng trong không gian làm việc có tên DialogueVolume.

    Khi bất kỳ thứ gì va chạm với âm lượng, hàm xử lý sự kiện Touched lấy tổ tiên đầu tiên là một Model, mà nên là nhân vật nếu BasePart va chạm với âm lượng là một phần tử con của mô hình nhân vật. Nếu đúng, hàm sau đó:

    • Đặt debounce thành true.
    • Phát và chờ âm thanh kết thúc.
    • Đặt debounce trở lại false.

    Việc đặt debounce từ false sang true rồi lại false sau khi âm thanh kết thúc phát là một mẫu debounce ngăn âm thanh kích hoạt lại liên tục khi người chơi liên tục va chạm với âm lượng. Để biết thêm thông tin về mẫu debounce này, hãy xem Debounce - Phát hiện va chạm.

  5. Chơi thử trò chơi để nghe đối thoại hướng dẫn của nhân vật khi nhân vật người chơi của bạn chạm vào âm lượng xung quanh người tuyết.

©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.