يمكنك استيراد نماذج مخصصة لإنشاء كل شيء من الشخصيات غير القابلة للعب إلى قماش متحرك لزورق شراعي. لقد استخدمنا إعداد الاستيراد المخصص في Importer لجلب شخصيات مخصصة أكثر غموضًا، مثل مخلوقات الثقوب السوداء الغامضة والروبوتات الخدمية الودودة (إذا كانت غير مدركة).
تتناول الأقسام التالية كيفية استخدامنا لـ الربط والتعتيم و PBR (مظهر السطح) والإخراج المرئي لبناء واحدة من شخصياتنا الأكثر تعقيدًا التي أسميناها "المخلوق". أردنا أن يتوهج، ويصدر بعض الضوء، ولديه آثار من دخان الجسيمات، وحركة سلسة تتطلب ربط هيكل بقدر كافٍ من المفاصل لإنشاء موجات مقنعة من خيامه.

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


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

وجدنا أن الإرشادات التالية كانت مفيدة، بحيث يتم استيراد شبكة الشخصية بشكل صحيح إلى الوحدة:
- يجب أن تحتوي المفاصل والعظام الفردية على أسماء فريدة.
- يجب ألا تتطابق أسماء الشبكات مع أسماء المفاصل والعظام.
- يجب ألا تحتوي الشبكات على أي تحويلات قبل الربط؛ بمعنى آخر، يجب أن تكون التحويلات 0 وأن تكون المقياس 1.
- يجب أن تواجه مستعرضات الشبكة للخارج (يجب ألا يبدو النموذج داخلًا للخارج).
- يجب ألا تحتوي الهياكل العظمية على أي عامل مقياس؛ يجب أن تكون جميع المفاصل [1، 1، 1].
التعتيم
عندما أنتهينا من هيكل المخلوق، كانت الخطوة التالية هي ربط الشبكة. يمكن أن يكون الربط مهمة شاقة، لذا لتسهيل الأمور، من الأفضل أن تكون على دراية بالإعدادات الأولية المختلفة للربط في تطبيق DCC الخاص بك لتجد ما تحبه. نظرًا لأن هذه شخصية عضوية، فقد ربطناها بقدر كافٍ من التلاشي على كل مفصل وتداخل بينها. بهذه الطريقة، يكون الانحناء سلسًا وليس حادًا. تُظهر لقطات الشاشة التالية الربط السيئ والربط السلس على التوالي:


وجدنا أن الإرشادات التالية أثمرت أفضل النتائج للربط:
- يجب أن يكون هناك حد أقصى من 4 تأثيرات لكل رأس عند الربط (بمعنى أنها تؤثر على جزء من النموذج عند تحريكه).
- يجب أن تكون أسماء المفاصل والشبكات فريدة، داخل كل منهما وبين بعضهما البعض.
- يجب أن تحتوي أي مفصل تريد استيراده إلى الوحدة على بعض التأثيرات على ربط النموذج، وإلا فلن تستورده المحرك. كلما كان ذلك ممكنًا، قم بتوصيل نموذجك في وضعه الأصلي أو "وضع التوصيل".
استيراد الشبكة إلى الوحدة
استيراد شخصياتك المخصصة إلى الوحدة هو أحد أكثر الأجزاء إثارة في العملية، لأنه يمكنك رؤية إبداعاتك في التجربة التي تقوم ببنائها!
لإستيراد الشبكة إلى الوحدة:
قم بتصدير الشخصية من تطبيق DCC وتأكد من ما يلي:
- جميع المستعرضات والمقاييس والأسماء صحيحة.
- لدى الشخصية جميع مفاصل وهياكل العظام وكل الشبكات.
- يجب أن تكون جميع الشبكات أقل من 10,000 مثلث لكل جزء من الشبكة.
- يجب ألا يتجاوز الحجم الكلي للشبكة 2000 وحدة في أي محور.
- انظر متطلبات الشبكة للحصول على قائمة كاملة بمواصفات النموذج.

في Importer، استورد ملف .fbx أو .obj المخصص.

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

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

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

لاحظ أن SpotLights تضيف لمسة بصرية للمخلوق بالقرب من أسطح أخرى أو لاعب.

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

اجعل التأثيرات المرئية تتبع الشخصية
لا يتم تحديث مواضع شبكة الشخصية المربوطة عندما يتحرك المخلوق، لذا احتجنا إلى طريقة للتأكد من أن التأثيرات المرئية، والصوتية، والأضواء تتبع المخلوق بشكل صحيح. لتحقيق ذلك، قمنا بإنشاء برنامج نصي لوحدة التحكم في التأثيرات المرئية واستخدمنا CollectionService لإبلاغ الأجزاء التي تحتوي على التأثيرات المرئية وأين كانت عظام المخلوق لتتبعها.
قمنا بوضع LocalScript التالية في StarterPlayer → StarterPlayerScripts. هذا يعمل أساسًا على تنفيذ وظيفة تحديث التأثيرات المرئية.
سكريبت محلي-- أضف هذه الشيفرة إلى سكريبت محلي موجود يجعل اتصالات PreSimulationlocal RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)سكريبت وحدة-- هذه الوحدة تربط الأجزاء بالحركات حتى يتم تحديثها أثناء-- تشغيل الحركة. هذه وسيلة للالتفاف حول القيود الحالية-- المتعلقة بالمفاصل والعظام، وقد لا تكون ضرورية دائمًا.---- المتطلبات:-- لكي يتم تضمينها، يجب أن تحتوي النماذج على علامة "AnimatedVfxModel"، ومجلد-- يحتوي على جميع الأجزاء التي تريد مزامنتها مع الحركة. يجب أن يحتوي كل جزء على-- خاصية يسمى "AttachedBoneName" التي تشير إلى اسم العظمة التي تريد الاتصال بها. يجب أن تكون الأجزاء أيضًا في-- أوضاعها الصحيحة بالنسبة إلى العظمة المطلوبة.---- للاستخدام:-- يجب على سكريبت محلي طلب هذه الوحدة، ثم الاتصال-- VfxUpdateModule.updateVfx بحدث RunService.PreSimulation.local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- الإعداد - يجب أن يتم هذا مرة واحدة على كل عميل.-- جمع جميع النماذج ذات العلامةlocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- حيث سنخزن جميع الأجزاء والاتجاهات-- تعيين جدول لكل نموذج سيتضمن جميع أجزاء التأثيرات والاتجاهfor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- ابحث عن مجلد VFX-- ابحث عن العظمة عبر الخاصية واحسب الاتجاه لكل جزء.for _,part in vfxParts dolocal name = part:GetAttribute("AttachedBoneName")local bone = model:FindFirstChild(name, true)if bone thenlocal offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)vfxTable[model][part] = {bone, offset}elsewarn("جزء التأثير يشير إلى عظمة لم يتم العثور عليها.")endendendprint(vfxTable)-- التحديث - يجب ربط هذا بحدث RunService.PreSimulation لكل عميل-- المرور عبر جميع النماذج، ثم تحديث جميع الأجزاء في النموذج لتتوافق مع عظمة الكادر.function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleأنشأنا VFXUpdateModule ModuleScript لإبلاغ أي كائنات معلمة بشكل صحيح باستخدام AnimatedVfxModel بالتحديث عند حدث التشغيل.
قمنا بوسم مجموعات النماذج الضرورية بـ AnimatedVfxModel باستخدام قسم Tags من خصائصها. يسمح استخدام العلامات لـ VFXUpdateModule بمعرفة أي كائن يبحث عنه كأول طفل للتأثيرات المرئية ويطبق التحديث.

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

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




بالنسبة للمناطق التي تحتاج إلى التألق أو الإضاءة الذاتية، مثل "الخيام الممسكة"، استخدمنا أيضًا الشفافية على SurfaceAppearance لتمتزج مع تلك الأجزاء.

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

إذا كنت تستخدم تطبيق DCC خارجي للتحريك، وجدنا أن الإرشادات التالية تعمل بشكل أفضل:
- اضبط معدل الإطارات على 30 إطارًا في الثانية على الأقل.
- أنشئ التحريكات باستخدام نفس الشخصية التي تطبق عليها.
- قم بتصدير بيانات التحريك كملف .fbx منفصل.
نظرًا لأننا قمنا بتحريك الشخصية خارج الوحدة، احتجنا إلى استخدام محرر التحريك لاستيراد ملف التحريك .fbx. يتيح لك المحرر اختيار أي شخصيات بها مفاصل أو محركات وتحريكها عبر نقاط في الجدول الزمني.
لإستيراد حركة:
في علامة التبويب Avatar في شريط الأدوات، انقر فوق محرر المقاطع.
اختر الشخصية المتصلة التي تريد تحريكها في Roblox. يجب أن تكون الشخصية هي نفسها التي تقوم بربطها في تطبيق DCC الخارجي.
انقر فوق الزر ⋯ في القسم العلوي الأيسر من نافذة المحرر، وحدد استيراد من تحريك FBX، وحدد موقع ملف التحريك المُصدَّر .fbx الخاص بك.

عندما تكون راضيًا عن حركتك، يمكنك تصديرها لاكتشاف معرف التحريك، الذي يمكنك استخدامه بعد ذلك في نصوص Roblox لتشغيلها. على سبيل المثال، يمكنك إضافة Script إلى مجموعة النموذج الخاصة بالشخصية المستوردة واستخدام الشيفرة التالية لتشغيل الحركة:
local animationId = "YOUR_ANIMATION_ID"local char = script.Parentlocal animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")local animation = Instance.new("Animation")animation.AnimationId = "rbxassetid://" .. tostring(animationId)local animTrack = animController:LoadAnimation(animation)animTrack:Play(0, 1, 1)
النتائج النهائية
بعد إجراء بعض التعديلات النهائية على الألوان، وإضاءة الضوء، وبعض المؤثرات الجسيمات لإعطاء تأثير هالة أقوى أمام النوافذ، إليك النتيجة النهائية في محطة الفضاء!
