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

تشغيل رسوم شخصيات

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

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

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

  • تبديل معرفات أصول رسوم الشخصيات الافتراضية مع رسومك المخصصة.
  • تفعيل الرسوم استجابة لأفعال الشخصيات ضمن مساحة ثلاثية الأبعاد.

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

تغيير الرسوم الافتراضية

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

رسوم السقوط الافتراضية
رسوم السباحة الافتراضية
رسوم التسلق الافتراضية

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

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

رسوم المشي الافتراضية
رسوم المشي المخصصة

إنشاء سكربت

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

لإنشاء سكربت سيشير إلى معرفات أصول الرسوم الافتراضية:

  1. في نافذة Explorer، أضف سكربت جديد إلى ServerScriptService.

    1. مرر فوق ServerScriptService واضغط على زر ⊕.
    2. من القائمة السياقية، أدخل سكربت.
  2. في السكربت الجديد، ألصق الكود التالي:


    local Players = game:GetService("Players")
    local function onCharacterAdded(character)
    local humanoid = character:WaitForChild("Humanoid")
    local animator = humanoid:WaitForChild("Animator")
    print("تم العثور على الرسام!")
    end
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(onCharacterAdded)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

يبدأ سكربت ResetDefaultAnimations بالحصول على خدمة Players، التي تحتوي على جميع كائنات Player للاعبين عند اتصالهم بالخادم. عندما يتم تحميل شخصيات كل لاعب إلى التجربة، ينتظر دالة onCharacterAdded حتى تكتشف كائنات Humanoid و Animator للشخصية.

عندما تكتشف للمرة الأولى كائن Animator، يقوم السكربت بطباعة "تم العثور على الرسام!" لإعلامك بأن السكربت يعمل كما هو مطلوب.

استبدال معرف الأصل

الآن بعد أن عرفت أن سكربتك قادرة على اكتشاف متى يقوم اللاعبون بتحميل والاتصال بالخادم، يمكنك تعديل سكربتك للإشارة بالتحديد إلى معرّف الرسوم (الرسوم) التي تريد استبدالها برسومك المخصصة.

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

عمل الشخصيةمرجع سكربت الرسوم المتحركة
جريanimateScript.run.RunAnim.AnimationId
مشيanimateScript.walk.WalkAnim.AnimationId
قفزanimateScript.jump.JumpAnim.AnimationId
Idle

animateScript.idle.Animation1.AnimationId
animateScript.idle.Animation2.AnimationId

سقوطanimateScript.fall.FallAnim.AnimationId
سباحة

animateScript.swim.Swim.AnimationId

سباحة (Idle)

animateScript.swimidle.SwimIdle.AnimationId

تسلقanimateScript.climb.ClimbAnim.AnimationId

لاستبدال معرف أصل رسوم المشي الافتراضية:

  1. استدعِ مرجع سكربت الرسوم المتحركة للكود الافتراضي للمشي، ثم استبدل معرف الأصل بمعرف الرسوم المخصصة لديك. على سبيل المثال، يشار إلى الكود التالي رسوم دورة المشي من إنشاء رسوم الشخصيات.


    local Players = game:GetService("Players")
    local function onCharacterAdded(character)
    local humanoid = character:WaitForChild("Humanoid")
    local animator = humanoid:WaitForChild("Animator")
    print("تم العثور على الرسام!")
    local animateScript = character:WaitForChild("Animate")
    animateScript.walk.WalkAnim.AnimationId = "rbxassetid://122652394532816"
    end
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(onCharacterAdded)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)
  2. اختبر تجربتك للتأكد من أن رسوم المشي المخصصة لديك تتجاوز الرسوم الافتراضية.

    1. اختر اختبار من القائمة المنسدلة واضغط على زر تشغيل بجواره لبدء الاختبار.

      اختيار الاختبار في قائمة أنماط الاختبار في mezzanine للاستوديو.
    2. قم بالمشي حول محطة الفضاء مع أفاتارك.

تفعيل الرسوم

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

في هذا المثال، عندما يلمس اللاعبون المنصة الذهبية، فإنهم يفعّلون رسوم رقصة غير افتراضية للشخصية.

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

إدراج حجم

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

منظر بعيد لغرفة قصر. تخطيط لعلبة في وسط الغرفة للإشارة إلى حجم الذي يفعل أحداث اللعب.
غ mystery of Duvall Drive يستخدم الأحجام لتفعيل أحداث اللعب التي تغير من المظهر البصري للغرفة.

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

لتضمين حجم حول تسرب بخار سيؤدي إلى تفعيل رسوم:

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

    2. اضبط الشفافية على 1 لجعل الكتلة غير مرئية.

      رسم خارجي لكتلة مرئية حول فتحة بخار للإشارة إلى مكان حجم الذي يفعل الرسوم.

إنشاء سكربت

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

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

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

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

    1. قم بتوسيع StarterPlayer، ثم مرر فوق الطفل StarterCharacterScripts وانقر على زر ⊕.
    2. من القائمة السياقية، قم بإدخال LocalScript وأعد تسميته إلى TriggerAnimation.
  2. في السكربت الجديد، ألصق الكود التالي:


    local Workspace = game:GetService("Workspace")
    local animation = script:WaitForChild("Animation")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local animator = humanoid:WaitForChild("Animator")
    local animationTrack = animator:LoadAnimation(animation)
    local animationDetector = Workspace:WaitForChild("AnimationDetector")
    local debounce = false
    animationDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    if hitCharacter ~= localCharacter then
    return
    end
    debounce = true
    animationTrack:Play()
    animationTrack.Ended:Wait()
    debounce = false
    end)

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

لكل شخصية لاعب يتم تحميلها أو إعادة انبعاثها إلى التجربة، ينتظر السكربت:

  • كائنه الفرعي Animation، والذي ستضيفه في القسم التالي.
  • كائنات الشخصية Humanoid و Animator.
  • كائن الحجم في مساحة العمل والذي يسمى المستشعر الرسومي.

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

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

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

إضافة رسوم

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

لإضافة رسوم ليتم الإشارة إليها بواسطة السكربت المحلي عند تصادم اللاعبين مع الحجم:

  1. في نافذة Explorer، أضف رسوم جديدة إلى TriggerAnimation.

    1. مرر فوق TriggerAnimation واضغط على زر ⊕.
    2. من القائمة السياقية، أدخل Animation.
  2. اختر كائن الرسوم الجديد، ثم في نافذة الخصائص، اضبط AnimationID على معرف الأصل الذي تريده لتفعيله عند لمس اللاعبين الحجم. على سبيل المثال، يشير عينة محطة الفضاء الخطرة إلى rbxassetid://3716468774 لتشغيل رسوم شخصية تسقط إلى الخلف.

  3. اختبر تجربتك للتأكد من أن الرسوم لديك تعمل عندما يكون اللاعبون بالقرب من أول تسرب بخار.

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