دروس تعليمية متوسطة

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

لإعادة إنشاء الصوت الثنائي الأبعاد المتكرر في ملف النموذج البيت الزنجبيلية - الصوت الكامل:

  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 على مشغل الصوت الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. اضبط TargetInstance على جهاز AudioDeviceOutput الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المكبر الصوتي المحدد.
  5. مرة أخرى في نافذة Explorer، أدخل Script في AudioPlayer، وأعد تسميته إلى LoopBackgroundMusic، واضبط خاصية RunContext إلى Client، ثم الصق الشيفرة التالية في البرنامج النصي:


    local audioPlayer = script.Parent
    audioPlayer:Play()

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

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

الصوت المستخدم مرة واحدة

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

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

ردود الفعل المتعلقة باللعب

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

لتوضيح هذا المفهوم، دعنا نراجع الصوت الثنائي الأبعاد المستخدم مرة واحدة من نموذج Platformer الذي يتم تشغيله بينما jumps اللاعبون ويجمعون العملات:

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

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

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

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

لإعادة إنشاء صوت ردود الفعل لحالة الاستخدام مرة واحدة في ملف البيت الزنجبيلية - الصوت الكامل:

  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 على مشغل الصوت الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    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:

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

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

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

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

  • تشغيل مسار صوتي للاحتفال.
  • تغيير لون الزر إلى لون teal.
  • تحريك الزر قليلاً نحو الأسفل على الشاشة.

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

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

لإعادة إنشاء الصوت المستخدم مرة واحدة لتفاعل واجهة المستخدم في ملف البيت الزنجبيلية - الصوت الكامل:

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

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

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

    1. اضبط SourceInstance على مشغل الصوت الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    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 وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.