Â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 nguồn âm và người nghe. Điều này có nghĩa là khi người nghe hoặc nguồn âm di chuyển xung quanh môi trường, người chơi có thể cảm nhận âm thanh đó từ nhiều 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 một lần và lặp lại vào trải nghiệm 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 đối với 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ất kỳ lúc nào bạn gặp khó khăn trong quy trình, 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 bạn.
Các đối tượng âm thanh
Để tạo âm thanh định hướng, quan trọng là bạn phải 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 dò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 hoạt động cùng nhau để phát âm thanh giống như các đối tượng tương tự trong thế giới thực. Hãy xem cách điều này hoạt động trong thực tế bằng một ví dụ về người chơi đeo tai nghe trong khi chơi trải nghiệm với laptop của họ:
- Đối tượng AudioPlayer tải ID tài sản âm thanh 1516791621 vào trải nghiệm cho một bản nhạc mưa.
- Đối tượng AudioEmitter phát một dòng âm thanh của bản nhạc mưa vào môi trường 3D.
- Đối tượng con AudioListener của nhân vật nghe âm thanh đó trong môi trường 3D và phát 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 ghi âm thanh từ thế giới thực và đưa nó trở lại trải nghiệm cho trò chuyện bằng giọng nói.


Các phần tiếp theo sẽ đi sâu hơn và tham khảo các đối tượng này khi bạn học cách phát cả âm thanh 3D một lần và lặp lại. 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 cách thu nhận và phát âm thanh từ trải nghiệm đế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 mà lặp lại 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 để tăng cường 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 nhiên ngừ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 xét cách âm thanh 3D cho hai thác lớn ngừng lại ngay khi bản âm thanh không lặp lại hoàn thành. Mặc dù âm thanh nước ban đầu đưa người chơi vào môi trường ngoài trời, sự thay đổi âm thanh đột ngột là căng thẳng và không tự nhiên với cách thức hoạt động của thác nước trong thế giới thực.
Tương tự, mẫu này sử dụng kỹ thuật này cho thác nước chocolate 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ừ nguồn âm thanh. Khi người chơi cách nguồn âm không quá 20 studs, nguồn phát âm thanh với âm lượng tối đa. Khi người chơi di chuyển ra xa, âm thanh lạch cạch giảm dần âm lượng mỗi 20 studs cách xa nguồn âm thanh. Điều này mô phỏng âm thanh trong thế giới thực mà giảm dần âm lượng khi bạn càng xa nguồn.
Để tái hiện âm thanh 3D lặp lại trong mẫu Gingerbread House - Complete Audio tệp tin:
Bật một người nghe mặc định được gán cho nhân vật của bạn.
- Trong cửa sổ Explorer, chọn SoundService.
- Trong cửa sổ Properties, đặt DefaultListenerLocation thành Character. Khi bạn chạy trải nghiệm, engine 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ế giới thực của bạn theo vị trí và quy mô của các nguồn âm thanh trong trải nghiệm.
- Tạo một AudioDeviceOutput dưới SoundService.
Trong cửa sổ Explorer, điều hướng đến Workspace ⟩ WaterfallAudioObject, sau đó:
- Chèn một đối tượng AudioPlayer để tạo nguồn âm thanh cho thác nước.
- Chèn một đối tượng AudioEmitter để phát một dòng âm thanh vị trí từ WaterfallAudioObject.
- Chèn một đối tượng Wire để mang dòng âm thanh từ player âm thanh đến emitter âm thanh.

Chọn AudioPlayer, sau đó trong cửa sổ Properties,
- Đặt AssetID thành rbxassetid://1516791621 để phát một bản nhạc âm thanh mưa.
- Bật Looping để âm thanh lặp lại một cách liền mạch.
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 nguồn âm thanh.
Chọn Wire, sau đó trong cửa sổ Properties,
- Đặ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ừ player âm thanh cụ thể này.
- Đặ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 emitter âm thanh cụ thể này trong thác nước.
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.ParentaudioPlayer:Play()Giải thích mãMã này bắt đầu bằng cách khai báo một biến để đại diện cho AudioPlayer của phụ kiện script. Mã sau đó thiết lập nguồn âm thanh phát ngay từ khi người chơi gia nhập trải nghiệm đến khi họ rời khỏi trải nghiệm.
Chạy thử trải nghiệm để nghe âm thanh mưa chocolate 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 theo hướng khác, âm thanh sẽ tự động thay đổi trong loa thế giới thực của bạn theo vị trí của nguồn 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 một lần tại một thời điểm và vị trí cụ thể trừ khi người chơi kích hoạt nó một lần nữa, 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ải nghiệm 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 kịch bản lối chơi phổ biến mà trong đó người chơi cần phản hồi định hướng kịp thời, bao gồm sự kiện lối chơi tình huống, tương tác đối tượng, và lờ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 yêu cầu lửa kẻ thù, điều quan trọng là họ phải hiểu nơi nào trong không gian 3D mà họ cần hướng đến sự tập trung và chú ý của họ. 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 phải đi đâu hoặc làm gì tiếp theo.
Để minh hoạ điều này, hãy xem xét âm thanh 3D một lần từ mẫu Laser Tag mà phát ra từ khẩu súng của mỗi 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 mình.
- Một âm thanh lách cách và bíp robot phát ra mỗi khi người chơi nạp đạn cho khẩu súng của mình.
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 để 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 này sử dụng kỹ thuật tương tự để 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ải nghiệm. Sau khi họ thu thập tất cả ba viên kẹo, cửa vào ngôi nhà bá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 phải biết cửa đã mở dù họ thu thập viên kẹo nào cuối cùng. Âm thanh định vị giúp đ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 của họ từ cửa.
Để tái hiện phản hồi sự kiện âm thanh 3D một lần trong mẫu Gingerbread House - Complete Audio tệp tin:
Trong cửa sổ Explorer, điều hướng đến Workspace ⟩ Door, sau đó:
- Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho cửa.
- Chèn một đối tượng AudioEmitter để phát một dòng âm thanh vị trí từ Door.
- Chèn một đối tượng Wire để mang dòng âm thanh từ audio player đến emitter âm thanh.

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ánh cửa bằng kim loại trượt.
Chọn Wire, sau đó trong cửa sổ Properties,
- Đặ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ừ player âm thanh cụ thể này.
- Đặ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 emitter âm thanh cụ thể này trong cánh cửa.
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 các biếnlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Các mô-đunlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Các biếnlocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Cập nhật bảng kẹolocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Cập nhật bảng điểm kẹoLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Kiểm tra xem người chơi đã thu thập được ba viên kẹo hay chưaif newGumdropAmount >= 3 then-- Phát âm thanh sự kiện cửa khi người chơi thu thập ba viên kẹolocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Hoạt hình cánh cửa di chuyển xuống dướilocal doorPart = Workspace.Doorlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})tween:Play()endend-- Định nghĩa trình xử lý sự kiệnlocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Người chơi chạm vào một viên kẹolocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Người chơi đã thu thập kẹo")endendend-- Thiết lập các trình lắng nghe sự kiệnfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endGiải thích mãMã này bắt đầu bằng việc khởi tạo các dịch vụ Workspace, Players, ServerStorage, và TweenService để nó có thể tham khảo 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 Leaderboard và PlayerData 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 điểm ở góc trên bên phải màn hình theo dõi số lượng kẹo gumball mà một người chơi thu thập trong môi trường.
Hàm updatePlayerGumdrops của mã là nơi mà 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 gọi lại 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, mã sẽ:
- Lấy số lượng kẹo người chơi mới thu thập được bằng cách gọi hàm PlayerData.updateValue.
- Cập nhật bảng điểm 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.
Khi giá trị này lớn hơn hoặc bằng 3, mã sẽ:
- Phát bản âm thanh 3D từ player âm thanh đến emitter âm thanh.
- Di chuyển cánh cửa tuyến tính 15 studs dưới vị trí hiện tại của nó.
Phần còn lại của mã chủ yếu có 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 để có thể kích hoạt mộ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 mã, hãy xem Thêm âm thanh 2D - Phản hồi lối chơi.
Chạy thử trải nghiệm để 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 tự động điều chỉnh theo vị trí của nguồn 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 mộ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ọ có thể 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 của cả 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 thêm khái niệm này, hãy xem xét âm thanh 3D một lần từ mẫu Plant cho chu trình người dùng trong việc trồng một cây bắp cải:
- Một âm thanh leng keng nhẹ phát ra khi người chơi trồng hạt giống.
- Một âm thanh splat ướt phát ra khi người chơi tưới cây đang phát triển.
- Một âm thanh kêu cạch phát ra khi người chơi thu thập cây trưởng thành.
- Một âm thanh thud nhẹ phát ra khi người chơi đặt cây 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 với nhắc nhở gần 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 bị khiếm thị, nơi mà 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 dạng phản hồi cảm giác giúp các tương tác đối tượng 3D của bạn trở nê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 dạng 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 kẹo 3D trong ngôi nhà bá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 peppermint thông thường, nhưng khi họ bước lên nút, mẫu sẽ:
- Phát một bản nhạc vui mừng.
- Tô màu các bên của nút bằng tông màu xanh.
- Di chuyển nút vào trong mặt đất.
Từ đây, bạn có thể kết nối tương tác này với đủ 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.


Để tái hiện âm thanh tương tác đối tượng 3D một lần trong mẫu Gingerbread House - Complete Audio tệp tin:
Trong cửa sổ Explorer, điều hướng đến Workspace ⟩ 3DAudioButton, sau đó:
- Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho nút.
- Chèn một đối tượng AudioEmitter để phát một dòng âm thanh vị trí từ 3DAudioButton.
- Chèn một đối tượng Wire để mang dòng âm thanh từ player âm thanh đến emitter âm thanh.

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 mừng, ăn mừng.
Chọn Wire, sau đó trong cửa sổ Properties,
- Đặ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ừ player âm thanh cụ thể này.
- Đặ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 emitter âm thanh cụ thể này trong nút.
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.Parentlocal buttonPart = buttonModel.ButtonPartlocal buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayerlocal tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)local buttonTweenByIsPressed = {-- Được 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.IsPlayinglocal tween = buttonTweenByIsPressed[isPlaying]tween:Play()endonIsPlayingChanged()buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)buttonPart.Touched:Connect(function(_hit)buttonPressedAudioPlayer:Play()end)Giải thích mãMã này bắt đầu bằng việc lấy:
- Dịch vụ TweenService để có thể hoạt hình cho phần của nút nhô ra khỏi mặt đất.
- Mô hình 3DAudioButton của phụ kiện script.
- Phần của nút nhô ra khỏi mặt đất.
- Player âm thanh tương ứng với bản nhạc âm thanh chúc mừng của bạn.
Mã sau đó định nghĩa:
- Một đối tượng TweenInfo chỉ đị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 xuống một chút vào trong mặt đất và tô màu các bên của phần bằng tông màu xanh.
- Trạng thái chưa nhấn false di chuyển nút trở lại vị trí ban đầu và gỡ bỏ màu sắc trước đó.
Phần còn lại của mã là nơi mà 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 làm việc cùng nhau:
- 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 tương ứng từ player âm thanh. Quy trình này chuyển đổi thuộc tính AudioPlayer.IsPlaying từ false sang true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") lắng nghe sự thay đổi thuộc tính IsPlaying của player âm thanh, sau đó gọi hàm onIsPlayingChanged.
- Hàm onIsPlayingChanged sử dụng thông tin này để kích hoạt tween thay đổi ngoại hình của nó trong không gian 3D.
- Để 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 nhiều lần, buttonPressedAudioPlayer.Ended lắng nghe việc player âm thanh kết thúc phát trước khi gọi lại hàm onIsPlayingChanged.
Quan trọng là lưu ý rằng 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 nó thay đổi từ true sang false. Điều này là hành vi dự kiến do các phức tạp với thời gian sao chép thuộc tính từ máy chủ đến khách hàng. Chính 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.
Chạy thử trải nghiệm để 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à bánh gừng. Khi bạn đi khỏi nút, âm lượng của âm thanh sẽ giảm đi.
Đố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) 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. Trên thực tế, trong các trải nghiệm có nội dung dẫn dắt, nhiều nhà thiết kế sử dụng chiến lược lời thoại nhân vật để dạy gián tiếp 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 chính thế giới đó.
Các ví dụ phổ biến của kỹ thuật này bao gồm:
- Phong cách đối thoại để thiết lập tông cho trải nghiệm của bạn.
- Banter để 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 chúng 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 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 trò 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ải nghiệm như lịch sử, văn hóa và các vấn đề xã hội.
Để minh hoạ điều này có thể trông như thế nào trong thực tế, hãy xem xét âm thanh 3D một lần từ Beyond the Dark mà 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 thông tin quan trọng và bối cảnh về thiết lập tổng thể. Ví dụ, từ một câu này người chơi sẽ biết:
- Họ đang ở không gian bên ngoài, cụ thể là trên một trạm không gian mang tên Kerr-Newman Deep Space Relay 14.
- Môi trường của họ là hiện đại và ấm áp.
- Họ là một khách tham quan và sẽ rời đi sớm.
Những chi tiết này cùng nhau làm cho người chơi hòa nhập vào 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 cuộc đối thoại của 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ải nghiệm của bạn.
Để minh hoạ, mẫu này sử dụng một khối lượng, hoặc vùng vô hình trong không gian 3D, để kích hoạt đối thoại của 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ửa vào nhà của anh ta. Là một trong những thứ đầu tiên mà người chơi thấy khi họ tham gia trải nghiệm, người chơi có nhiều khả năng kích hoạt cuộc đối thoại và biết những gì họ cần làm để thành công.

Để tái hiện âm thanh đối thoại nhân vật 3D một lần trong mẫu Gingerbread House - Complete Audio tệp tin:
Trong cửa sổ Explorer, điều hướng đến Workspace ⟩ DialogueVolume, sau đó:
- Chèn một đối tượng AudioPlayer để tạo một nguồn âm thanh cho khối lượng.
- Chèn một đối tượng AudioEmitter để phát một dòng âm thanh vị trí từ DialogueVolume.
- Chèn một đối tượng Wire để mang dòng âm thanh từ player âm thanh đến emitter âm thanh.

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ải nghiệm.
Chọn Wire, sau đó trong cửa sổ Properties,
- Đặ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ừ player âm thanh cụ thể này.
- Đặ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 emitter âm thanh cụ thể này trong khối lượng.
Quay lại cửa sổ Explorer, điều hướng đến StarterPlayer ⟩ StarterCharacterScripts, chèn một LocalScript, đổi tên thành PlayAudioWhenInVolume, và dán mã sau vào local script:
local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local humanoid = script.Parent:WaitForChild("Humanoid")local volumeDetector = Workspace.DialogueVolumelocal trigger = humanoid:WaitForChild("Animator")local debounce = falselocal localPlayer = Players.LocalPlayervolumeDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)if hitPlayer ~= localPlayer thenreturnenddebounce = truelocal audioPlayer = Workspace.DialogueVolume.AudioPlayeraudioPlayer:Play()audioPlayer.Ended:Wait()debounce = falseend)Giải thích mãMã này bắt đầu bằng việc lấy các dịch vụ Workspace và Players để nó có thể tham khảo 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 tái sinh trở lại trong trải nghiệm, mã sẽ chờ:
- Đối tượng khối lượng trong workspace có tên DialogueVolume.
Khi bất cứ điều gì va chạm với khối lượng, hàm xử lý sự kiện Touched nhận phần đầu tiên mà là một Model, mà nên là nhân vật nếu BasePart va chạm với khối lượng là một phần tử của một mô hình nhân vật. Nếu có, hàm sau đó:
- Đặt debounce thành true.
- Phát và chờ âm thanh kết thúc.
- Đặt debounce trở lại thành false.
Việc đặt debounce từ false sang true và trở lại false sau khi âm thanh phát xong là một mẫu debounce ngăn cản âm thanh bị kích hoạt lặp lại khi người chơi liên tục va chạm với khối 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.
Chạy thử trải nghiệm để nghe lời đố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 khối lượng xung quanh người tuyết.