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

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

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

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

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

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

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

كائنات الصوت

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

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

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

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

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

الصوت المستمر

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

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

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

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

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

    1. في نافذة استكشاف، اختر SoundService.
    2. في نافذة الخصائص، اضبط DefaultListenerLocation على Character. عند تشغيل التجربة، يقوم المحرك تلقائيًا:
      • بإنشاء كائن AudioListener تحت Humanoid.RootPart لكل شخصية لاعب حتى تتمكن من سماع الأصوات تتغير في مكبرات الصوت الخاصة بك في العالم الحقيقي وفقًا لموقف وأبعاد مصادر الصوت داخل التجربة.
      • بإنشاء كائن AudioDeviceOutput تحت SoundService.
  2. في نافذة استكشاف، انتقل إلى WorkspaceWaterfallAudioObject، ثم:

    1. إدراج كائن AudioPlayer لإنشاء مصدر صوت للشلال.
    2. إدراج كائن AudioEmitter لإصدار تيار موضعي من WaterfallAudioObject.
    3. إدراج كائن Wire لنقل التيار من المشغل الصوتي إلى المصدر الصوتي.
  3. اختر AudioPlayer، ثم في نافذة الخصائص،

    1. اضبط AssetID على rbxassetid://1516791621 لتشغيل مسار صوت المطر.
    2. قم بتمكين Looping حتى يتكرر الصوت بسلاسة.
  4. اختر AudioEmitter، ثم في نافذة الخصائص، اضبط DistanceAttenuation على {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} بحيث ينخفض الصوت تدريجيًا في مستوى الصوت كل 20 وحدة عن المصدر الصوتي.

  5. اختر Wire، ثم في نافذة الخصائص،

    1. اضبط SourceInstance على AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن تحمل الأسلاك الصوت من هذا المشغل الصوتي المحدد.
    2. اضبط TargetInstance على AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن تحمل الأسلاك الصوت إلى هذا المصدر الصوتي المحدد داخل الشلال.
  6. عد إلى نافذة استكشاف، قم بإدراج Script في WaterfallAudioObject، أعد تسميته إلى LoopWaterfallMusic، اضبط خاصية RunContext على Client، ثم ألصق الشيفرة التالية في السكربت:


    local audioPlayer = script.Parent
    audioPlayer:Play()

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

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

الصوت المنفرد

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

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

تغذية راجعة للأحداث

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

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

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

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

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

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

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

  1. في نافذة استكشاف، انتقل إلى WorkspaceDoor، ثم:

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

  3. اختر Wire، ثم في نافذة الخصائص،

    1. اضبط SourceInstance على AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن يحمل الأسلاك الصوت من هذا المشغل الصوتي المحدد.
    2. اضبط TargetInstance على AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن يحمل الأسلاك الصوت إلى هذا المصدر الصوتي المحدد داخل الحجم.
  4. عد إلى نافذة استكشاف، انتقل إلى 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("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- لمس اللاعب لجومدروب
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("جمع اللاعب لجومدروب")
    end
    end
    end
    -- إعداد مستمعي الأحداث
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

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

    يتم تنفيذ الدالة updatePlayerGumdrops في الشيفرة حيث تحدث معظم العمل لتشغيل الصوت ثلاثي الأبعاد لتغذية راجعة للأحداث، وتأخذ متغيرين:

    • player - لاعب يجمع جومدروب.
    • updateFunction - دالة النداء التي تحدث مقدار الجومدروب التي جمعها اللاعب.

    عندما يتصادم لاعب مع جومدروب، تقوم الشيفرة:

    • بالحصول على القيمة الجديدة لعدد الجومدروب التي جمعها اللاعب عبر استدعاء دالة PlayerData.updateValue.
    • تحديث لوحة الصدارة بهذه الكمية الجديدة عبر استدعاء دالة Leaderboard.setStat.
    • التحقق مما إذا كان المقدار أكبر من أو يساوي 3.

    عندما تكون هذه القيمة أكبر من أو تساوي 3، تقوم الشيفرة:

    • بتشغيل المسار الصوتي ثلاثي الأبعاد من مشغل الصوت إلى المصدر الصوتي.
    • تحريك الباب بشكل خطي 15 وحدة أسفل موضعه الحالي.

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

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

تفاعل الكائنات

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

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

  • يُصدَر صوت نقر لطيف عندما يقوم اللاعب بزراعة بذور.
  • يُصدَر صوت رذاذ سائل عندما يقوم اللاعب بري نبتته التي تنمو.
  • يُصدَر صوت قطع عندما يقوم اللاعب بجمع الزرعة الناضجة.
  • يُصدَر صوت خبط ناعم عندما يضع اللاعب الكرنب في العربة.

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

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

  • بتشغيل مسار صوتي احتفالي.
  • تلون جوانب الزر بلون أخضر.
  • تحرك الزر إلى داخل الأرض.

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

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

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

  1. في نافذة استكشاف، انتقل إلى Workspace3DAudioButton، ثم:

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

  3. اختر Wire، ثم في نافذة الخصائص،

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


    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- مضغوط
    [true] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size / Vector3.new(2, 1, 1),
    Color = Color3.fromRGB(75, 151, 75),
    }),
    -- افتراضي
    [false] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size,
    Color = Color3.fromRGB(196, 40, 28),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonPressedAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    تبدأ الشيفرة بالحصول على:

    • TweenService حتى تتمكن من تحريك جزء الزر الذي يبرز من الأرض.
    • نموذج 3DAudioButton والد الشيفرة.
    • الجزء المرتبط بالزر الذي يبرز من الأرض.
    • المشغل الصوتي ذي الصوت الاحتفالي.

    ثم تحدد الشيفرة:

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

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

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

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

  5. اختبر التجربة لسماع الصوت الاحتفالي عندما تلمس شخصية اللاعب الزر ثلاثي الأبعاد في بيت الزنجبيل. عندما تبتعد عن الزر، ينقص مستوى الصوت.

حوار الشخصيات

توفير الصوت الاتجاهي من الشخصيات غير القابلة للعب (NPC) مفيد لتوجيه اللاعبين نحو نقاط الاهتمام داخل بيئتهم، وإضافة عمق لتفاعلاتهم مع شخصيات أخرى. في الواقع، في التجارب التي يقودها السرد، يستخدم العديد من المصممين حوار الشخصيات استراتيجيًا لتعليم اللاعبين عن شخصياتهم، أو حلفائهم وأعدائهم، أو العالم نفسه دون قصد.

تشمل الأمثلة الشائعة لهذه التقنية:

  • أسلوب الحوار لتحديد نبرة تجربتك.
  • المزاح لتعليم اللاعبين عن علاقات الشخصيات.
  • محادثات الأعداء للاعتراف بالدوافع أو مواقعهم بالنسبة للاعب.
  • الشخصيات القابلة للعب تُعبِّر عن أفكارها بصوت عالٍ لإرشاد اللاعب عن ما يجب عليهم القيام به بعد ذلك، مثل أن يشفي نفسه، أو ينتقل إلى موقع آخر، أو يجد عنصرًا.
  • الشخصيات الحليفة تتحدث مع شخصية اللاعب لكشف تفاصيل العالم داخل التجربة مثل تاريخه، وثقافته، والقضايا الاجتماعية.

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

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

  • أنهم في الفضاء الخارجي، وبشكل محدد في محطة فضاء تُدعى Kerr-Newman Deep Space Relay 14.
  • أن بيئتهم مستقبلية ومرحب بها.
  • أنهم زائرون ومن المحتمل أن يغادروا قريبًا.

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

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

تستخدم منطقة الأبعاد حول رجل الثلج استجابة الاصطدام لتشغيل الصوت عندما يدخل اللاعبون المنطقة ثلاثية الأبعاد.

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

  1. في نافذة استكشاف، انتقل إلى WorkspaceDialogueVolume، ثم:

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

  3. اختر Wire، ثم في نافذة الخصائص،

    1. اضبط SourceInstance على AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن تحمل الأسلاك الصوت من هذا المشغل الصوتي المحدد.
    2. اضبط TargetInstance على AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن تحمل الأسلاك الصوت إلى هذا المورد الصوتي المحدد ضمن منطقة الصوت.
  4. عد إلى نافذة استكشاف، انتقل إلى StarterPlayerStarterCharacterScripts، قم بإدراج LocalScript، وأعد تسميته إلى PlayAudioWhenInVolume، ألصق الشيفرة التالية في السكربت المحلي:


    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local volumeDetector = Workspace.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    تبدأ هذه الشيفرة من خلال الحصول على خدمات Workspace وPlayers حتى تتمكن من الرجوع إلى أطفالهم ووظائفهم. لكل شخصية لاعب تدخل أو تتجدد في التجربة، تنتظر الشيفرة:

    • Humanoid وAnimator للكائن الخاص بالشخصية.
    • كائن المنطقة في العمل المسماة DialogueVolume.

    عندما يلامس أي شيء المنطقة، يحصل معالج الحدث Touched على أول سلف هو Model، والذي ينبغي أن يكون النموذج الخاص بالشخصية إذا كانت BasePart التي تصادمت مع المنطقة هي ابن نموذج الشخصية. إذا كان كذلك، تقوم الوظيفة بعد ذلك بـ:

    • تعيين المتغير debounce إلى true.
    • تشغيل الصوت والانتظار حتى ينتهي.
    • تعيين المتغير debounce مرة أخرى إلى false.

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

  5. اختبر التجربة لسماع الحوار الصوتي الإرشادي عندما تلمس شخصية اللاعب المنطقة حول رجل الثلج.

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