باختصار
- تتيح استدعاءات Movie Render Graph تشغيل منطق مخصص قبل بدء مهمة render أو لقطة وبعد اكتمالها.
- يُنشأ صنف الاستدعاء بالاشتقاق من MovieGraphScriptBase وتجاوز الوظائف المعنية.
- يمكن تفعيل خيار Flush Disk Writes Per Shot في Global Output Settings Node لاستخدام استدعاءات على مستوى اللقطة.
- لإتاحة صنف الاستدعاء عند كل تشغيل لـ Unreal Editor، يمكن استيراد صنف Python المعني من ملف init_unreal.py.
يوفر Movie Render Graph (MRG) في Unreal Engine 5.4 نظام استدعاءات لتنفيذ عمليات إضافية قبل مهام render وبعدها. ووفقًا للوثائق الرسمية من Epic Games، يمكن إعداد هذه العمليات عبر Execute Script Node المضاف إلى الرسم البياني. يتناول هذا الدليل خطوات الإعداد الأساسية للفرق التي ترغب في تنفيذ أعمال تحضيرية عند بدء render، أو فحص بيانات المخرجات عند اكتمال المهمة، أو إجراء عمليات على مستوى اللقطة.
متى تكون الاستدعاءات مفيدة؟
الاستدعاء هو كود مخصص يُنفّذ في نقطة محددة من تدفق render. يمكن استخدام استدعاءات المهام عند بدء المهمة وانتهائها، واستدعاءات اللقطات عند بدء كل لقطة وانتهائها. فعلى سبيل المثال، يمكن فحص بيانات المخرجات بعد اكتمال المهمة، أو التعامل مع مسارات الملفات الخاصة بلقطة معينة عند انتهائها.
يتيح Execute Script Node في MRG إضافة الاستدعاءات إلى إعداد الرسم البياني. ويُشتق صنف الاستدعاء من MovieGraphScriptBase في واجهة Python API الخاصة بـ Unreal. ويتم تجاوز الوظائف المعنية باستخدام @unreal.ufunction(override=True). بعد تسجيل صنف الاستدعاء، يصبح متاحًا للاستخدام من قائمة الاختيار في Execute Script Node.
1. إعداد إضافة Movie Render Queue والرسم البياني
أولًا، انتقل في Unreal Editor إلى Edit > Plugins، وفعّل إضافة Movie Render Queue ضمن قسم Rendering، ثم أعد تشغيل المحرر. ويجب أن يحتوي المشروع على Level Sequence مطلوب لتنفيذ render له.
يمكن الوصول إلى Movie Render Graph عبر Movie Render Queue. وتسير الخطوات الواردة في وثائق Epic على النحو الآتي:
افتح نافذة Movie Render Queue عبر
Window > Cinematics > Movie Render Queue.اضغط زر render واختر Level Sequence المعني.
من قائمة
Unsaved Configفي عمود Settings، افتح الخيارMovie Render Graph (Beta).أنشئ Movie Render Graph من قسم
Create New Asset، وامنحه اسمًا ثم احفظه.افتح إعداد الرسم البياني الذي أنشأته من عمود Settings، ثم عدّله.
يمكن استخدام Movie Render Queue (MRQ) وMovie Render Graph معًا ضمن سير العمل الحالي. يوفر MRQ واجهة لوضع المهام في قائمة انتظار وتنفيذ render جماعي، بينما يتيح MRG إعداد عمليات render عبر رسم بياني قائم على العُقد.
2. إنشاء صنف استدعاء Python
يوضح المثال التالي استدعاءَي بدء المهمة وانتهائها. يُنفّذ on_job_finished عند اكتمال مهمة render؛ ويمكن استخدامه عند الإلغاء أيضًا، وليس عند الاكتمال الناجح فحسب. ويمكن التحقق من نجاح المهمة عبر السمة success في معلومات النتيجة.
import unreal
@unreal.uclass()
class CallbackOverrides(unreal.MovieGraphScriptBase):
@unreal.ufunction(override=True)
def on_job_start(self, in_job_copy):
super().on_job_start(in_job_copy)
unreal.log("Render işi başlıyor")
@unreal.ufunction(override=True)
def on_job_finished(self, in_job_copy, in_output_data):
super().on_job_finished(in_job_copy, in_output_data)
unreal.log("Render işi tamamlandı veya iptal edildi")في هذا المثال، يُنشأ سجل عند بدء المهمة وانتهائها. ومن المهم تحديد مرحلة تنفيذ الاستدعاء والبيانات التي يتلقاها قبل إضافة منطق المعالجة الخاص بك. تُمرر إعدادات المهمة والرسم البياني إلى الاستدعاء على هيئة نسخ؛ لذلك لا تؤدي التغييرات التي تُجرى داخل الاستدعاء إلى تعديل الأصل الموجود في قائمة الانتظار مباشرةً.
يجب تسجيل الصنف ليظهر في قائمة Execute Script Node. وفي مثال Epic، يُسجل الصنف للجلسة الحالية. أما من يريد إتاحته عند كل تشغيل، فيمكنه استيراد الصنف من أحد ملفات /Content/Python/init_unreal.py. وهذا يتيح تحميل الصنف عند بدء المحرر.
3. الاختيار بين استدعاءات المهمة واللقطة
يُنفّذ on_job_start عند بدء مهمة render واحدة، بينما يُنفّذ on_job_finished عند انتهائها. إذا كان Level Sequence يتضمن عدة لقطات، فيمكن استخدام on_shot_start وon_shot_finished لكل لقطة على حدة. يُنفّذ استدعاء بدء اللقطة قبل إعدادها، بينما تُمرر بيانات مخرجات اللقطة إلى استدعاء انتهائها.
ثمة طريقتان لتفعيل الاستدعاءات على مستوى اللقطة: تحديد الخيار Flush Disk Writes Per Shot في Global Output Settings Node ضمن الرسم البياني، أو تجاوز الوظيفة is_per_shot_callback_needed في الصنف وإرجاع True. لا تفعّل هذا الخيار بلا حاجة؛ إذ تشير Epic إلى أن الإعداد قد يزيد مدة render بسبب انتظار كتابة الملفات على القرص.
ما الذي يتيحه ذلك لسير عمل العمارة والتصور المعماري؟
يمكن لفرق التصور التي تضع عدة لقطات أو مشاهد في قائمة انتظار ربط العمليات المتكررة بتدفق render عبر استدعاءات على مستوى المهمة واللقطة. كما يتيح الوصول إلى بيانات المخرجات ومسارات الملفات عند اكتمال المهمة وضع أساس لتوجيه الملفات الناتجة عن اللقطات إلى خطوة معالجة لاحقة، مثلًا. لكن الوثائق لا تحدد معيارًا معينًا لتسمية الملفات ولا تصف أتمتة جاهزة للتصور المعماري؛ لذا ينبغي تطوير هذا المنطق بما يتناسب مع المشروع.
إذا كان الهدف هو التكامل مع render farm أو عملية أخرى، فمن المهم أيضًا مراعاة خيارات render المحلية وخيارات render في عملية منفصلة ضمن MRQ. ويتطلب render في عملية منفصلة حفظ تغييرات المشروع. تحقّق من الاستدعاءات في مهمة اختبار صغيرة قبل اعتماد إعدادات التسليم الفعلية، ولا سيما من تأثير خيار الكتابة إلى القرص على مستوى اللقطة في المدة، ومن تحميل الصنف عند بدء المحرر.
أخطاء شائعة
إغفال إعادة تشغيل المحرر بعد تفعيل إضافة Movie Render Queue.
افتراض أن استدعاءات اللقطات ستعمل تلقائيًا؛ إذ يجب تفعيل متطلب الكتابة إلى القرص لكل لقطة على نحو منفصل.
اعتبار انتهاء المهمة مرادفًا لنجاح render فقط. فقد يُستدعى callback عند الإلغاء أيضًا؛ لذا تحقّق من حالة النجاح.
الاعتقاد بأن التغييرات التي تُجرى على نسخة المهمة أو إعداد الرسم البياني داخل الاستدعاء ستحدّث الأصل الموجود في قائمة الانتظار.
إغفال أن انتظار كتابة الملفات بعد كل لقطة قد يطيل مدة render.
المصادر
2 مصادرلا نعيد نشر نصوص المصادر؛ الاقتباسات القصيرة مشار إليها، وما تبقى ملخص وتعليق من إعدادنا.
بالنسبة إلى مكاتب العمارة والتصور في تركيا، تكمن القيمة الأساسية للاستدعاءات في إمكانية تنظيم عمليات التحقق المتكررة بعد render أو العمليات الخاصة بكل لقطة ضمن سير عمل أكثر انتظامًا. وفي العروض التي تتضمن لقطات عديدة على وجه الخصوص، يوفر الوصول إلى بيانات المهمة ومسارات الملفات نقطة انطلاق مفيدة لتطوير أتمتة مخصصة.
مع ذلك، لا تشكل هذه الميزة بمفردها حلًا جاهزًا لـ render farm؛ إذ يلزم إعداد صنف Python واختباره بما يتناسب مع بنية المشروع. وقد يؤثر انتظار الكتابة إلى القرص لكل لقطة في المدة. ينبغي للمكاتب التحقق من الاستدعاءات في مهمة صغيرة قبل التسليم، وألا تنسى حفظ تغييرات المشروع عند استخدام render في عملية منفصلة.
الأسئلة الشائعة
ما فائدة استدعاءات Movie Render Graph؟
تتيح تشغيل كود مخصص قبل بدء مهمة render أو لقطة وبعد انتهائها. ويمكن إعداد الاستدعاءات على مستوى المهمة أو اللقطة عبر Execute Script Node في الرسم البياني.
كيف يمكن تفعيل استدعاءات اللقطات في Unreal Engine؟
يمكن تحديد الخيار `Flush Disk Writes Per Shot` في Global Output Settings Node. وبدلًا من ذلك، يمكن تجاوز الوظيفة `is_per_shot_callback_needed` في صنف الاستدعاء وإرجاع `True`.
كيف يمكن إتاحة صنف الاستدعاء عند كل تشغيل للمحرر؟
يمكن استيراد الصنف من أحد ملفات `/Content/Python/init_unreal.py`، ما يضمن تحميله عند بدء المحرر.



