دليل المبتدئين النهائي لتطوير اللعبة في الوحدة

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

أولاً ، قليلاً عني: أنا مطور وحدة هاوٍ ومصمم نماذج ثلاثية الأبعاد ومصمم رسومات وعمل مع Unity and Blender لأكثر من 5 سنوات. أنا الآن طالبة في الرياضيات المالية في University College Dublin ، وأحيانًا أقوم بتصميم الجرافيك المستقل ونماذج الويب والنماذج الأولية للألعاب.

المقدمة

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

لماذا الوحدة؟

إذا كنت تريد صنع الألعاب

هناك عدد قليل جدًا من الخيارات عندما يتعلق الأمر بتطوير الألعاب المستقلة. الخيارات الثلاثة الرئيسية إذا كنت ترغب في إنشاء ألعاب هي Unreal أو Unity أو GameMaker.

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

هناك الكثير من الألعاب الناجحة للغاية مثل Escape from Tarkov (FPS) و Monument Valley (Puzzler) و This War of Mine (الإستراتيجية / البقاء على قيد الحياة) كلها مبنية في Unity.

في الواقع ، ربما لا يكون المحرك الذي تبني عليه لعبتك الأولى أمرًا بالغ الأهمية ، لذا نصيحتي هي اختيار واحدة والاستفادة منها.

إذا كنت ترغب في وضع نموذج أولي لتجارب المستخدم

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

تتمتع Unity بدعم كامل لـ VR و AR ، وبالتالي يمكن أن تكون أداة رائعة لاستكشاف الهندسة المعمارية والأتمتة والمحاكاة مع العملاء.

أقسام لهذه المقالة

  • لماذا الوحدة؟
  • نافذة محرر الوحدة
  • كائنات لعبة الوحدة
  • مكونات الوحدة المدمجة
  • إنشاء مكونات مخصصة
  • هيكل السلوك الأحادي
  • معالجة GameObjects
  • صب راي
  • كشف الاصطدام
  • الخيارات المتقدمة
  • نصيحة للوافدين الجدد
  • موارد ومجتمعات لطيفة
  • استنتاج

نافذة محرر الوحدة

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

عرض المشهد: يسمح بوضع وحركة كائنات GameObject في عرض لعبة المشهد : يعاين كيف سيرى اللاعب المشهد من مفتش الكاميرا : قدم تفاصيل عن كائن GameObject المحدد في المشهد. الأصول / المشروع: يتم تخزين جميع المباني الجاهزة والأنسجة والنماذج والبرامج النصية وما إلى ذلك هنا التسلسل الهرمي: يتيح تداخل وهيكلة كائنات GameObject داخل المشهد

الآن نحن على ما يرام للبدء!

كائنات لعبة الوحدة

ما هي GameObjects

GameObjects هي لبنة البناء الأساسية لكل شيء في محرك ألعاب الوحدة. يكاد الاسم يعطيه بعيدًا:

أي شيء تضعه داخل مشهد في الوحدة يجب أن يتم لفه في "كائن لعبة".

إذا كان لديك خلفية لتصميم الويب ، فيمكنك التفكير في GameObjects على أنها تشبه العناصر إلى حد كبير! حاويات مملة للغاية ، ولكنها قابلة للتوسيع بشكل كبير لإنشاء وظائف أو صور معقدة.

كل شيء حرفيًا بدءًا من تأثيرات الجسيمات والكاميرات واللاعبين وعناصر واجهة المستخدم ... (تطول القائمة) هو كائن GameObject.

خلق التسلسل الهرمي

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

المنطق الكامن وراء كائنات اللعبة المتداخلة هو نفسه تمامًا مثل تطوير الويب ، سأقدم بعض الأمثلة ...

الفوضى والكفاءة

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

التمركز

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

مكونات الوحدة المدمجة

نموذج مكون الفاعل

تعد GameObjects بمفردها عديمة الفائدة إلى حد كبير - كما رأينا أنها مجرد حاويات. من أجل إضافة وظائف لهم ، يتعين علينا إضافة مكونات ، وهي في الأساس نصوص مكتوبة بلغة C # أو Javascript.

تعمل الوحدة من نموذج مكون الممثل ، وببساطة ، فإن GameObjects هي الجهات الفاعلة والمكونات هي البرامج النصية الخاصة بك.

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

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

المكونات الرئيسية المدمجة

أعتقد أن الوقت قد حان لبعض الأمثلة على المكونات المضمنة التي يوفرها محرك Unity Games.

  • MeshFilter: يسمح لك بتعيين مواد لشبكة ثلاثية الأبعاد لكائن GameObject
  • MeshRender: يسمح لك بتعيين المواد إلى شبكة ثلاثية الأبعاد
  • [صندوق | مصادم] شبكي: يتيح اكتشاف كائن GameObject أثناء التصادمات
  • Rigidbody: يُمكّن المحاكاة الفيزيائية الواقعية للعمل على GameObjects مع شبكات ثلاثية الأبعاد وستطلق أحداث الكشف على مصادمات الصندوق
  • الضوء: يضيء أجزاء من المشهد الخاص بك
  • الكاميرا: تحدد إطار عرض المشغل المراد إرفاقه بكائن GameObject
  • مكونات لوحة واجهة المستخدم المختلفة لعرض واجهات المستخدم الرسومية

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

إنشاء مكونات مخصصة

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

لبدء إنشاء المكونات ، انتقل إلى GameObject المطلوب> إضافة مكون> اكتب اسم المكون الجديد الخاص بك في شريط البحث> برنامج نصي جديد (c #).

كتوصية عامة ، أنصح بعدم استخدام جافا سكريبت في الوحدة. لم يتم تحديثه مع جميع الأشياء الرائعة التي تأتي مع ES6 ، وتعتمد معظم الأشياء الأكثر تقدمًا على C # الأشياء التي تم نقلها إلى Javascript ... لقد أصبح مجرد عمل عملاق واحد في تجربتي.

هيكل السلوك الأحادي

المهام الرئيسية

ترث جميع المكونات من فئة السلوك الأحادي. وتتضمن عدة طرق قياسية أهمها:

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

متغيرات المفتش

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

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

يمكننا القيام بذلك بسهولة من خلال الإعلان عنها كمتغيرات عامة في جسم المكون.

قبول مدخلات المستخدم

بالطبع ، نريد أن تستجيب لعبتنا لمدخلات المستخدم. أكثر الطرق شيوعًا للقيام بذلك هي استخدام الطرق التالية في وظيفة Update () لمكون (أو في أي مكان آخر تريده):

  • Input.GetKey (KeyCode.W) إرجاع مفتاح True W قيد الضغط باستمرار
  • إرجاع Input.GetKeyDown (KeyCode.W) صحيح عند الضغط على مفتاح W لأول مرة
  • Input.GetAxis ("عمودي") ، Input.GetAxis ("أفقي") يعود بين -1،1 حركة إدخال الماوس

معالجة GameObjects

بمجرد حصولنا على مدخلات المستخدم ، نريد أن تستجيب GameObjects الموجودة في مشهدنا. هناك عدة أنواع من الردود قد نضعها في الاعتبار:

  • الترجمة ، الدوران ، المقياس
  • قم بإنشاء GameObjects جديدة
  • إرسال رسائل إلى كائنات / مكونات GameObjects الموجودة

التحولات

تحتوي جميع كائنات GameObjects على خاصية التحويل التي تتيح إجراء العديد من المعالجات المفيدة على كائن اللعبة الحالي.

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

بشكل عام ، من الممارسات الجيدة استخدام [الموضع ، التدوير] المحلي بدلاً من الموضع العالمي / التدوير للكائن. هذا عادة ما يجعل من السهل تحريك الكائنات بطريقة منطقية ، حيث سيتم توجيه محور الفضاء المحلي وتركيزه على الكائن الأصلي بدلاً من أصل العالم واتجاهات x و y و z.

إذا كنت بحاجة إلى التحويل بين الفضاء المحلي والعالمي (وهو ما يحدث غالبًا) ، يمكنك استخدام ما يلي:

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

إنشاء GameObjects جديدة

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

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

يخزن هذا بشكل أساسي قالبًا للكائن الذي كان لدينا للتو في مشهدنا بجميع التكوينات نفسها.

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

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

الوصول إلى كائنات ومكونات GameObjects الأخرى

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

اسم المكون comp = some_game_object.GetComponent () ،

بعد ذلك يمكنك الوصول إلى أي من الطرق / المتغيرات العامة للمكون من أجل معالجة كائن GameObject. هذا هو الجزء المباشر ، ولكن الحصول على الإشارة إلى كائن اللعبة يمكن أن يتم بعدة طرق ...

الوصول عن طريق المفتش متغير

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

الوصول عن طريق وضع العلامات

يمكننا وضع علامة على GameObjects أو Preababs عبر المفتش ثم استخدام وظائف كائن اللعبة لتحديد المراجع إليها.

يتم ذلك ببساطة على النحو التالي.

GameObject some_game_object = GameObject.FindGameObjectWithTag (“Brick”) ؛

الوصول عبر التحويل

إذا كنا نرغب في الوصول إلى مكونات في كائن أصلي يمكننا القيام بذلك بسهولة عبر سمة التحويل.

ComponentName comp = gameObject.transform.parent.GetComponent () ،

الوصول عبر SendMessage

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

gameObject.SendMessage (“MethodName”، params) ؛ // Broadcast messagegameObject.SendMessageUpwards (“MethodName”، params)؛ // تم استلامها فقط بواسطة المكونات المتداخلة أعلاه.

صب راي

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

هناك نوعان من السيناريوهين حيث يكون هذا مفيدًا (من المحتمل أن يكون هناك المزيد):

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

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

كشف الاصطدام

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

بمجرد الإعداد داخل أي مكون مخصص متصل بالكائن ، يمكننا استخدام أساليب OnCollisionEnter و OnCollisionStay و OnCollisionExit للاستجابة للتصادمات. بمجرد حصولنا على معلومات التصادم ، يمكننا جعل كائن GameObject مسؤولاً واستخدام ما تعلمناه سابقًا للتفاعل مع المكونات المرفقة به أيضًا.

شيء واحد يجب ملاحظته هو أن الأجسام الصلبة توفر فيزياء مثل الجاذبية للأجسام ، لذلك إذا كنت تريد إيقاف تشغيل هذا ، فستحتاج إلى التحقق من تشغيل is_kinematic .

الخيارات المتقدمة

لن ندخل في أي من هذا الآن ولكن ربما في مقال مستقبلي - فقط لإعلامك بوجودها.

إنشاء واجهات المستخدم الرسومية

تحتوي الوحدة على محرك واجهة مستخدم كامل لتخطيط واجهة المستخدم الرسومية للعبتك. بشكل عام ، تعمل هذه المكونات بشكل مشابه تمامًا لبقية المحرك.

تمديد محرر الوحدة

يمكّنك Unity من إضافة أزرار مخصصة إلى المفتشين بحيث يمكنك التأثير على العالم أثناء وضع التحرير. على سبيل المثال ، للمساعدة في بناء العالم ، يمكنك تطوير نافذة أداة مخصصة لبناء منازل معيارية.

حيوية

يحتوي Unity على نظام رسوم متحركة قائم على الرسم البياني يمكّنك من دمج الرسوم المتحركة والتحكم فيها على كائنات مختلفة مثل اللاعبين الذين ينفذون نظام الرسوم المتحركة القائم على العظام.

المواد و PBR

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

نصيحة للوافدين الجدد

إذا كنت تخطط لكتابة لعبتك الأولى ، فلا تقلل من شأن التعقيد والوقت الذي تستغرقه لكتابة حتى أبسط الألعاب. تذكر أن معظم الألعاب التي تظهر على Steam بها فرق تعمل عليها طوال سنوات بدوام كامل!

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

قبل أن تذهب وتكتب أي رمز لأي جزء من لعبتك ، اذهب وابحث عما فعله شخص آخر من قبل لحل المشكلة نفسها - من المحتمل أن يكون لديهم حل أكثر رشاقة.

موارد ومجتمعات لطيفة

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

مفهوم الفن

  • مدرسة فنغ زو ديزاين (أكثر من 90 ساعة من دروس فن المفهوم)
  • Tyler Edlin Art (مجتمع BST الفني العظيم مع تعليقات من المحترفين حول التحديات الشهرية)
  • مقهى الفن (مقابلات وورش عمل مع فناني المفهوم المشهورين)
  • ترينت كانيوجا (المصور والفنان ثنائي الأبعاد الذي يصنع أيضًا لعبته الخاصة)

النمذجة ثلاثية الأبعاد

  • CG Cookie (أفضل أساسيات نمذجة الشبكة في الخلاط على الإطلاق ، لديهم الكثير من المحتويات الممتازة الأخرى للخلاط)
  • Tor Frick (مصممي ومنحات الأسطح الصلبة في الخلاط)
  • Gleb Alexandrov (دروس التقديم القوية القصيرة في Blender)

تصميم لعبة

  • DoubleFine Amnesia Fortnight (GameDevs الذين ينظمون هاكاثون لمدة أسبوعين ويسجلون عملية التصميم بأكملها)
  • مجموعة أدوات GameMakers (لفحص مبادئ تصميم الألعاب)

برمجة

  • بطل صناعة يدوية (كتابة لعبة ومحرك من الصفر في C)
  • جوناثان بلو (Indie dev الذي يبث مباشرة تطوير لعبته)
  • Brackeys (دروس الوحدة لطيفة)

استنتاج

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

محفظة| ينكدين