เสียง 3D เป็นเสียงทิศทางที่ออกจากตำแหน่งเฉพาะในพื้นที่ 3D เพิ่มขึ้นหรือลดลงตามระยะและทิศทางระหว่างตัวเร่งเสียงและผู้ฟังซึ่งหมายความว่าเมื่อผู้ฟังหรือผู้ส่งย้ายไปรอบ ๆ สภาพแวดล้อมผู้เล่นสามารถได้ยินเสียงได้อย่างไดนามิกจากทิศทางและระดับเสียงที่แตกต่างกัน
ใช้ไฟล์ Gingerbread House - Start.rbxl เป็นสถานที่เริ่มต้นและ Gingerbread House - Complete Audio เป็นข้อมูลอ้างอิง, บทแนะนำนี้จะแสดงวิธีเพิ่มทั้งการเล่นซ้ำและเสียง 3D ในประสบการณ์ของคุณรวมถึงคำแนะนำเกี่ยวกับ:
- เล่นเสียงสิ่งแวดล้อมซ้ำๆ ที่เล่นทันทีที่ผู้เล่นเชื่อมต่อกับเซิร์ฟเวอร์
- การเรียกเสียงเพื่อแจ้งให้ผู้เล่นทราบเกี่ยวกับเหตุการณ์สำคัญที่เกี่ยวข้องกับการเล่นเกมของพวกเขา
- เปิดใช้งานเสียงเพื่อให้ผู้เล่นได้รับความคิดเห็นทางการได้ยินเมื่อพวกเขาโต้ตอบกับวัตถุ 3D
- เล่นบิตเสียงตัวละครที่มีส่วนร่วมและนําผู้เล่นไปสู่จุดสนใจภายในสภาพแวดล้อมของพวกเขา
หากในจุดใดก็ตามที่คุณติดอยู่ในกระบวนการ คุณสามารถใช้ Gingerbread House - Complete Audio เป็นข้อมูลอ้างอิงเพื่อเปรียบเทียบความคืบหน้าของคุณ
วัตถุเสียง
เพื่อสร้างเสียงทิศทาง สิ่งสำคัญคือต้องเข้าใจวัตถุเสียงที่คุณจะทำงานร่วมกับตลอดการสอนนี้มีสามประเภทหลักของวัตถุเสียง:
- วัตถุ AudioPlayer โหลดและเล่นไฟล์เสียง **** * วัตถุ AudioEmitter เป็น วิทยุเสมือน ที่ส่งเสียงไปยังสภาพแวดล้อม 3D
- วัตถุ เป็นไมโครโฟนเสมือนที่รับเสียงจากสภาพแวดล้อม 3D
- วัตถุ เป็นอุปกรณ์ฮาร์ดแวร์ทางกายภาพภายในโลกแห่งความจริง เช่น ลำโพงหรือหูฟัง
- วัตถุ AudioDeviceInput เป็นไมโครโฟนทางกายภาพ ภายในโลกแห่งความจริง * Wires ส่งสตรีมเสียงจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง
วัตถุเสียงเหล่านี้ทั้งหมดทำงานร่วมกันเพื่อส่งเสียงเหมือนกับเพื่อนร่วมงานในโลกแห่งความจริงลองดูว่าสิ่งนี้ทำงานอย่างไรในการใช้งานจริงโดยใช้ตัวอย่างผู้เล่นสวมหูฟังในขณะเล่นประสบการณ์ด้วยแล็ปท็อป:
- การโหลด AudioPlayer ทรัพยากรเสียง 1516791621 audioID ในประสบการณ์สำหรับสนามฝน
- เอมิต AudioEmitter ส่งสตรีมเสียงเพลงสายฝนไปยังสภาพแวดล้อม 3D
- ลูกของตัวละครฟังเสียงนั้นภายในสภาพแวดล้อม 3D เฮดเซ็ท
- วัตถุ AudioDeviceOutput ส่งเสียงจาก AudioListener ไปยังลำโพงทางกายภาพของผู้เล่นหรือในกรณีนี้คือหูฟังของพวกเขา
- วัตถุ AudioDeviceInput จับเสียงจากโลกแห่งความจริงและส่งกลับสู่ประสบการณ์สําหรับการแชทด้วยเสียง


ส่วนต่อไปจะดำน้ำลึกลงและอ้างอิงวัตถุเหล่านี้เมื่อคุณเรียนรู้วิธีเล่นทั้งเล่นซ้ำและเล่นเสียง 3D เดียวเมื่อคุณตรวจสอบวัตถุเหล่านี้ด้วยเทคนิคใหม่ที่กำลังจะมาถึง คุณสามารถทำนายได้อย่างแม่นยำยิ่งขึ้นว่าจะจับและส่งเสียงจากประสบการณ์ไปยังผู้เล่นและกลับกันได้อย่างไร
เล่นซ้ำเสียง
เล่นซ้ำเสียง 3D หรือเสียงทิศทางที่ทำซ้ำได้อย่างราบรื่นทันทีที่ผู้เล่นเชื่อมต่อกับเซิร์ฟเวอร์ เป็นเทคนิคการออกแบบเสียงทั่วไปเพื่อเพิ่มบรรยากาศของพื้นที่ 3D โดยทำให้รู้สึกมีชีวิตชีวาและมีชีวิตชีวานอกจากนี้การเล่นซ้ำเสียง 3D จะทำให้แหล่งเสียงสิ่งแวดล้อมของคุณสอดคล้องกัน เช่น ความสถิตของทีวีหรือเสียงกระหึ่มของน้ำตก; หากเสียงเหล่านี้หยุดกะทันหัน สภาพแวดล้อมจะรู้สึกไม่สมจริง
เพื่อสาธิตแนวคิดนี้ ตรวจสอบวิธีที่เสียง 3D ต่อไปนี้สำหรับน้ำตกขนาดใหญ่สองแห่งหยุดทันทีที่เสียงเล่นซ้ำสิ้นสุดในขณะที่น้ำฟังดูเหมือนจะดึงผู้เล่นเข้าสู่สภาพแวดล้อมภายนอกในตอนแรก การเปลี่ยนแปลงทางการได้ยินอย่างกะทันหันเป็นสิ่งที่น่าตกใจและไม่เป็นธรรมชาติต่อวิธีที่น้ำตกจะปฏิบัติในโลกแห่งความจริง
เช่นเดียวกันตัวอย่างใช้เทคนิคนี้สำหรับน้ําตกช็อคโกแลตไหลและปรับปริมาณตามระยะห่างของผู้เล่นจากตัวเร่งเสียงเมื่อผู้เล่นอยู่ไกลน้อยกว่า 20 สตัด เอมิตเตอร์จะเปิดเสียงด้วยระดับเสียงเต็มเมื่อผู้เล่นเคลื่อนที่ไปไกลขึ้น เสียงสลัดจะลดลงในระดับเสียงทุก 20 สตัดจากตัวเร่งเสียงสิ่งนี้จําลองเสียงในโลกแห่งความจริงที่ลดระดับเสียงลงเมื่อคุณห่างจากแหล่งกําเนิด
เพื่อสร้างซ้ำเสียง 3D ในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:
เปิดใช้งานผู้ฟังเริ่มต้นที่แนบมากับตัวละครผู้เล่นของคุณ
- ในหน้าต่าง สํารวจ เลือก SoundService 2. ในหน้าต่าง คุณสมบัติ ตั้ง ตำแหน่งผู้ฟังเริ่มต้น เป็น ตัวละคร เมื่อคุณเรียกใช้ประสบการณ์ เครื่องยนต์จะทำงานโดยอัตโนมัติ:
- สร้าง AudioListener ภายใต้ตัวละครผู้เล่นแต่ละตัว Humanoid.RootPart เพื่อให้คุณสามารถได้ยินเสียงเปลี่ยนแปลงในลำโพงโลกแห่งความจริงตามตำแหน่งและขนาดของแหล่งเสียงภายในประสบการณ์
- สร้าง AudioDeviceOutput ภายใต้ บริการเสียง
ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > WaterfallAudioObject จากนั้น:
- ใส่วัตถุ ผู้เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับน้ำตก
- ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก WaterfallAudioObject 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง AssetID เป็น rbxassetid://1516791621 เพื่อเล่นเพลงเสียงฝน 2. เปิดใช้งาน การเล่นซ้ำ เพื่อให้เสียงซ้ำไปโดยไม่มีที่ติ
เลือก ตัวปล่อยเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง การลดระดับเสียง เป็น {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} เพื่อให้เสียงลดลงอย่างต่อเนื่องทุก 20 สตัดจากตัวปล่อยเสียง
เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในน้ำตก
กลับไปที่หน้าต่าง สํารวจ ใส่ สคริปต์ ใน WaterfallAudioObject แล้วเปลี่ยนชื่อเป็น LoopWaterfallMusic ตั้งค่าคุณสมบัติ RunContext ของมันเป็น ไคลเอนต์ จากนั้นใส่โค้ดต่อไปนี้ในสคริปต์:
local audioPlayer = script.ParentaudioPlayer:Play()คําอธิบายโค้ดสคริปต์เริ่มต้นด้วยการประกาศตัวแปรเพื่อแทนที่พ่อของสคริปต์ AudioPlayerสคริปต์จะตั้งแหล่งเสียงเพื่อเล่นตั้งแต่ช่วงเวลาที่ผู้เล่นเข้าร่วมประสบการณ์จนถึงช่วงเวลาที่พวกเขาออกจากประสบการณ์
ทดสอบประสบการณ์เพื่อฟังเสียงฝนช็อคโกแลตเล่นซ้ำเมื่ออวาตาร์ของคุณอยู่ใกล้กับน้ำตกเมื่อคุณหมุนหัวของตัวละครของคุณเพื่อมองในทิศทางที่แตกต่างกันเสียงจะเปลี่ยนไปอย่างไดนามิกตามตำแหน่งของเอมิตเตอร์ในพื้นที่ 3D
เสียงยิงเดียว
เสียง 3D ยิงเดียว หรือเสียงทิศทางที่เล่นเพียงครั้งเดียวในเวลาและตำแหน่งที่กำหนดจนกว่าผู้เล่นจะกระตุ้นมันอีกครั้ง ให้ผู้เล่นมีบริบทเกี่ยวกับการกระทำของพวกเขา สภาพแวดล้อม และตัวละครรอบพวกเขาการใช้ประเภทข้อเสนอแนะทางการได้ยินในประสบการณ์ของคุณเป็นสิ่งสำคัญเพราะช่วยให้ผู้เล่นสามารถตัดสินใจได้อย่างยุติธรรม เช่น หลีกเลี่ยงศัตรูที่กำลังจะมาหรือหยิบสิ่งของที่มีประโยชน์
ส่วนต่อไปนี้ให้รายละเอียดการดำเนินการสำหรับสถานการณ์การเล่นเกมทั่วไปที่ผู้เล่นต้องการข้อเสนอแนะทันเวลาและทิศทางรวมถึงกิจกรรมการเล่นเกมสถานการณ์และบทสนทนาตัวละครที่ไม่สามารถเล่นได้
ข้อเสนอแนะ
เมื่อผู้เล่นกระตุ้นเหตุการณ์สถานการณ์ที่สำคัญภายในสภาพแวดล้อมของพวกเขา เช่น ปลดล็อกพื้นที่เล่นเกมใหม่หรือเรียกยิงของศัตรู ก็เป็นสิ่งสำคัญที่พวกเขาต้องเข้าใจว่าอยู่ในพื้นที่ 3D ข้อเสนอแนะพวกเขาอาจพลาดข้อมูลที่สำคัญสำหรับการเล่นเกมของพวกเขา ส่งผลให้เกิดความผิดหวังเมื่อไม่ทราบว่าจะไปที่ไหนหรือทำอะไรต่อไป
เพื่อสาธิตว่าทำไมสิ่งนี้จึงเป็นสิ่งสำคัญ มาดูการออกอากาศเสียง 3D แบบเดียวจากแม่แบบ Laser Tag ที่เล่นจากเบลาสเตอร์ของผู้เล่นแต่ละคน:
- เสียงป๊อปลึกเล่นสำหรับทุกการระเบิดที่ผู้เล่นยิงจากเบลาสเตอร์ของพวกเขา
- เสียงคลิกและหุ่นยนต์บี๊ปเล่นในแต่ละครั้งที่ผู้เล่นรีโหลดบลาสเตอร์ของพวกเขาด้วยรอบใหม่
ทั้งสองเสียงนี้ให้ความตระหนักถึงสถานการณ์โดยแจ้งผู้เล่นที่อยู่ใกล้เคียงทั้งหมดถึงทิศทางที่ระเบิดกําลังมาจากเพื่อให้พวกเขาสามารถตัดสินใจได้อย่างมีข้อมูลว่าจะเข้าร่วมในความสนุกสนานหรือหลีกเลี่ยงอันตรายที่อาจเกิดขึ้น
ตัวอย่างใช้เทคนิคเดียวกันนี้เพื่อให้ผู้เล่นตระหนักถึงสถานการณ์เกี่ยวกับรางวัลสําหรับการสําเร็จภารกิจหลักภายในประสบการณ์หลังจากที่พวกเขารวบรวมลูกอมทั้งสามแล้ว ประตูสู่บ้านขนมปังขิงจะเปิดขึ้นเพื่อให้ผู้เล่นสามารถเข้าถึงสิ่งที่อยู่ภายในได้
เนื่องจากไม่มีคำสั่งซื้อที่เฉพาะเจาะจงที่ผู้เล่นต้องรวบรวมลูกอม จึงเป็นสิ่งสำคัญที่ผู้เล่นตระหนักถึงการเปิดประตูไม่ว่าลูกอมที่พวกเขารวบรวมล่าสุดจะเป็นอะไรเสียงตำแหน่งทำให้เป็นไปได้เพื่อให้ผู้เล่นตระหนักถึงความสำเร็จและสถานที่ที่พวกเขาต้องไปต่อไปโดยไม่คำนึงถึงระยะห่างและทิศทางจากประตู
เพื่อสร้างการตอบรับเสียง 3D จากอีเวนต์ยิงเดียวใหม่ในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:
ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ประตู จากนั้น:
- ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับระดับเสียง
- ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก ประตู 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น rbxassetid://5930776613
เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในระดับเสียง
กลับไปที่หน้าต่าง สํารวจ ค้นหา ServerScriptService จากนั้นใส่ สคริปต์ แล้วเปลี่ยนชื่อเป็น GumdropService ตั้งค่าคุณสมบัติ RunContext ของมันเป็น เซิร์ฟเวอร์ จากนั้นใส่โค้ดต่อไปนี้ลงในสคริปต์:
-- กําลังเริ่มตัวแปรlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- โมดูลlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- ตัวแปรlocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- อัปเดตตาร์ gumdroplocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- ตารางอันดับgumdropLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- ตรวจสอบว่าผู้เล่นได้รวบรวมลูกอมสามอันหรือไม่if newGumdropAmount >= 3 then-- เล่นเสียงอีเวนต์ประตูเมื่อผู้เล่นรวบรวมลูกอมสามอันlocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- เคลื่อนย้ายประตูให้เคลื่อนลงlocal 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-- การกำหนดตัวจัดการอีเวนต์local function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- ผู้เล่นแตะลูกอมlocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Player collected gumdrop")endendend-- การตั้งค่าผู้ฟังอีเวนต์for _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endคําอธิบายโค้ดสคริปต์นี้เริ่มต้นด้วยการเริ่มต้นบริการ Workspace , Players , ServerStorage และ TweenService เพื่อให้สามารถอ้างอิงถึงบุตรหลานและฟังก์ชันของพวกเขาได้จากนั้นต้องใช้ ลีดเดอร์บอร์ด และ PlayerData โมดูลใน ServerStorage; โมดูลเหล่านี้มีความรับผิดชอบในการสร้างและอัปเดตลีดเดอร์บอร์ดในมุมขวาบนของหน้าจอที่ติดตามจํานวนลูกบอลที่ผู้เล่นรวบรวมในสภาพแวดล้อม
ฟังก์ชันของสคริปต์ updatePlayerGumdrops เป็นที่ที่ส่วนใหญ่ของงานเกิดขึ้นเพื่อกระตุ้นเสียง 3D สําหรับการตอบรับอีเวนต์ และต้องใช้อาร์กิวเมนต์สองตัว:
- player - ผู้เล่นที่รวบรวม gumdrop
- updateFunction - ฟังก์ชันการโทรกลับที่อัปเดตปริมาณ gumdrop ที่รวบรวมของผู้เล่น
เมื่อผู้เล่นชนกับ gumdrop สคริปต์:
- รับมูลค่าการรวบรวมของลูกอมใหม่ของผู้เล่นโดยการโทรไปที่ฟังก์ชัน PlayerData.updateValue
- อัปเดตลีดเดอร์บอร์ดด้วยจำนวนใหม่นี้โดยโทรไปที่ฟังก์ชัน Leaderboard.setStat
- ตรวจสอบเพื่อดูว่าจำนวนมากกว่าหรือเท่ากับ 3 หรือไม่
เมื่อค่านี้มากกว่าหรือเท่ากับ 3 คำสั่ง:
- เล่นเพลงเสียง 3D จากเครื่องเล่นเสียงไปยังตัวเร่งเสียง
- เคลื่อนเส้นประตูไปตามแนวนอน 15 สตัดด้านล่างตำแหน่งปัจจุบัน
ส่วนที่เหลือของสคริปต์มีหน้าที่รับผิดชอบในการตรวจจับสิ่งใดที่ชนกับ gumdrop เป็นผู้เล่นเพื่อให้สามารถกระตุ้นเสียงไม่สมบูรณ์ได้สำหรับการตอบรับความคิดเห็นเกี่ยวกับการรวบรวมสำหรับข้อมูลเพิ่มเติมเกี่ยวกับส่วนนี้ของสคริปต์ ดู เพิ่มเสียง 2D - ข้อเสนอแนะการเล่นเกม
ทดสอบประสบการณ์เพื่อฟังเสียงประตูสไลด์หลังจากที่คุณรวบรวมลูกอมทั้งสามในสภาพแวดล้อมทั้งหมดเมื่อคุณหมุนกล้องเสียงจะเปลี่ยนไปอย่างไดนามิกในลำโพงโลกแห่งความจริงของคุณเพื่อให้คุณได้ยินตามตำแหน่งของเอมิตเตอร์ในพื้นที่ 3D
การโต้ตอบของวัตถุ
เมื่อผู้เล่นโต้ตอบกับวัตถุ 3D ภายในสภาพแวดล้อมของพวกเขา เช่น เปิดสวิตช์ไฟหรือหยิบอาวุธ ก็เป็นสิ่งสำคัญที่จะต้องให้ข้อเสนอแนะทันทีเพื่อให้พวกเขาเข้าใจได้อย่างชัดเจนว่าพวกเขากำลังโต้ตอบกับวัตถุอย่างไร วิธี ที่พวกเขากำลังโต้ตอบการจับคู่ของความคิดเห็นทั้งภาพและเสียงเสริมสร้างความสัมพันธ์ระหว่างสาเหตุและผลกระทบระหว่างการกระทำของผู้เล่นและการตอบสนองทางสิ่งแวดล้อม
เพื่อขยายความคิดนี้, ลองดู 3D เสียงเดียวถัดไปจากตัวอย่าง พืช สำหรับการไหลของผู้ใช้สำหรับการปลูกกะหล่ำ:
- เสียงคลิกอ่อนเล่นเมื่อผู้เล่นปลูกเมล็ด
- เสียงเปียกเหมือนการสาดเมื่อผู้เล่นรดน้ำพืชที่เติบโตของพวกเขา
- เสียงคลิปเล่นเมื่อผู้เล่นรวบรวมพืชที่โตเต็มที่
- เสียง thud อ่อนเล่นเมื่อผู้เล่นวางกะหล่ำลงในเกวียน
เสียงเหล่านี้ทั้งหมดเสริมการโต้ตอบระยะใกล้ของผู้เล่น กุญแจ กับวัตถุที่เปลี่ยนรูปในพื้นที่ เป็นเจ้าของการให้ฟอร์มหลายรูปแบบของการตอบสนองทางสัมผัสเหล่านี้ช่วยให้การโต้ตอบของวัตถุ 3D ของคุณยังคงเป็นไปได้และเป็นธรรมชาติสำหรับผู้เล่นจำนวนมากที่สุดเท่าที่เป็นไปได้
เพื่อให้ตัวอย่างที่แตกต่างของวิธีที่คุณสามารถกำหนดการโต้ตอบของวัตถุกับหลายรูปแบบของการตอบสนองทางประสาทสัมผัสได้ ข้อเสนอแนะ3D peppermint ภายในบ้านขนมปังขิงเมื่อผู้เล่นไม่ได้โต้ตอบกับปุ่ม มันจะดูเหมือนลูกอมปีปองทั่วไป แต่เมื่อพวกเขาก้าวเข้าสู่ปุ่มตัวอย่าง:
- เล่นเพลงเสียงกริ่งเฉลิมฉลอง
- ย้อมด้านข้างของปุ่มด้วยสีเขียว
- ย้ายปุ่มลงสู่พื้น
จากที่นี่ คุณสามารถเชื่อมโยงการโต้ตอบนี้กับการกระทำเกมที่ไม่ซ้ำกันทั้งหมด เช่น ปลดล็อกไอเทมหรือเรียกใช้ความสามารถพิเศษ


เพื่อสร้างใหม่การโต้ตอบเสียง 3D ของวัตถุยิงเดียวในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:
ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ปุ่มเสียง 3D จากนั้น:
- ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับปุ่ม
- ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก 3DAudioButton 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น rbxassetid://1846248593
เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในปุ่ม
กลับไปที่หน้าต่าง สํารวจ ใส่ สคริปต์ ใน ปุ่มเล่นเสียงเมื่อกด แล้วเปลี่ยนชื่อเป็น เล่นเสียงเมื่อกด จากนั้นใส่โค้ดต่อไปนี้ในสคริปต์:
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 = {-- กด[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- ค่าเริ่มต้น[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)คําอธิบายโค้ดสคริปต์เริ่มต้นโดยรับ:
- The TweenService เพื่อให้สามารถแอนิเมชั่นส่วนของปุ่มที่ยื่นออกมาจากพื้นได้
- โมเดลพ่อของสคริปต์ ปุ่มเสียง 3D * ส่วนของปุ่มที่ยื่นออกมาจากพื้น
- ผู้เล่นเสียงที่เกี่ยวข้องพร้อมเสียงเพลงเฉลิมฉลองของคุณ
สคริปต์จะกำหนด:
- วัตถุ TweenInfo ที่ระบุว่าแอนิเมชั่นของปุ่มจะเล่นด้วยสไตล์แอนิเมชั่นเอกประสงค์
- วัยรุ่นสองคนที่แทนที่สถานะกดหรือไม่กดปุ่ม
- สถานะที่กด true จะย้ายปุ่มลงเล็กน้อยลงสู่พื้นและย้อมสีด้านข้างของชิ้นส่วนด้วยสีเขียว
- สถานะไม่กด false จะย้ายปุ่มกลับไปที่ตำแหน่งเดิมและลบสีก่อนหน้า
ส่วนที่เหลือของสคริปต์เป็นที่ที่ส่วนใหญ่ของการทำงานเกิดขึ้นสำหรับการตอบรับข้อเสนอแนะการโต้ตอบของวัตถุดังนั้นมาดูกันว่าฟังก์ชัน onIsPlayingChanged และผู้ฟังอีเวนต์ทำงานร่วมกันอย่างไร
- buttonPart.Touched ฟังเพื่อให้ผู้เล่นแตะปุ่มแล้วเรียกฟังก์ชัน Play() เพื่อเริ่มเล่นเสียงที่เกี่ยวข้องจากเครื่องเล่นเสียงกระบวนการนี้สลับคุณสมบัติ AudioPlayer.IsPlaying จาก false เป็น true
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") ฟังคุณสมบัติของผู้เล่นเสียงเพื่อเปลี่ยนแปลง IsPlaying จากนั้นเรียกฟังก์ชัน onIsPlayingChanged
- ฟังก์ชัน onIsPlayingChanged ใช้ข้อมูลนี้เพื่อเรียกการเปลี่ยนแปลงวัยรุ่นที่เปลี่ยนรูปลักษณ์ของมันในพื้นที่ 3D
- เพื่อป้องกันไม่ให้ผู้เล่นรีสตาร์ทเสียงโดยไม่ได้ตั้งใจหากพวกเขากระโดดบนปุ่มอย่างรวดเร็วในช่วงเวลาสั้น ๆ buttonPressedAudioPlayer.Ended รอให้ผู้เล่นเสียงจบการเล่นก่อนที่จะเรียกฟังก์ชัน onIsPlayingChanged อีกครั้ง
สิ่งสำคัญคือต้องทราบว่าอีเวนต์ onIsPlayingChanged จะเกิดขึ้นเฉพาะเมื่อมันเปลี่ยนจาก false เป็น true ซึ่งหมายความว่ามันจะไม่เกิดขึ้นเมื่อเปลี่ยนจาก true เป็น falseนี่คือพฤติกรรมที่ตั้งใจไว้เนื่องจากมีการซับซ้อนกับเวลาในการสําเนาคุณสมบัติจากเซิร์ฟเวอร์ไปยังไคลเอนต์เนื่องจากเหตุนี้ การเหตุการณ์ Ended จึงจะได้รับและฟังในตัวอย่างนี้เพื่อครอบคลุมทั้งสองกรณี
ทดสอบประสบการณ์เพื่อฟังเสียงฉลองเมื่อตัวละครผู้เล่นสัมผัสปุ่ม 3D ในบ้านขนมปังขิงเมื่อคุณเดินออกจากปุ่ม ระดับเสียงจะลดลง
บทสนทนาตัวละคร
การให้เสียงทิศทางจากตัวละครที่ไม่สามารถเล่นได้ (NPC) ช่วยให้ผู้เล่นสามารถนําไปสู่จุดสนใจภายในสภาพแวดล้อมของพวกเขาและเพิ่มความลึกให้กับการโต้ตอบของพวกเขากับตัวละครอื่น ๆในความเป็นจริงในเกมที่ขับเคลื่อนด้วยเรื่องราว นักออกแบบเกมจำนวนมากใช้บทสนทนาตัวละครเพื่อสอนผู้เล่นเกี่ยวกับตัวละคร พันธมิตร และศัตรู หรือโลกเองอย่างกลยุทธ์
ตัวอย่างทั่วไปของเทคนิคนี้รวมถึง:
- สไตล์การสนทนา เพื่อตั้งโทนของเกมของคุณ
- Banter เพื่อสอนผู้เล่นเกี่ยวกับความสัมพันธ์ของตัวละคร
- การสนทนาศัตรู เพื่อสารภาพแรงจูงใจหรือตำแหน่งของพวกเขาเกี่ยวกับผู้เล่น
- ตัวละครผู้เล่นพูดความคิดของพวกเขาออกมาอย่างดังเพื่อนำผู้เล่นไปสู่สิ่งที่พวกเขาควรทำต่อไป เช่น รักษาตัวเอง ไอเท็มหรือค้นหาไอเทม * ตัวละครพันธมิตรพูดคุยกับตัวละครผู้เล่น เพื่อเปิดเผยรายละเอียดโลกในประสบการณ์ เช่น ประวัติศาสตร์ วัฒนธรรม และปัญหาสังคม
เพื่อสาธิตว่าสิ่งนี้สามารถดูเป็นอย่างไรในการปฏิบัติ มาดูออดิโอ 3D ยิงเดียวต่อไปนี้จาก เกินความมืด โชว์เคสที่เล่นเป็นระยะๆ เมื่อผู้เล่นอยู่ในพื้นที่ล็อบบี้หลักของสถานีอวกาศ
โดยใช้สถานีอวกาศเป็นตัวละคร คลิปโต้ตอบนี้จะให้ผู้เล่นบริบทและความรู้ที่สำคัญเกี่ยวกับการตั้งค่าโดยรวมตัวอย่างเช่น จากประโยคเดียวนี้ผู้เล่นเรียนรู้:
- พวกเขาอยู่ในอวกาศ โดยเฉพาะอย่างยิ่งบนสถานีอวกาศที่ชื่อว่า Kerr-Newman Deep Space Relay 14
- สภาพแวดล้อมของพวกเขาเป็นอนาคตและเปิดกว้าง
- พวกเขาเป็นผู้เยี่ยมชมและอาจออกเร็ว ๆ นี้
รายละเอียดเหล่านี้รวมกันทำให้ผู้เล่นอยู่ภายในสภาพแวดล้อมของพวกเขาและเพิ่มความรู้สึกเร่งด่วนให้กับภารกิจของพวกเขาอย่างไรก็ตาม หากผู้เล่นไม่ทราบว่าภารกิจหลักของพวกเขาคืออะไร คุณยังสามารถใช้บทสนทนาตัวละครเพื่อแจ้งให้ผู้เล่นทราบถึงสิ่งที่คุณต้องการให้พวกเขาทำภายในประสบการณ์ของคุณ
เพื่อให้เห็นภาพ ตัวอย่างใช้ ปริมาณเสียง หรือภูมิภาคที่มองไม่เห็นภายในพื้นที่ 3D เพื่อกระตุ้นการโต้ตอบตัวละครจากมนุษย์หิมะเพื่อนำผู้เล่นไปรวบรวมลูกกลิ้งสามอันเพื่อเปิดประตูบ้านของเขาเนื่องจากเป็นหนึ่งในสิ่งแรกที่ผู้เล่นเห็นเมื่อพวกเขาเข้าร่วมประสบการณ์ ผู้เล่นมีแนวโน้มที่จะกระตุ้นการสนทนาและรู้ว่าพวกเขาต้องทำอะไรเพื่อประสบความสำเร็จ

เพื่อสร้างใหม่บทสนทนาตัวละครแบบยิงเดียว 3D เสียงในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:
ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ปริมาณการสนทนา จากนั้น:
- ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับระดับเสียง
- ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก Volume ของบทสนทนา 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น เพื่อเล่นเสียงสอนในเชิงใช้งานสำหรับวัตถุประสงค์ของประสบการณ์
เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในระดับเสียง
กลับไปที่หน้าต่าง สํารวจ ค้นหาไปที่ StarterPlayer > StarterCharacterScripts , ใส่ สคริปต์ท้องถิ่น , เปลี่ยนชื่อเป็น PlayAudioWhenInVolume และวางโค้ดต่อไปนี้ลงในสคริปต์ท้องถิ่น:
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)คําอธิบายโค้ดสคริปต์นี้เริ่มต้นโดยรับบริการพื้นที่ทำงานและผู้เล่นเพื่อให้สามารถอ้างอิงถึงบุตรหลานและฟังก์ชันของพวกเขาได้สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่ประสบการณ์แล้ว สคริปต์จะรอ:
ตั้งค่าการชะลอลงเป็น true
ปิด
ตั้งค่า debounce กลับเป็น false
การตั้งค่าการชะลอจาก false ไปยัง true ไปยัง false อีกครั้งหลังจากที่เสียงเสร็จสิ้นการเล่นเป็นรูปแบบการชะลอที่ป้องกันไม่ให้เสียงถูกกระตุ้นซ้ำแล้วซ้ำอีกเนื่องจากผู้เล่นไม่หยุดชนกับระดับเสียงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับลายลักษณ์นี้ debounce ดู ตรวจจับการชนกัน
ทดสอบประสบการณ์เพื่อฟังบทสนทนาตัวละครสอนขณะที่ตัวละครผู้เล่นสัมผัสปริมาณรอบตุ๊กตาหิมะ