การสนทนาด้วยเสียง เป็นฟีเจอร์การสนทนาที่อิงจากระยะทางซึ่งจำลองการสื่อสารที่สมจริงโดยการปรับระดับเสียงของผู้เล่นที่พูดเมื่อพวกเขาเคลื่อนที่เข้าใกล้หรือไกลออกจากกันในพื้นที่ 3D โดยการให้ผู้เล่นพูดคุยกันด้วยไมโครโฟนของพวกเขา พวกเขาสามารถเข้าสังคมและวางกลยุทธ์ร่วมกันแบบเรียลไทม์ทั่วโลกเพื่อทำภารกิจในเกมของคุณให้สำเร็จ
โดยใช้ไฟล์ Gingerbread Island - Voice Chat .rbxl เป็นข้อมูลอ้างอิง บทช่วยสอนนี้จะแสดงให้คุณเห็นวิธีการรวมรูปแบบต่าง ๆ ของการสนทนาด้วยเสียงเข้ากับการเล่นเกมของคุณ รวมถึงคำแนะนำเกี่ยวกับ:
- การจัดกลุ่มผู้เล่นเป็นทีมที่สามารถใช้การสนทนาด้วยเสียงกับเพื่อนร่วมทีมได้เท่านั้น
- การอนุญาตให้ผู้เล่นเปิดไมโครโฟนชั่วคราวในขณะที่พวกเขากดปุ่มเฉพาะบนอุปกรณ์ของตน
- การกำหนดช่วงเวลาที่การสนทนาด้วยเสียงจะเปิดหรือปิด
เมื่อคุณตรวจสอบส่วนต่าง ๆ ต่อไปนี้พร้อมกับตัวอย่าง คุณสามารถปรับแต่งตัวอย่างโค้ดแต่ละตัวให้ตรงกับความต้องการของการสนทนาด้วยเสียงของคุณได้ดียิ่งขึ้น
กำหนดค่าการตั้งค่า
เพื่อให้การสนทนาทีม การกดเพื่อสนทนา หรือการสนทนาตามเวลา ทำงานได้อย่างเหมาะสม คุณต้อง กำหนดค่าการตั้งค่าการสนทนาด้วยเสียงของคุณ เพื่อเปิดใช้งานการสนทนาด้วยเสียงและสร้างวัตถุเสียงที่เหมาะสมที่จำเป็นสำหรับการรับและปล่อยเสียงภายในสภาพแวดล้อม 3D
เมื่อผู้เล่นเข้าร่วมเกมของคุณ การตั้งค่าการสนทนาด้วยเสียงของคุณจะ:
- อนุญาตให้ผู้เล่นที่มีสิทธิ์ใช้ไมโครโฟนของตน
- สร้างและเป็นเจ้าของวัตถุ AudioDeviceInput ภายใต้แต่ละวัตถุ Player ที่มีสิทธิ์
- สร้างและเป็นเจ้าของวัตถุ AudioEmitter ภายใต้แต่ละ Player.Character ที่มีสิทธิ์
- สร้างและเป็นเจ้าของ AudioListener ภายใต้ Workspace.CurrentCamera
ส่วนต่อไปนี้จะอธิบายการกำหนดค่าการสนทนาด้วยเสียงที่ไม่ซ้ำกันสามแบบโดยใช้การตั้งค่าเหล่านี้ ขณะที่คุณติดตามตัวอย่างไฟล์ Gingerbread Island - Voice Chat คุณสามารถเปิดใช้งานสคริปต์ที่ปิดใช้งานในหน้าต่าง Explorer เพื่อทดสอบพฤติกรรมของพวกเขา เพื่อให้แน่ใจว่าทุกอย่างทำงานได้อย่างถูกต้อง โปรดปิดใช้งานสคริปต์อีกครั้งก่อนที่จะไปยังการกำหนดค่าถัดไป

เพิ่มการสนทนาทีม
การสนทนาทีม เป็นการกำหนดค่าการสนทนาด้วยเสียงที่ผู้เล่นในทีมเดียวกันสามารถพูดหรือได้ยินกันและกันในเกมได้เท่านั้น การรวมการสนทนาทีมเข้ากับการเล่นเกมของคุณมีประโยชน์เมื่อคุณต้องการให้ผู้เล่นร่วมมือและวางกลยุทธ์ร่วมกันเพื่อแก้ปัญหาในเกม เช่น การประสานข้อมูลเกี่ยวกับตำแหน่งของทีมศัตรู ทรัพยากร และการมอบหมายงาน
ในการสร้างการสนทนาด้วยเสียงทีมในไฟล์ตัวอย่าง Gingerbread Island - Voice Chat:
ในหน้าต่าง Explorer ให้แทรก Script ลงใน ServerScriptService
เปลี่ยนชื่อสคริปต์เป็น TeamChat จากนั้นวางโค้ดต่อไปนี้ลงในสคริปต์:
local Teams = game:GetService("Teams")local Players = game:GetService("Players")local redTeam = Instance.new("Team", Teams)redTeam.TeamColor = BrickColor.new("Bright red")redTeam.AutoAssignable = trueredTeam.Name = "Red Team"local blueTeam = Instance.new("Team", Teams)blueTeam.TeamColor = BrickColor.new("Bright blue")blueTeam.AutoAssignable = trueblueTeam.Name = "Blue Team"local function getUserIds(team : Team) : {number}local userIds = {}for _, player : Player in team:GetPlayers() dotable.insert(userIds, player.UserId)endreturn userIdsendlocal function getDevices(team : Team) : {AudioDeviceInput}local devices = {}for _, player : Player in team:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueendtable.insert(devices, device)endreturn devicesendlocal function updateTeam(team : Team)local users = getUserIds(team)for _, device in getDevices(team) dodevice.AccessType = Enum.AccessModifierType.Allowdevice:SetUserIdAccessList(users)endendlocal function onDeviceAdded(device : AudioDeviceInput)local player : Player = device.Parentif player.Team thenupdateTeam(player.Team)endendlocal function onPlayerAdded(player : Player)local device = player:FindFirstChild("AudioDeviceInput")if device thenonDeviceAdded(device)endplayer.ChildAdded:Connect(function(child)if child.Name == "AudioDeviceInput" thenonDeviceAdded(child)endend)endupdateTeam(blueTeam)updateTeam(redTeam)for _, player in Players:GetPlayers() doonPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)blueTeam.PlayerAdded:Connect(function() updateTeam(blueTeam) end)blueTeam.PlayerRemoved:Connect(function() updateTeam(blueTeam) end)redTeam.PlayerAdded:Connect(function() updateTeam(redTeam) end)redTeam.PlayerRemoved:Connect(function() updateTeam(redTeam) end)คำอธิบายโค้ดสคริปต์เริ่มต้นด้วยการดึงข้อมูลจาก Teams และ Players เพื่อให้สามารถใช้ฟังก์ชันการทำงานที่มีอยู่แล้วในการจัดกลุ่มผู้เล่นเป็นทีมเมื่อพวกเขาเข้าร่วมเกม ตัวอย่างเช่น โดยไม่ต้องใช้การเขียนสคริปต์เพิ่มเติม บริการ Teams จะจัดการการกระทำเช่น:
- การจัดกลุ่มและการปรับสมดุลผู้เล่นให้เท่าเทียมกันในแต่ละทีม
- การจัดกลุ่มผู้เล่นภายใต้ทีมของพวกเขาในกระดานผู้นำ
- การเปลี่ยนสีชื่อผู้เล่นในพื้นที่ 3D ให้ตรงกับสีทีมของพวกเขา
โดยใช้บริการนี้ สคริปต์จะสร้างวัตถุ Team สองตัวที่แตกต่างกันด้วยค่าคุณสมบัติ Color ที่แตกต่างกันเพื่อแทนที่แต่ละทีม: สีแดงสด สำหรับทีมหนึ่งและ สีน้ำเงินสด สำหรับอีกทีมหนึ่ง
สคริปต์จะกำหนดฟังก์ชันสามฟังก์ชันซึ่งเป็นจุดที่ทำงานหลักในการตั้งค่าการสนทนาด้วยเสียงทีม:
- getUserIds - คืนค่าอาร์เรย์ของ userIDs สำหรับผู้เล่นทั้งหมดในทีม
- getDevices - คืนค่าอาร์เรย์ของวัตถุ AudioDeviceInput สำหรับผู้เล่นทั้งหมดในทีม ทุกวัตถุ Class.AudioDeviceInput แทนไมโครโฟน ทางกายภาพ ของผู้เล่นในโลกจริง
- updateTeam - ดึง userIDs ทั้งหมดจาก getUserIds ทำการวนซ้ำผ่านวัตถุ AudioDeviceInput จาก getDevices ตั้งค่าคุณสมบัติ Enum.AccessModifierType เป็น Allow เพื่อให้เฉพาะ userIDs ในแต่ละทีมได้รับอนุญาตให้ได้ยินจากไมโครโฟนของเพื่อนร่วมทีม จากนั้นอัปเดต SetUserIdAccessList ด้วย userIDs จากทีม
ส่วนที่เหลือของสคริปต์ควบคุมวิธีการทำงานร่วมกันของฟังก์ชันเหล่านี้และตัวฟังเหตุการณ์:
- เมื่อผู้เล่นใหม่เข้าร่วมเกม สคริปต์จะตรวจสอบว่าผู้เล่นมีไมโครโฟนหรือไม่และอัปเดตทีมของพวกเขา
- เมื่อสคริปต์ตรวจพบวัตถุ AudioDeviceInput ใหม่ มันจะเรียก updateTeam สำหรับทีมสีแดงหรือสีน้ำเงินที่เกี่ยวข้อง
- ขณะที่ผู้เล่นเข้าร่วมหรือออกจากเกม สคริปต์จะเชื่อมต่อกับเหตุการณ์ PlayerAdded และ PlayerRemoved เพื่ออัปเดตการตั้งค่าของแต่ละทีม
ทดสอบเกมกับเพื่อนสองสามคนเพื่อยืนยันว่าทีมจากแต่ละทีมสามารถได้ยินกันได้เฉพาะผ่านการสนทนาด้วยเสียงเท่านั้น
เพิ่มการกดเพื่อสนทนา
การกดเพื่อสนทนา เป็นการกำหนดค่าการสนทนาด้วยเสียงที่ผู้เล่นสามารถเปิดไมโครโฟนได้เฉพาะในเกมในขณะที่พวกเขากดและถือปุ่มเฉพาะบนอุปกรณ์ของตน การรวมการกดเพื่อสนทนาเข้ากับการเล่นเกมของคุณมีประโยชน์เมื่อคุณต้องการให้ผู้เล่นมีความเป็นส่วนตัวและควบคุมมากขึ้นเมื่อพวกเขาต้องการให้ได้ยินเหนือผู้เล่นคนอื่นและเสียงรบกวนรอบข้าง
ในการสร้างการสนทนาด้วยเสียงแบบกดในไฟล์ตัวอย่าง Gingerbread Island - Voice Chat:
ในหน้าต่าง Explorer ให้แทรก Script ลงใน ReplicatedStorage
ในหน้าต่าง Properties ให้ตั้งค่า RunContext เป็น Client เพื่อให้สคริปต์ควบคุมไมโครโฟนของผู้เล่นท้องถิ่นเท่านั้น
เปลี่ยนชื่อสคริปต์เป็น PushToChat จากนั้นวางโค้ดต่อไปนี้ลงในสคริปต์:
local Players = game:GetService("Players")local UserInputService = game:GetService("UserInputService")local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")local pushToTalkKey = Enum.KeyCode.VaudioIn.Muted = trueUserInputService.InputBegan:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = falseendend)UserInputService.InputEnded:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = trueendend)คำอธิบายโค้ดสคริปต์เริ่มต้นด้วยการดึงข้อมูล:
- บริการ Players เพื่อให้สามารถอ้างอิงผู้เล่นทั้งหมดในเกม
- บริการ UserInputService เพื่อให้สามารถตรวจสอบเมื่อผู้เล่นกดปุ่มบนอุปกรณ์ของตน
- วัตถุ AudioDeviceInput ของผู้เล่นท้องถิ่น หรือไมโครโฟนทางกายภาพบนอุปกรณ์ของพวกเขา
สคริปต์จะ:
- ตั้งค่าปุ่ม V ให้เป็นปุ่มที่ผู้เล่นต้องกดและถือเพื่อพูดในไมโครโฟนของตน
- ปิดเสียงไมโครโฟนของผู้เล่น
ส่วนที่เหลือของสคริปต์จะตั้งค่าตัวฟังเหตุการณ์สองตัวสำหรับ InputBegan และ InputEnded จาก UserInputService เมื่อพวกเขากดปุ่ม V เหตุการณ์ InputBegan จะเปิดเสียงไมโครโฟนของผู้เล่น และเมื่อพวกเขาปล่อยปุ่ม V เหตุการณ์ InputEnded จะปิดเสียงไมโครโฟนของพวกเขาอีกครั้ง
ทดสอบเกมเพื่อยืนยันว่าผู้เล่นสามารถได้ยินกันได้เฉพาะผ่านการสนทนาด้วยเสียงเมื่อพวกเขากดปุ่ม V เท่านั้น
เพิ่มการสนทนาตามเวลา
การสนทนาตามเวลา เป็นการกำหนดค่าการสนทนาด้วยเสียงที่ผู้เล่นสามารถพูดและได้ยินกันได้เฉพาะในช่วงเวลาที่กำหนด การรวมการสนทนาตามเวลาเข้ากับการเล่นเกมของคุณมีประโยชน์เมื่อคุณต้องการให้ผู้เล่นวางแผนอย่างรอบคอบเกี่ยวกับวิธีการสื่อสารกับกันและกันในช่วงเฉพาะ เช่น ในระหว่างการอภิปรายตามรอบหรือหลังจากฉากตัด
ในการสร้างการสนทนาด้วยเสียงตามเวลาในไฟล์ตัวอย่าง Gingerbread Island - Voice Chat:
ในหน้าต่าง Explorer ให้แทรก Script ลงใน ServerScriptService
เปลี่ยนชื่อสคริปต์เป็น TimeBasedChat จากนั้นวางโค้ดต่อไปนี้ลงในสคริปต์:
local Players = game:GetService("Players")local muteAll = falselocal function toggleMuteAll()muteAll = not muteAllfor _, player in Players:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueenddevice.Muted = muteAllendendwhile true dotask.wait(15) -- ทุก ๆ 15 วินาทีtoggleMuteAll() -- อนุญาตให้ผู้คนพูดหรือป้องกันไม่ให้พวกเขาพูดendคำอธิบายโค้ดสคริปต์นี้เริ่มต้นด้วยการดึงบริการ Players เพื่อให้สามารถอ้างอิงฟังก์ชันการทำงานในการจัดการผู้เล่นทั้งหมดในเกม มันจะตั้งค่าสถานะ muteAll เป็น false ซึ่งฟังก์ชัน toggleMuteAll ต่อไปนี้จะใช้เพื่อเปิดและปิดการสนทนาด้วยเสียง
มาดูฟังก์ชัน toggleMuteAll:
- มันเริ่มต้นด้วยการวนซ้ำผ่านผู้เล่นทั้งหมดในเกมโดยใช้ Players.GetPlayers
- สำหรับผู้เล่นแต่ละคน มันจะตรวจสอบว่ามีวัตถุ AudioDeviceInput หรือไมโครโฟนทางกายภาพบนอุปกรณ์ของพวกเขาหรือไม่
- หากมี ฟังก์ชันจะตั้งค่าคุณสมบัติ AudioDeviceInput ของวัตถุ AudioDeviceInput เป็นค่าของ muteAll ตัวอย่างเช่น หาก muteAll เป็น true ไมโครโฟนของผู้เล่นจะถูกปิด และหาก muteAll เป็น false ไมโครโฟนของผู้เล่นจะถูกเปิด
สคริปต์จะเข้าสู่วงจรไม่สิ้นสุด รอ 15 วินาทีเพื่อปิดเสียงและเปิดเสียงวัตถุ AudioDeviceInput ทั้งหมด
ทดสอบเกมเพื่อยืนยันว่าผู้เล่นสามารถได้ยินกันได้เฉพาะผ่านการสนทนาด้วยเสียงในช่วงเวลา 15 วินาทีเท่านั้น