Unity Engine - Foundation to Mastery
من أول سطر بلغة C# إلى شهادة Unity المعتمدة
107 درس·486 دقيقة·153.60 دولار
مسارات في التصميم والألعاب والسينما — اختر مسارك وابدأ اليوم
من أول سطر بلغة C# إلى شهادة Unity المعتمدة
107 درس·486 دقيقة·153.60 دولار
ثلاثة تخصّصات في مسار واحد: النمذجة والنحت والبيئات
50 درس·279 دقيقة·108.61 دولار
مهما كانت فكرة لعبتك — ستبنيها وتُطلقها من الصفر
61 درس·296 دقيقة·193.94 دولار
تعلّم من فنّان بيئات في مستوى AAA: أطقم البناء المعيارية وأوراق الـ Trim
يبدأ 16 سبتمبر·231.18 دولار
من الفكرة إلى فلم قصير كامل — بالتعاون مع Higgsfield
يبدأ 16 سبتمبر·77.58 دولار
أعمال ونقاشات اختارها الفريق، وما تفاعل معه الزملاء هذا الأسبوعين
لا مختارات بعد — أول مشروع تنشره قد يكون هنا
حين تكبّر جسماً بالضغط على S فأنت لا تغيّر الشبكة، بل تسجّل رقماً على الكائن يقول «اعرض هذا بضعف حجمه». بلندر يحترم الرقم، والمحرّك أحياناً لا يفعل.…
حين تكبّر جسماً بالضغط على S فأنت لا تغيّر الشبكة، بل تسجّل رقماً على الكائن يقول «اعرض هذا بضعف حجمه». بلندر يحترم الرقم، والمحرّك أحياناً لا يفعل. النتيجة المألوفة: نموذج يظهر سليماً في بلندر ثم يصل إلى Unity أو Unreal بحجم مضاعف، أو بمصادم فيزيائي لا يطابق ما تراه العين.
والأثر يسبق التصدير أيضاً. Bevel يقيس العرض بوحدات الكائن، فمقياس غير منتظم مثل (1, 1, 0.4) يعطي حافة سميكة على محور ورفيعة على آخر، وكذلك يفعل Solidify ومحاكاة الأقمشة.
العادة: قبل التصدير، وقبل أي مُعدِّل يعتمد على المسافات، اختر الكائن واضغط Object ▸ Apply ▸ Scale أو Ctrl+A ▸ Scale. تحقّق بعدها من لوحة العناصر بـ N — يجب أن يقرأ المقياس 1.0 على المحاور الثلاثة.
المرجع في Unreal لا يمرّ بحالتين بل بثلاث: فارغ، وسليم، ومُدمَّر لكن ما زال هناك من يمسك به. المقارنة != None تفرّق بين الأولى والثانية فقط، فيمرّ…
المرجع في Unreal لا يمرّ بحالتين بل بثلاث: فارغ، وسليم، ومُدمَّر لكن ما زال هناك من يمسك به. المقارنة != None تفرّق بين الأولى والثانية فقط، فيمرّ الفرع الخاطئ على عدوّ استُدعي عليه Destroy Actor قبل لحظة، ويأتيك الانهيار من داخل الدالة التالية لا من مكان الخطأ.
عقدة IsValid تتحقق من الحالتين معاً، وهي عقدة واحدة بمخرَجين تغني عن الفرع اليدوي كله. في C++ الأمر نفسه: if (IsValid(Target)) وليس if (Target != nullptr).
العادة التي تستحق التثبيت: أي مرجع خزّنته في متغيّر عبر إطارات — الهدف الحالي، آخر نقطة حفظ، المركبة التي كنت تقودها — يُفحص بـ IsValid عند كل استعمال، لا عند الإسناد. اللحظة التي أسندت فيها المرجع لا تقول شيئاً عن اللحظة التي تقرأه فيها.
أرقام الـ Profiler داخل المحرّر ليست أرقام لعبتك. المحرّر يشغّل حلقته الخاصة، ويحمّل الأصول بصيغ غير مضغوطة، ويخصّص ذاكرة لأدواته هو، فتظهر في الرسم…
أرقام الـ Profiler داخل المحرّر ليست أرقام لعبتك. المحرّر يشغّل حلقته الخاصة، ويحمّل الأصول بصيغ غير مضغوطة، ويخصّص ذاكرة لأدواته هو، فتظهر في الرسم البياني قمم تختفي تماماً في البناء النهائي — وتضيع ليلة كاملة في مطاردة تكلفة لا وجود لها.
الطريقة الصحيحة: File ▸ Build Settings، فعّل Development Build وAutoconnect Profiler، وابنِ إلى الجهاز الذي ستُلعب عليه اللعبة فعلاً، ثم اربط الـ Profiler بالبناء العامل.
وقبل قراءة أي رقم، افتح عمود GC Alloc ورتّب حسبه. التخصيص المتكرّر في كل إطار — سلسلة نصّية تُبنى داخل Update، أو Physics.RaycastAll تعيد مصفوفة جديدة — لا يظهر كبطء لحظي بل كتوقّف مفاجئ كل بضع ثوانٍ حين يمرّ جامع القمامة. وهذا التوقّف هو ما يشتكي منه اللاعب، لا متوسّط الإطارات.
افتراضياً، كل ملف .cs في مشروعك يقع في تجميعة واحدة ضخمة اسمها Assembly-CSharp. أي تعديل على أي سطر يعيد ترجمة كل شيء، ومع نمو المشروع يتحوّل تغيير…
افتراضياً، كل ملف .cs في مشروعك يقع في تجميعة واحدة ضخمة اسمها Assembly-CSharp. أي تعديل على أي سطر يعيد ترجمة كل شيء، ومع نمو المشروع يتحوّل تغيير رقم واحد إلى انتظار عشرين ثانية قبل أن تعود إلى وضع التشغيل.
الحلّ: Assets ▸ Create ▸ Assembly Definition داخل كل مجلّد نظام رئيسي — الحركة، والواجهة، والحفظ، والذكاء الاصطناعي — ثم اربط الاعتماديات صراحة في حقل Assembly Definition References. بعدها، تعديل في الواجهة يترجم الواجهة وحدها.
وهناك فائدة أهمّ من السرعة. الروابط التي تضطرّ لتصريحها تجعل الاعتماديات مرئية: إن اكتشفت أن نظام الحركة يحتاج مرجعاً إلى تجميعة القائمة الرئيسية، فقد كشف المُترجم للتوّ خطأً معمارياً كان مختبئاً خلف using عابر. ابدأ بحدّين أو ثلاثة لا بعشرة — التقسيم الزائد يصنع مشكلة مراجع بدل مشكلة انتظار.
عقدة Cast To مريحة، لكنها تفعل شيئين لا تراهما. أولاً تنشئ مرجعاً صريحاً (hard reference) إلى الصنف الذي تحوّل إليه، فيُحمَّل ذلك الصنف — ومعه كل ما…
عقدة Cast To مريحة، لكنها تفعل شيئين لا تراهما. أولاً تنشئ مرجعاً صريحاً (hard reference) إلى الصنف الذي تحوّل إليه، فيُحمَّل ذلك الصنف — ومعه كل ما يشير إليه من مواد ونماذج وأصوات — في اللحظة التي يُحمَّل فيها الـ Blueprint الذي يحتوي العقدة. باب واحد يحوّل إلى BP_PlayerCharacter يكفي ليجرّ الشخصية كاملة إلى ذاكرة القائمة الرئيسية.
وثانياً، النتيجة تفشل بصمت مع أي صنف آخر. تكتب باباً يُفتح للاعب، ثم يأتي الذكاء الاصطناعي أو النسخة القابلة للتدمير من الشخصية فلا يحدث شيء، ولا رسالة خطأ في أي مكان.
البديل: Content Browser ▸ Blueprints ▸ Blueprint Interface. عرّف دالة مثل Interact أو CanOpenDoor، ثم في الباب استدعِ الرسالة على الفاعل مباشرة بدل التحويل. من ينفّذ الواجهة يستجيب، ومن لا ينفّذها يتجاهلها. الباب لا يعرف شيئاً عن اللاعب، وحجم مستواك في الذاكرة يبقى حجم مستواك.
مكدّس المُعدِّلات يُنفَّذ من الأعلى إلى الأسفل، ونتيجة كل واحد هي مُدخَل الذي يليه. لذلك Mirror فوق Subdivision Surface وBevel ليست تفضيلاً بل قاعدة:…
مكدّس المُعدِّلات يُنفَّذ من الأعلى إلى الأسفل، ونتيجة كل واحد هي مُدخَل الذي يليه. لذلك Mirror فوق Subdivision Surface وBevel ليست تفضيلاً بل قاعدة: إن نزل المرآة تحت التنعيم فأنت تنعّم نصفاً ثم تعكسه، فتنطبع خياطة واضحة في منتصف النموذج مهما دقّقت في الرؤوس.
الترتيب الذي يعمل في أغلب النماذج الصلبة: Mirror ▸ Bevel ▸ Subdivision Surface، مع تفعيل Clipping في المرآة لتلتحم الرؤوس عند المستوى بدل أن تعبره.
المكان: Properties ▸ Modifier Properties (أيقونة المفتاح) ▸ Add Modifier، والسحب من النقاط الست أو Ctrl+Page Up لتحريك مُعدِّل في المكدّس. وقبل أي Bevel: طبّق المقياس بـ Ctrl+A ▸ Scale، وإلا خرج عرض الحافة مختلفاً على كل محور.