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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    local audioPlayer = script.Parent
    audioPlayer:Play()

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

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

الصوت المفرد

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

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

ردود الفعل على الأحداث

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

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

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

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

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

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

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

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

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

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

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المصدر الصوتي المحدد داخل الحجم.
  4. عد إلى نافذة 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("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. اختبر اللعبة لسماع صوت البوابة المنزلقة بعد جمعك لجميع حبات الجومدروب الثلاثة في البيئة. عندما تدير الكاميرا، يتغير الصوت ديناميكيًا في مكبرات الصوت الخاصة بك في العالم الحقيقي بحيث تسمعه وفقًا لموقع المصدر في الفضاء ثلاثي الأبعاد.

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المصدر الصوتي المحدد داخل الزر.
  4. عد إلى نافذة Explorer، أدخل 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) مفيد لتوجيه اللاعبين نحو نقاط الاهتمام داخل بيئتهم، وإضافة عمق لتفاعلاتهم مع الشخصيات الأخرى. في الواقع، في الألعاب المدفوعة بالسرد، يستخدم العديد من المصممين الحوار الشخصي بشكل استراتيجي لتعليم اللاعبين عن شخصيتهم، أو الشخصيات الحليفة والعدو، أو العالم نفسه.

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

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

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

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

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

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

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

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

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

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

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

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

    1. قم بتعيين SourceInstance إلى AudioPlayer الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت من هذا المشغل الصوتي المحدد.
    2. قم بتعيين TargetInstance إلى AudioEmitter الجديد الخاص بك لتحديد أنك تريد أن يحمل السلك الصوت إلى هذا المصدر الصوتي المحدد داخل المنطقة.
  4. عد إلى نافذة Explorer، انتقل إلى 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 مرة أخرى بعد انتهاء تشغيل الصوت هو نمط من ردود الفعل يمنع الصوت من التشغيل بشكل متكرر مع تصادم اللاعبين المستمر مع المنطقة. لمزيد من المعلومات حول هذا النمط من ردود الفعل، انظر Debounce - اكتشاف الاصطدامات.

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

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