إضافة صوت ثنائي الأبعاد

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

الصوت ثنائي الأبعاد هو صوت غير اتجاهي لا يصدر من أي موقع معين، ويظل كما هو بغض النظر عن موقع المستمع أو اتجاهه في الفضاء ثلاثي الأبعاد. وهذا يعني أنه مع تحرك اللاعبين بمستمعيهم في البيئة، يمكنهم سماع الصوت ثنائي الأبعاد باستمرار من أي مكان يتجهون إليه.

باستخدام ملف Gingerbread House - Start .rbxl كنقطة انطلاق و Gingerbread House - Complete Audio كمرجع، يوضح هذا الدليل كيفية إضافة كل من الصوت ثنائي الأبعاد المتكرر والصوت الأحادي إلى ألعابك، بما في ذلك الإرشادات حول:

  • موسيقى خلفية متكررة تُعزف بمجرد اتصال اللاعبين بالخادم.
  • تشغيل الصوت لتوفير ردود فعل فورية للاعبين وفقًا لأهدافهم في اللعب.
  • تفعيل أصوات مختلفة للإشارة إلى تفاعلات واجهة المستخدم المختلفة.

إذا واجهتك أي صعوبة في العملية، يمكنك استخدام Gingerbread House - Complete Audio كمرجع لمقارنة تقدمك.

كائنات الصوت ثنائي الأبعاد

لإنشاء صوت غير اتجاهي، من المهم فهم كائنات الصوت التي ستعمل معها طوال هذا الدليل. هناك ثلاثة أنواع رئيسية من كائنات الصوت للصوت ثنائي الأبعاد:

  • كائن AudioPlayer يقوم بتحميل وتشغيل ملف الصوت.
  • كائن AudioDeviceOutput هو جهاز مادي في العالم الحقيقي، مثل مكبر صوت أو سماعات رأس.
  • Wires تحمل تدفقات الصوت من كائن إلى آخر.

تعمل جميع هذه الكائنات الصوتية معًا لنقل الصوت من تشغيل الملف إلى أجهزة كل لاعب. دعنا نلقي نظرة على كيفية عمل ذلك في الممارسة العملية باستخدام مثال لاعب يرتدي سماعة رأس أثناء لعبه لعبة على جهاز الكمبيوتر المحمول الخاص به:

  • يقوم AudioPlayer بتحميل معرف الأصل الصوتي 127645268874265 إلى اللعبة لصوت شراء العملة.
  • تحمل Wire التدفق من AudioPlayer إلى AudioDeviceOutput بحيث يخرج التدفق من سماعة رأس اللاعب.
  • يحمل كائن AudioDeviceOutput الصوت إلى مكبر الصوت الفعلي للاعب، أو في هذه الحالة، سماعات الرأس الخاصة بهم.

تتناول الأقسام التالية بعمق وتستشهد بهذه الكائنات أثناء تعلمك كيفية تشغيل كل من الصوت ثنائي الأبعاد المتكرر والصوت الأحادي. أثناء مراجعتك لهذه الكائنات مع التقنيات القادمة، يمكنك التنبؤ بدقة أكبر بكيفية التقاط الصوت وتغذيته من اللعبة إلى اللاعب.

الصوت المتكرر

الصوت ثنائي الأبعاد المتكرر، أو الصوت غير الاتجاهي الذي يتكرر بسلاسة بمجرد اتصال اللاعبين بالخادم، هو تقنية تصميم صوت شائعة لتوفير خلفية سمعية متماسكة بغض النظر عما يفعله اللاعبون أو أين يتواجدون في الفضاء ثلاثي الأبعاد. بالإضافة إلى ذلك، يضمن الصوت ثنائي الأبعاد المتكرر أن لعبتك ليست صامتة تمامًا، مما قد يسبب الارتباك ويشتت انتباه اللاعبين عن أهدافهم.

لتوضيح هذا المفهوم، راجع كيف يعزز الصوت ثنائي الأبعاد التالي بشكل كبير جودة عينة محطة الفضاء الخطرة. بدون موسيقى خلفية، تبدو محطة الفضاء فارغة وميتة. ومع ذلك، عندما تتضمن محطة الفضاء موسيقى خلفية، تبدو المحطة كئيبة وخطيرة، مما يضيف إلى الأجواء المخيفة العامة.

بدون صوت ثنائي الأبعاد متكرر
مع صوت ثنائي الأبعاد متكرر

يكون الصوت المتكرر مفيدًا بشكل خاص لتحديد كيف تريد أن يشعر اللاعبون بمجرد انضمامهم إلى لعبتك. على سبيل المثال، تهدف العينة إلى توفير مغامرة مبهجة للاعبين في أرض العجائب الشتوية، لذا تستخدم مقطع صوتي مبهج للتأثير إيجابيًا على مزاجهم في اللحظة التي يدخلون فيها البيئة. لرؤية مدى تأثير هذه التقنية، اعتبر كيف ستتغير تجربة اللاعب إذا قمت بتبديل الصوت المتكرر بمقطع معدني.

لإعادة إنشاء الصوت ثنائي الأبعاد المتكرر في ملف العينة Gingerbread House - Complete Audio:

  1. قم بتمكين مستمع افتراضي مرتبط بشخصية اللاعب الخاصة بك.

    1. في نافذة Explorer، حدد SoundService.
    2. في نافذة Properties، قم بتعيين DefaultListenerLocation إلى Character. عند تشغيل اللعبة، يقوم المحرك تلقائيًا بإنشاء AudioDeviceOutput تحت SoundService.
  2. في نافذة Explorer، انتقل إلى SoundService، ثم:

    1. أدخل كائن AudioPlayer لإنشاء مصدر صوت.
    2. أدخل كائن AudioDeviceOutput لإنشاء مكبر صوت يعمل طوال اللعبة.
    3. أدخل كائن Wire لنقل التدفق من مشغل الصوت إلى مكبر الصوت.
  3. حدد AudioPlayer، ثم في نافذة Properties،

    1. قم بتعيين AssetID إلى rbxassetid://1841461968 لتشغيل مقطع صوتي مبهج.
    2. قم بتمكين Looping بحيث يتكرر الصوت بسلاسة.
    3. قم بتعيين Volume إلى 0.2 لتشغيل الصوت بمستوى منخفض بحيث يمكنك سماع مصادر الصوت الأخرى داخل اللعبة.
  4. حدد Wire، ثم في نافذة Properties،

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن تحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioDeviceOutput الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المكبر الصوتي المحدد.
  5. عد إلى نافذة Explorer، أدخل Script في AudioPlayer، أعد تسميته إلى LoopBackgroundMusic، ثم ألصق الكود التالي في البرنامج النصي:

    local audioPlayer = script.Parent
    audioPlayer:Play()

    يبدأ البرنامج النصي بإعلان متغير لتمثيل والد البرنامج النصي AudioPlayer. ثم يقوم البرنامج النصي بتعيين مصدر الصوت للتشغيل من اللحظة التي ينضم فيها اللاعب إلى اللعبة حتى اللحظة التي يغادر فيها اللعبة.

  6. اختبر اللعبة لسماع الموسيقى الخلفية المتكررة.

الصوت الأحادي

الصوت ثنائي الأبعاد الأحادي، أو الصوت غير الاتجاهي الذي يُشغل مرة واحدة في وقت ومكان محددين ما لم يقم اللاعب بتشغيله مرة أخرى، يوفر للاعبين سياقًا مهمًا حول أي شيء لا تريدهم أن يفوتوه. استخدام هذا النوع من ردود الفعل السمعية في ألعابك أمر ضروري لأنه يوفر استجابة فورية وواضحة لوظائف اللعب الأساسية وأفعال اللاعب، مثل بدء قتال مع زعيم أو فقدان كمية كبيرة من الصحة.

توفر الأقسام التالية تفاصيل التنفيذ لسيناريوهات اللعب الشائعة التي يحتاج فيها اللاعبون إلى ردود فعل غير اتجاهية في الوقت المناسب، بما في ذلك ردود الفعل في اللعب، وتفاعلات عناصر واجهة المستخدم، والتعليق الصوتي للدروس.

ردود الفعل في اللعب

بينما يتقدم اللاعبون في لعبتك، من المهم أن يتلقوا ردود فعل سمعية فورية حول حالة أي شيء يؤثر على لعبهم، مثل نقاطهم، وصحتهم، أو تقدمهم في المستوى. نظرًا لأن هذا النوع من الصوت يرتبط مباشرة بأهداف اللاعب، فمن المهم أن تكون هذه الأصوات واضحة، ومسموعة، وتنقل معلومات مفيدة ودقيقة.

لتوضيح هذا المفهوم، دعنا نراجع الصوت ثنائي الأبعاد الأحادي التالي من نموذج Platformer الذي يُشغل عندما يقفز اللاعبون ويجمعون العملات:

  • يُشغل صوت هواء خفيف بمجرد أن يضغط اللاعب على مفتاح القفز على جهازه.
  • يُشغل صوت رنين عالي النبرة وصوت العملات المتحركة بمجرد أن تلمس شخصية اللاعب عملة.

كلا هذين الصوتين يمكن التعرف عليهما على الفور ضمن سياق الفضاء ثلاثي الأبعاد، ويساعدان اللاعبين على فهم نجاح أفعالهم دون الاعتماد فقط على الإشارات البصرية.

عندما تقوم بتشغيل أصوات متعددة في وقت واحد، قد تكون بعض الأصوات أكثر أهمية بالنسبة للاعبين من غيرها. في هذه الحالة، فإن صوت جمع العملة ينقل معلومات لعب أكثر قيمة من صوت القفز، لذا يقوم اللعبة بتشغيله بمستوى صوت أعلى قليلاً. ومع ذلك، لا توجد معايير أو قواعد لتحقيق مزيج رائع، لذا قم بضبط الأصوات في لعبتك لتعكس ما تشعر أنه الأكثر أهمية.

على سبيل المثال، تتضمن العينة مجموعة متنوعة من المحفزات الصوتية في جميع أنحاء اللعبة، لكنها ليست جميعها بنفس مستوى الأهمية لفهم الهدف الرئيسي للعبة: جمع حلوى الجومدروب لفتح منزل الزنجبيل. لضمان أن يكون اللاعبون على دراية بما يحتاجون إلى القيام به، تضاعف العينة شدة ردود الفعل السمعية كلما جمع اللاعب حلوى الجومدروب.

لإعادة إنشاء الصوت الأحادي لردود الفعل في حالة اللعبة في ملف العينة Gingerbread House - Complete Audio:

  1. في نافذة Explorer، انتقل إلى WorkspaceGumdropsGumdrop، ثم:

    1. أدخل كائن AudioPlayer لإنشاء مصدر صوت.
    2. أدخل كائن AudioDeviceOutput لإنشاء مكبر صوت يعمل طوال اللعبة.
    3. أدخل كائن Wire لنقل التدفق من مشغل الصوت إلى المكبر الصوتي.
  2. حدد AudioPlayer، ثم في نافذة Properties،

    1. قم بتعيين AssetID إلى rbxassetid://9113723699 لتشغيل مقطع صوتي لطيف.
    2. قم بتعيين TimePosition إلى 0.15 لبدء مقطع الصوت أقرب إلى صوت المضغ الفعلي.
    3. قم بتعيين Volume إلى 3 لتشغيل الصوت بمستوى عالٍ بحيث تسمع صوت الجومدروب فوق مصادر الصوت الأخرى داخل اللعبة.
  3. حدد Wire، ثم في نافذة Properties،

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن تحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioDeviceOutput الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المكبر الصوتي المحدد.
  4. قم بتكرار Gumdrop حتى تحصل على ثلاثة حلوى جومدروب، ثم وزعها في البيئة.

  5. عد إلى نافذة Explorer، انتقل إلى ServerScriptService، ثم أدخل Script، أعد تسميته إلى GumdropService، قم بتعيين خاصية RunContext إلى Server، ثم ألصق الكود التالي في البرنامج النصي:

    -- تهيئة الخدمات
    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.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- تحديث جدول الجومدروب
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- تحديث لوحة المتصدرين للجومدروب
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- تحقق مما إذا كان اللاعب قد جمع ثلاثة جومدروب
    if newGumdropAmount >= 3 then
    -- تشغيل صوت حدث الباب عندما يجمع اللاعب ثلاثة جومدروب
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- تحريك الباب لأسفل
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- تعريف معالج الحدث
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Active") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- اللاعب لمس حلوى الجومدروب
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Active", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    end
    end
    end
    -- إعداد مستمعي الأحداث
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Active", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    يبدأ البرنامج النصي بتهيئة خدمات Workspace و Players و ServerStorage و TweenService حتى يتمكن من الإشارة إلى أطفالها ووظائفها. ثم يستدعي وحدات Leaderboard و PlayerData في ServerStorage؛ هذه الوحدات مسؤولة عن إنشاء وتحديث لوحة المتصدرين في الزاوية العليا اليمنى من الشاشة التي تتعقب كمية حلوى الجومدروب التي يجمعها اللاعب في البيئة.

    وظيفة updatePlayerGumdrops في البرنامج النصي مسؤولة إلى حد كبير عن تحديث لوحة المتصدرين في كل مرة يجمع فيها اللاعب حلوى الجومدروب، وانتظار اللحظة التي يجمع فيها جميع الثلاثة جومدروب حتى يتمكن من تشغيل صوت موضعي وتحريك لباب منزل الزنجبيل. لمزيد من المعلومات حول هذا الجزء من البرنامج النصي، انظر إضافة صوت ثلاثي الأبعاد - ردود الفعل على الأحداث.

    وظيفة onGumdropTouched في البرنامج النصي هي المكان الذي يحدث فيه الجزء الأكبر من العمل لتشغيل الصوت ثنائي الأبعاد لردود الفعل في اللعب، وتأخذ وسيطين:

    • otherPart - جزء يتصادم مع حلوى الجومدروب.
    • gumdrop - جزء كروي يمثل حلوى الجومدروب.

    عندما يتصادم أي شيء مع جزء الجومدروب، يتحقق البرنامج النصي أولاً مما إذا كانت الجومدروب نشطة. إذا كان الأمر كذلك، فإنه يتحقق من التحقق من أن الكائن المتصادم هو لاعب. إذا كان الأمر كذلك، يقوم البرنامج النصي بعد ذلك:

    • تشغيل مقطع الصوت ثنائي الأبعاد من مشغل الصوت.
    • جعل الجومدروب غير مرئي.
    • إلغاء تنشيط الجومدروب بحيث لا يمكن للاعبين التفاعل مع الجومدروب غير المرئي.
    • تحديث لوحة المتصدرين للاعب الذي لمس الجومدروب.

    أخيرًا، يقوم البرنامج النصي بإعداد مستمعي الأحداث بحيث لكل حلوى جومدروب، يتصل بوظيفة بحدث Touched، والذي يستدعي وظيفة onGumdropTouched عندما يلمس اللاعب الجومدروب.

  6. اختبر اللعبة لسماع صوت المضغ بعد جمعك لحلوى الجومدروب.

تفاعل واجهة المستخدم

عندما يتفاعل اللاعبون مع عناصر واجهة المستخدم (UI) الخاصة بك، مثل التحويم فوق مربع اختيار أو تحديد زر شراء، من المهم توفير ردود فعل فورية حتى يفهموا بشكل حدسي كيف يتفاعلون مع واجهة المستخدم الخاصة بك. على سبيل المثال، يقوم العديد من المصممين بتغيير الخصائص المرئية لواجهة المستخدم عندما يقوم اللاعبون بتمكين أو تعطيل الإعدادات للتواصل حالة الإعداد.

ومع ذلك، بالنسبة للاعبين الذين يعانون من إعاقات بصرية حيث تكون تغييرات اللون أو الرسوم المتحركة أكثر صعوبة في التفسير بمفردهم، من المفيد توفير أشكال متعددة من ردود الفعل الحسية لتفاعلات واجهة المستخدم الخاصة بك بحيث تظل متاحة وبديهية لأكبر عدد ممكن من اللاعبين. لتوسيع هذا المفهوم، دعنا نفكر في حالات واجهة المستخدم التالية التي تعتبر مهمة لأزرار الشراء في نموذج UGC Homestore:

  • في التركيز - تشير إلى أن اللاعب يسلط الضوء على عنصر واجهة المستخدم استعدادًا لتحديده.
  • عند التحويم - تشير إلى أن اللاعب يحوم فوق عنصر واجهة المستخدم بمؤشره.
  • محدد - تشير إلى أن اللاعب قد حدد عنصر واجهة المستخدم من خلال إدخاله.

تعتبر جميع هذه التفاعلات الثلاثة ضرورية لتدفق المستخدم الرئيسي للنموذج الذي يتضمن تصفح اللاعبين، وتحديد، وشراء ملابس وإكسسوارات الأفاتار، لذا من الأهمية بمكان ألا يكون هناك أي لبس حول كيفية التفاعل مع واجهة المستخدم. لتجهيز اللاعبين للنجاح، يوفر النموذج ردود فعل بصرية وسمعية لكل تفاعل واجهة مستخدم.

ردود الفعل البصرية
عرض افتراضي
حالة في التركيز
حالة عند التحويم
حالة محددة

لتقديم مثال على كيفية تكوين أشكال متعددة من ردود الفعل الحسية، توفر العينة ردود فعل بصرية وسمعية كلما ضغط اللاعبون على زر النعناع على الشاشة. عندما لا يتفاعل اللاعبون مع الزر، يبدو كحلوى نعناع عادية، ولكن عندما يضغطون على الزر، تقوم العينة:

  • بتشغيل مقطع صوتي مبهج.
  • تلوين الزر بلون أزرق مائل إلى الأخضر.
  • تحريك الزر قليلاً لأسفل على الشاشة.

من هنا، يمكنك ربط هذا التفاعل بجميع أنواع الإجراءات المفيدة في اللعب، مثل فتح قائمة أو شراء عنصر.

عرض افتراضي
حالة مضغوطة

لإعادة إنشاء الصوت الأحادي لتفاعل واجهة المستخدم في ملف العينة Gingerbread House - Complete Audio:

  1. في نافذة Explorer، انتقل إلى StarterGui2DAudioButton، ثم:

    1. أدخل كائن AudioPlayer لإنشاء مصدر صوت.
    2. أدخل كائن AudioDeviceOutput لإنشاء مكبر صوت يعمل طوال اللعبة.
    3. أدخل كائن Wire لنقل التدفق من مشغل الصوت إلى المكبر الصوتي.
  2. حدد AudioPlayer، ثم في نافذة Properties، قم بتعيين AssetID إلى rbxassetid://3422389728 لتشغيل مقطع صوتي قديم.

  3. حدد Wire، ثم في نافذة Properties،

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن تحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioDeviceOutput الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المكبر الصوتي المحدد.
  4. عد إلى نافذة Explorer، أدخل LocalScript في 2DAudioButton، أعد تسميته إلى PlayAudioWhenPressed، ثم ألصق الكود التالي في البرنامج النصي:

    local TweenService = game:GetService("TweenService")
    local buttonGui = script.Parent
    local buttonImageButton = buttonGui.ButtonFrame.ButtonImageButton
    local buttonAudioPlayer = buttonGui.AudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- مضغوط
    [true] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position + UDim2.fromScale(0, .1),
    ImageColor3 = Color3.fromRGB(117, 255, 255),
    }),
    -- افتراضي
    [false] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position,
    ImageColor3 = Color3.fromRGB(255, 255, 255),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonImageButton.Activated:Connect(function(_hit)
    buttonAudioPlayer:Play()
    end)

    يبدأ البرنامج النصي بالحصول على:

    • TweenService حتى يتمكن من تحريك عناصر واجهة المستخدم.
    • كائن 2DAudioButton ScreenGui الخاص بالبرنامج النصي.
    • زر النعناع ImageButton.
    • مشغل الصوت ذي مقطع الصوت الخاص بك.

    ثم يقوم البرنامج النصي بتعريف:

    • كائن TweenInfo الذي يحدد أن الرسوم المتحركة للزر ستلعب بأسلوب رسوم متحركة أسي.
    • حركتين تمثلان حالة الزر المضغوط أو غير المضغوط.
      • حالة الضغط true تحرك الزر قليلاً لأسفل على الشاشة وتلوينه بلون أزرق مائل إلى الأخضر.
      • حالة عدم الضغط false تعيد الزر إلى موضعه الأصلي على الشاشة وتزيل اللون السابق.

    بقية البرنامج النصي هي المكان الذي يحدث فيه الجزء الأكبر من العمل لتشغيل ردود الفعل السمعية لتفاعل واجهة المستخدم، لذا دعنا نراجع كيف تعمل وظيفة onIsPlayingChanged ومستمعي الأحداث معًا لتدفق واجهة المستخدم:

    1. يستمع buttonImageButton.Activated للاعب للنقر على الزر، ثم يستدعي وظيفة Play() لبدء تشغيل الصوت المرتبط من مشغل الصوت. هذه العملية تغير خاصية AudioPlayer.IsPlaying من false إلى true.
    2. يستمع buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying") لتغيير خاصية IsPlaying لمشغل الصوت، ثم يستدعي وظيفة onIsPlayingChanged.
    3. تستخدم وظيفة onIsPlayingChanged هذه المعلومات لتشغيل الحركة التي تغير مظهرها البصري على الشاشة.
    4. لمنع اللاعب من إعادة تشغيل الصوت عن طريق الخطأ إذا قام بالنقر على الزر بسرعة، يستمع buttonAudioPlayer.Ended لإنهاء تشغيل مشغل الصوت قبل استدعاء وظيفة onIsPlayingChanged مرة أخرى.

    من المهم ملاحظة أن حدث onIsPlayingChanged يتم تشغيله فقط عندما يتغير من false إلى true، مما يعني أنه لا يتم تشغيله عند التغيير من true إلى false. هذه سلوكيات مقصودة بسبب تعقيدات توقيت تكرار الخصائص من الخادم إلى العميل. بسبب ذلك، يتم توفير حدث Ended والاستماع إليه في هذا المثال لتغطية كلا الحالتين.

  5. اختبر اللعبة لسماع اللحن في كل مرة تضغط فيها على الزر على الشاشة.

©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.