تشغيل رسوم متحركة للشخصيات هو جزء مهم مما يجعل الصور الرمزية والشخصيات غير القابلة للعب (NPCs) تعبيرية وواقعية وجذابة لجمهورك. بالإضافة إلى توفير مرئيات غامرة، توفر رسوم الشخصيات المتحركة للاعبين ردود فعل من أفعالهم، وإرشادات حول كيفية التنقل في البيئة، ومعلومات حيوية حول شخصياتهم والشخصيات الأخرى.
باستخدام ملف محطة الفضاء الخطرة .rbxl كمرجع، يوضح لك هذا الدليل كيفية تشغيل رسوم متحركة للشخصيات باستخدام تقنيتين مختلفتين، بما في ذلك الإرشادات حول:
- استبدال معرفات أصول رسوم الشخصيات الافتراضية برسوم متحركة مخصصة خاصة بك.
- تشغيل الرسوم المتحركة استجابةً لأفعال الشخصيات داخل الفضاء ثلاثي الأبعاد.
بعد إكمال هذا الدليل، سيكون لديك المهارات لتخصيص الرسوم المتحركة لمجموعة واسعة من مواقف اللعب.
تغيير الرسوم المتحركة الافتراضية
كل شخصية تحتوي على كائن Humanoid الافتراضي، سواء كانت صورة رمزية يتحكم بها اللاعب أو شخصية غير قابلة للعب (NPC)، تتضمن مجموعة من الرسوم المتحركة الافتراضية التي تُشغل كلما قامت الشخصية بأفعال معينة داخل اللعبة، مثل الجري، والتسلق، والقفز. توفر Roblox هذه الرسوم المتحركة بشكل افتراضي لكل لعبة دون أي جهد إضافي في البرمجة.
ومع ذلك، إذا كانت هذه الرسوم المتحركة الافتراضية لا تلبي متطلبات التصميم لبيئة عالمك أو جماليته أو روايته العامة، يمكنك استبدالها برسوم متحركة مخصصة تنطبق على كل لاعب ينضم إلى لعبتك.
لتوضيح ذلك، يعلمك القسم التالي كيفية استبدال رسوم المشي الافتراضية بدورة مشي مخصصة من إنشاء رسوم متحركة للشخصيات. باستخدام هذه العملية نفسها، يمكنك استبدال أي من الرسوم المتحركة الافتراضية بمعرفات أصول الرسوم المتحركة الخاصة بك.
إنشاء سكربت
يتضمن كائن Humanoid لكل شخصية كائن فرعي Animator يخزن جميع الرسوم المتحركة الافتراضية للشخصية. من أجل تعيين أي من هذه الرسوم المتحركة الافتراضية إلى معرفات أصول جديدة، يجب عليك إنشاء سكربت في ServerScriptService حتى يتمكن من الإشارة إلى القيم الافتراضية لكائن Animator وتجاوزها بمجرد تحميل اللاعبين في اللعبة.
لإنشاء سكربت سيشير إلى معرفات أصول الرسوم المتحركة الافتراضية:
في نافذة Explorer، أضف سكربت جديد إلى ServerScriptService.
- مرر فوق ServerScriptService وانقر على زر ⊕.
- من القائمة السياقية، أدخل Script.
في السكربت الجديد، الصق الكود التالي:
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("تم العثور على Animator!")endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)
يبدأ سكربت ResetDefaultAnimations بالحصول على خدمة Players، التي تحتوي على جميع كائنات Player للاعبين عند اتصالهم بالخادم. عندما يتم تحميل شخصيات كل لاعب في اللعبة، تنتظر دالة onCharacterAdded حتى تكتشف كائنات Humanoid وAnimator للشخصية.
عندما تكتشف كائن Animator للمرة الأولى، يقوم السكربت بطباعة "تم العثور على Animator!" ليخبرك أن السكربت يعمل كما هو مقصود.
استبدال معرف الأصول
الآن بعد أن عرفت أن سكربتك قادرة على اكتشاف متى يتم تحميل اللاعبين والاتصال بالخادم، يمكنك تعديل سكربتك للإشارة بشكل محدد إلى معرفات الرسوم المتحركة التي تريد استبدالها برسومك المتحركة المخصصة.
تحتوي الجدول التالي على جميع الرسوم المتحركة الافتراضية للشخصيات التي يمكنك استدعاؤها واستبدالها داخل كائن Animator. لاحظ أن Idle له نوعان يمكنك برمجتهما لتشغيلهما بشكل أكثر أو أقل تكرارًا.
| إجراء الشخصية | مرجع سكربت الرسوم المتحركة |
| الجري | animateScript.run.RunAnim.AnimationId |
| المشي | animateScript.walk.WalkAnim.AnimationId |
| القفز | animateScript.jump.JumpAnim.AnimationId |
| Idle | animateScript.idle.Animation1.AnimationId |
| السقوط | animateScript.fall.FallAnim.AnimationId |
| السباحة | animateScript.swim.Swim.AnimationId |
| السباحة (Idle) | animateScript.swimidle.SwimIdle.AnimationId |
| التسلق | animateScript.climb.ClimbAnim.AnimationId |
لاستبدال معرف الأصول لرسوم المشي الافتراضية:
استدعِ مرجع سكربت الرسوم المتحركة للمشي الافتراضي، ثم استبدل معرف الأصول بمعرف أصول الرسوم المتحركة المخصصة الخاصة بك. على سبيل المثال، يشير نموذج الكود التالي إلى رسوم المشي من إنشاء رسوم متحركة للشخصيات.
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("تم العثور على Animator!")local animateScript = character:WaitForChild("Animate")animateScript.walk.WalkAnim.AnimationId = "rbxassetid://122652394532816"endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)اختبر لعبتك للتأكد من أن رسوم المشي المخصصة الخاصة بك تتجاوز الرسوم المتحركة الافتراضية.
اختر اختبار من القائمة المنسدلة وانقر على زر تشغيل إلى يمينه لبدء اختبار اللعب.

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

عند إضافة حجم إلى لعبتك، من المهم ضبطه بحيث يغطي فقط المساحة التي تريد تشغيل الرسوم المتحركة الخاصة بك. إذا جعلت حجمك صغيرًا جدًا، قد لا يتصادم اللاعبون أبدًا مع المنطقة لتشغيل الرسوم المتحركة؛ وعلى العكس، إذا جعلت حجمك كبيرًا جدًا، ستُشغل الرسوم المتحركة قبل أن يصل اللاعبون إلى العنصر أو المنطقة المعنية، وقد لا يفهمون ما فعلوه لتشغيل الرسوم المتحركة.
لإدراج حجم حول تسرب بخار سيشغل رسوم متحركة:
- في نافذة Explorer، أضف جزء كتلة جديد.
- ضع الحجم وقم بتغيير حجمه حتى يغطي المنطقة التي تريد تشغيل الرسوم المتحركة الخاصة بك.
- في نافذة Properties،
اضبط Name على AnimationDetector.
اضبط Transparency على 1 لجعل الكتلة غير مرئية.

إنشاء سكربت
الآن بعد أن لديك منطقة محددة لتشغيل الرسوم المتحركة الخاصة بك، حان الوقت لإنشاء سكربت يكتشف برمجيًا متى يتصادم اللاعبون مع الحجم. يمكنك بعد ذلك الاستماع لأحداث الاصطدام لتشغيل أي رسوم متحركة تتناسب مع متطلبات اللعب الخاصة بك.
على سبيل المثال، تستخدم هذه التقنية الرسوم المتحركة LocalScript بدلاً من Script لتوفير ردود فعل فورية للاعبين عندما يتصادمون مع الحجم. إذا كان الخادم يستمع للاصطدام ويشغل الرسوم المتحركة، فقد يكون هناك تأخير بين لمس اللاعب للحجم ورؤية الرسوم المتحركة تُشغل بسبب وقت النسخ المتماثل من الخادم إلى العميل.
لإنشاء سكربت محلي سيكتشف متى تلمس شخصية اللاعب المحلي الحجم:
في نافذة Explorer، أضف سكربتًا جديدًا إلى StarterCharacterScripts. يضمن هذا الموضع أن يتم استنساخ السكربت وأطفاله في شخصية اللاعب عند الانضمام وعند إعادة ظهورهم في اللعبة.
- قم بتوسيع StarterPlayer، ثم مرر فوق طفله StarterCharacterScripts وانقر على زر ⊕.
- من القائمة السياقية، أدخل LocalScript وأعد تسميته إلى TriggerAnimation.
في السكربت الجديد، الصق الكود التالي:
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 = falseanimationDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")if hitCharacter ~= localCharacter thenreturnenddebounce = trueanimationTrack:Play()animationTrack.Ended:Wait()debounce = falseend)
يبدأ سكربت TriggerAnimation بالحصول على خدمة Workspace، التي تحتوي على جميع الكائنات الموجودة في العالم ثلاثي الأبعاد. هذا مهم لأن السكربت يحتاج إلى الإشارة إلى كائن Part الذي يعمل كحجمك.
لكل شخصية لاعب يتم تحميلها أو إعادة ظهورها في اللعبة، ينتظر السكربت:
- كائنه الفرعي Animation، الذي ستضيفه في القسم التالي.
- كائن الحجم في مساحة العمل المسمى AnimationDetector.
عندما يتصادم أي شيء مع الحجم، تقوم دالة معالج الحدث Touched بالحصول على أول سلف يكون Model، والذي يجب أن يكون الشخصية إذا كان BasePart الذي تصادم مع الحجم هو تابع لنموذج الشخصية. إذا كان الأمر كذلك، تتحقق الدالة بعد ذلك مما إذا كان Model هو شخصية اللاعب المحلي. إذا كان الأمر كذلك، تقوم الدالة بعد ذلك:
- تعيين debounce إلى true.
- تشغيل والانتظار حتى تنتهي الرسوم المتحركة.
- تعيين debounce مرة أخرى إلى false.
تعيين debounce من false إلى true ثم إلى false مرة أخرى بعد انتهاء تشغيل الرسوم المتحركة هو نمط debounce يمنع تشغيل الرسوم المتحركة بشكل متكرر حيث يتصادم اللاعبون باستمرار مع الحجم. لمزيد من المعلومات حول نمط debounce هذا، انظر اكتشاف الاصطدامات.
إضافة الرسوم المتحركة
إذا كنت ستختبر لعبتك الآن، فلن يتمكن سكربت TriggerAnimation الخاص بك من تشغيل الرسوم المتحركة استجابةً لتصادم اللاعب المحلي مع الحجم. وذلك لأنه ينتظر كائن فرعي من نوع Animation مع معرف أصول الرسوم المتحركة الذي يمكنه الإشارة إليه، وهذا الكائن Animation غير موجود حاليًا.
لإضافة رسوم متحركة ليتمكن السكربت المحلي من الإشارة إليها عند تصادم اللاعبين مع الحجم:
في نافذة Explorer، أضف رسوم متحركة جديدة إلى TriggerAnimation.
- مرر فوق TriggerAnimation وانقر على زر ⊕.
- من القائمة السياقية، أدخل Animation.
حدد كائن الرسوم المتحركة الجديد، ثم في نافذة Properties، اضبط AnimationID على معرف أصول الرسوم المتحركة الذي تريد تشغيله عندما يلمس اللاعبون الحجم. على سبيل المثال، يشير نموذج محطة الفضاء الخطرة إلى rbxassetid://3716468774 لتشغيل رسوم متحركة لشخصية تسقط إلى الوراء.
اختبر لعبتك للتأكد من أن الرسوم المتحركة الخاصة بك تُشغل عندما يكون اللاعبون بالقرب من أول تسرب بخار.