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