การแชทด้วยเสียง เป็นฟีเจอร์การแชทที่อิงจากระยะ ซึ่งจำลองการสื่อสารที่สมจริง โดยปรับระดับเสียงของผู้เล่นที่พูดตามระยะห่างจากกันในพื้นที่ 3 มิติ โดยการให้ผู้เล่นสามารถพูดคุยกันด้วยไมโครโฟน จะทำให้พวกเขาสามารถเข้าสังคมและวางแผนร่วมกันได้แบบเรียลไทม์จากทั่วโลกเพื่อให้บรรลุวัตถุประสงค์ของประสบการณ์ของคุณ
โดยใช้ไฟล์ Gingerbread Island - Voice Chat .rbxl เป็นต้นแบบ คู่มือนี้จะแสดงให้คุณเห็นว่าคุณจะรวมรูปแบบการแชทด้วยเสียงต่างๆ ลงในเกมของคุณได้อย่างไร รวมถึงคำแนะนำเกี่ยวกับ:
- การจัดผู้เล่นเป็นทีมที่สามารถใช้การแชทด้วยเสียงได้เฉพาะกับสมาชิกในทีมของพวกเขา
- การอนุญาตให้ผู้เล่นเปิดไมโครโฟนชั่วคราวขณะกดปุ่มเฉพาะบนอุปกรณ์ของพวกเขา
- การกำหนดช่วงเวลาที่การแชทด้วยเสียงจะถูกเปิดหรือปิดใช้งาน
ในขณะที่คุณตรวจสอบส่วนต่างๆ ต่อไปนี้พร้อมกับตัวอย่าง คุณสามารถปรับแต่ละตัวอย่างโค้ดเพื่อให้ตรงกับความต้องการในการแชทด้วยเสียงของคุณได้ดียิ่งขึ้น
กำหนดค่าการตั้งค่า
เพื่อให้การแชทของทีม การกดเพื่อแชท หรือการแชทตามเวลา ทำงานได้อย่างเหมาะสม คุณต้อง กำหนดค่าการตั้งค่าการแชทด้วยเสียงของคุณ เพื่อเปิดใช้งานการแชทด้วยเสียงและสร้างวัตถุเสียงที่จำเป็นสำหรับการรับและส่งเสียงภายในสภาพแวดล้อม 3 มิติ
เมื่อผู้เล่นเข้าร่วมประสบการณ์ของคุณ การตั้งค่าการแชทด้วยเสียงของคุณตอนนี้:
- อนุญาตให้ผู้เล่นที่มีสิทธิ์ใช้ไมโครโฟน
- สร้างและจัดต้นไม้ 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 จะจัดการการทำงานต่างๆ เช่น:
- การจัดเรียงและการสร้างสมดุลผู้เล่นอย่างเท่าเทียมในแต่ละทีม
- การจัดกลุ่มผู้เล่นภายใต้ทีมของพวกเขาบนกระดานผู้นำ
- การเปลี่ยนสีชื่อผู้เล่นในพื้นที่ 3 มิติตามสีของทีมที่เกี่ยวข้อง
โดยใช้บริการนี้ สคริปต์จึงสร้างออบเจ็กต์ Team ที่ไม่ซ้ำกันสองอันด้วยค่าของ Color ที่แตกต่างกันเพื่อนำเสนอทีมแต่ละทีม: สีแดงสด สำหรับทีมหนึ่งและ สีน้ำเงินสด สำหรับอีกทีมหนึ่ง
สคริปต์จะกำหนดฟังก์ชันสามตัวซึ่งเป็นส่วนสำคัญในการตั้งค่าการแชทด้วยเสียงทีม:
- getUserIds - คืนค่าอาร์เรย์ของ userIDs สำหรับผู้เล่นทั้งหมดในทีม
- getDevices - คืนค่าอาร์เรย์ของออบเจ็กต์ AudioDeviceInput สำหรับผู้เล่นทั้งหมดในทีม ออบเจ็กต์ Class.AudioDeviceInput แต่ละอันจะแทนไมโครโฟนทางกายภาพของผู้เล่นในโลกจริง
- updateTeam - ดึง userIDs ทั้งหมดจาก getUserIds ทำการวนซ้ำออบเจ็กต์ AudioDeviceInput จาก getDevices ตั้งค่า property ของ 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 หรือไมโครโฟนทางกายภาพบนอุปกรณ์ของพวกเขาหรือไม่
- หากพวกเขามี ฟังก์ชันจะตั้งค่า property ของออบเจ็กต์ AudioDeviceInput เป็นค่าของ muteAll ตัวอย่างเช่น หาก muteAll เป็น true ไมโครโฟนของผู้เล่นจะถูกปิดเสียง และถ้า muteAll เป็น false ไมโครโฟนของผู้เล่นจะเปิดใช้งาน
สคริปต์นี้จะเข้าสู่วงจรไม่สิ้นสุด รอ 15 วินาทีเพื่อปิดเสียงและเปิดเสียงออบเจ็กต์ AudioDeviceInput ทั้งหมด
ทดสอบประสบการณ์เพื่อรับรองว่าผู้เล่นสามารถได้ยินกันได้เฉพาะผ่านการแชทด้วยเสียงในช่วงเวลา 15 วินาที