الدردشة الصوتية هي ميزة دردشة تعتمد على القرب تحاكي التواصل الواقعي من خلال ضبط حجم اللاعبين المتحدثين كلما اقتربوا أو ابتعدوا عن بعضهم البعض في الفضاء ثلاثي الأبعاد. من خلال السماح للاعبين بالتحدث مع بعضهم باستخدام ميكروفوناتهم، يمكنهم التواصل والتخطيط معًا في الوقت الفعلي عبر العالم لتحقيق أهداف لعبتك.
باستخدام ملف جزيرة الزنجبيل - دردشة صوتية .rbxl كمرجع، يوضح هذا الدليل كيفية دمج أشكال مختلفة من الدردشة الصوتية في طريقة لعبك، بما في ذلك الإرشادات حول:
- فرز اللاعبين إلى فرق يمكنهم استخدام الدردشة الصوتية فقط مع زملائهم في الفريق.
- السماح للاعبين بتفعيل ميكروفوناتهم مؤقتًا أثناء الضغط على زر معين على جهازهم.
- تكوين فترات زمنية حيث تكون الدردشة الصوتية إما مفعلة أو معطلة.
بينما تستعرض الأقسام التالية جنبًا إلى جنب مع العينة، يمكنك تعديل كل نموذج كود لتلبية احتياجات متطلبات الدردشة الصوتية الخاصة بك بشكل أفضل.
تكوين الإعدادات
لكي تعمل دردشة الفريق، أو الدفع للدردشة، أو الدردشة المعتمدة على الوقت بشكل صحيح، يجب عليك تكوين إعدادات الدردشة الصوتية الخاصة بك لتمكين الدردشة الصوتية وإنشاء كائنات الصوت المناسبة اللازمة لالتقاط وإصدار الصوت داخل البيئة ثلاثية الأبعاد.
عندما ينضم اللاعبون إلى لعبتك، فإن إعداد الدردشة الصوتية الخاص بك الآن:
- يسمح للاعبين المؤهلين للدردشة الصوتية باستخدام ميكروفوناتهم.
- ينشئ ويضع كائن AudioDeviceInput تحت كل كائن Player مؤهل للدردشة الصوتية.
- ينشئ ويضع كائن AudioEmitter تحت كل شخصية Player مؤهلة للدردشة الصوتية.
- ينشئ ويضع كائن AudioListener تحت Workspace.CurrentCamera.
توضح الأقسام التالية ثلاث تكوينات فريدة للدردشة الصوتية باستخدام هذه الإعدادات. بينما تتبع مع ملف العينة جزيرة الزنجبيل - دردشة صوتية، يمكنك تمكين البرنامج النصي المعطل المقابل في نافذة Explorer لاختبار سلوكها. لضمان أن كل واحد يعمل بشكل صحيح، تأكد من تعطيل البرنامج النصي مرة أخرى قبل الانتقال إلى التكوين التالي.

إضافة دردشة الفريق
دردشة الفريق هي تكوين دردشة صوتية حيث يمكن للاعبين في نفس الفريق فقط التحدث أو سماع بعضهم البعض في اللعبة. يعد دمج دردشة الفريق في طريقة لعبك مفيدًا عندما تريد من اللاعبين التعاون والتخطيط معًا لحل المشكلات في اللعبة، مثل تنسيق المعلومات حول مواقع الفريق المعادي، والموارد، والمهام.
لإعادة إنشاء دردشة الصوت للفريق في ملف العينة جزيرة الزنجبيل - دردشة صوتية:
في نافذة 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 مع إجراءات مثل:
- فرز وتوازن اللاعبين بالتساوي في كل فريق.
- تجميع اللاعبين تحت فريقهم في لوحة المتصدرين.
- تلوين أسماء اللاعبين في الفضاء ثلاثي الأبعاد بلون فريقهم المقابل.
باستخدام هذه الخدمة، ينشئ البرنامج النصي كائنين متميزين من Team بقيم خصائص Color مختلفة لتمثيل كل فريق: أحمر ساطع لفريق واحد و أزرق ساطع للفريق الآخر.
ثم يعرف البرنامج النصي ثلاث وظائف حيث يحدث الجزء الأكبر من العمل لإعداد تكوين دردشة الصوت للفريق:
- getUserIds - يعيد مصفوفة من معرفات المستخدم لجميع اللاعبين في الفريق.
- getDevices - يعيد مصفوفة من كائنات AudioDeviceInput لجميع اللاعبين في الفريق. يمثل كل كائن AudioDeviceInput الميكروفون الفعلي للاعب في العالم الحقيقي.
- updateTeam - يسترجع جميع معرفات المستخدم من getUserIds، ويتكرر عبر كائنات AudioDeviceInput من getDevices، ويضبط خاصية Enum.AccessModifierType الخاصة بهم إلى Allow بحيث يُسمح فقط بمعرفات المستخدم في كل فريق بسماع ميكروفونات زملائهم في الفريق، ثم يقوم بتحديث SetUserIdAccessList بمعرفات المستخدم من الفريق.
يتحكم باقي البرنامج النصي في كيفية عمل هذه الوظائف ومراقبي الأحداث معًا:
- عندما ينضم لاعب جديد إلى اللعبة، يتحقق البرنامج النصي مما إذا كان لدى اللاعب ميكروفون ويقوم بتحديث فريقه.
- عندما يكتشف البرنامج النصي كائن AudioDeviceInput جديد، فإنه يستدعي updateTeam لفريقه الأحمر أو الأزرق المعني.
- مع انضمام اللاعبين أو مغادرتهم اللعبة، يتصل البرنامج النصي بأحداث PlayerAdded و PlayerRemoved لتحديث إعدادات كل فريق.
اختبر اللعبة مع بعض الأصدقاء للتحقق من أن زملاء الفريق من كل فريق يمكنهم سماع بعضهم البعض فقط من خلال الدردشة الصوتية.
إضافة الدفع للدردشة
الدفع للدردشة هو تكوين دردشة صوتية حيث يمكن للاعبين تفعيل ميكروفوناتهم فقط داخل اللعبة أثناء الضغط على زر معين على جهازهم. يعد دمج الدفع للدردشة في طريقة لعبك مفيدًا عندما تريد من اللاعبين الحصول على مزيد من الخصوصية والتحكم عندما يريدون أن يُسمعوا فوق اللاعبين الآخرين والضوضاء المحيطة.
لإعادة إنشاء الدفع للدردشة الصوتية في ملف العينة جزيرة الزنجبيل - دردشة صوتية:
في نافذة 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.
إضافة دردشة معتمدة على الوقت
الدردشة المعتمدة على الوقت هي تكوين دردشة صوتية حيث يمكن للاعبين التحدث وسماع بعضهم البعض فقط خلال فترة زمنية محددة. يعد دمج الدردشة المعتمدة على الوقت في طريقة لعبك مفيدًا عندما تريد من اللاعبين التخطيط بعناية لكيفية التواصل مع بعضهم البعض خلال مراحل معينة، مثل خلال المناقشات المعتمدة على الجولات أو بعد مشاهد القطع.
لإعادة إنشاء الدردشة الصوتية المعتمدة على الوقت في ملف العينة جزيرة الزنجبيل - دردشة صوتية:
في نافذة 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 ثانية.