post

ميزات 2019.3 Unity – الجزء الثاني

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

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

أدوات جديدة للمطورين

1 . تحسين عملية الـ Serialization

يبدو تبسيط البيانات واضحاً بعدما قدمت الشركة طرق جديدة في ال Serialization ، وبشرح بسيط فعلمية ال Serialization هي تحويل ال Objects إلى قيم أو نصوص يمكن تخزينها على القرص الصلب أو قواعد البيانات أو الذاكرة، فسابقاً كان يتم إضافة وسم [Serializable] لل Class وبالتالي كان المحرك يقوم بتحويله إلى قيم نوعية Value Type ، الآن أصبح بالإمكان إضافة وسم SerializeReference وبالتالي أصبح بالإمكان تحويل ال Classes إلى references ، هذا يعني أنه أصبح الآن بالإمكان ربط أكثر من كائن ببعض، الذي بدوره سيؤدي إلى تبسيط الكود لإدارة هيكلية بيانات معقدة مثل الـ graphs و الـ trees .

أيضاً تم إضافة مكتبة UnityYAML لتسريع عملية ال serialization خصوصاً في مرحلة تحميل المراحل. ويمكن تعريفها على أنها شيء مشابه لل JSON وهي طريقة تحويل ال Object إلى شيء يمكن كتابته على القرص الصلب أو الذاكرة.

2 . تسريع الدخول في Play Mode

قامت الشركة أيضاً بإضافة ميزة تجريبية قد توفر عليك ما يقارب 50% إلى 90% من وقت الإنتظار بعد أن تقوم بالضغط على زر Play لتجريب النتائج الجديدة الخالية من تعديلات الكود. فبواسطة خاصية Enter Play Mode التجريبية يمكنك تجاوز مرحلتين أساسيتين يقوم بهما المحرك. فسابقاً عندما تقوم بالضغط على زر Play كان المحرك يقوم بإعادة تهئية ال Codes بما يعرف بإسم Domain Reload كمرحلة أولى، وبإعادة تحميل المشهد Reload the scene كمرحلة ثانية، الآن بهذه الميزة التجريبية يمكنك بعد تفعيلها من إعدادات المشروع Project Settings تحت قائمة Editor بوضع علامة صح بجانب خيار Enter Play Mode ، يمكنك تقليل الوقت خصوصاً في المشاريع الضخمة.

3. تحسينات على الـ Profiler

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

أيضاً تم إضافة ميزة Deep Profiling Support في حال كانت النسخة لمنصة PC Standalone حيث يمكن تسجيل الوقت عند إستدعاء أي دالة c# Methods ، طبعاً هذا الخيار مفيد جداً في عملية تحسين اللعبة وال Testing مع مراعاة أن تفعيل هذا الخيار سيعطي بطئ للعبة كونها ستقوم بالتسجيل أيضاً.

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

4. تحسينات على طريقة كتابة DOTS

كما ذكرنا في الجزء الأول من الميزات أن DOTS إختصار لـ Data-Oriented Technology Stack ، وهي من أكثر الأمور التي قدمت للمطورين فرص لتحسين ألعابهم، ففي هذه النسخة قامت الشركة بتقليص عدد الأسطر البرمجية لتحقيق الميزات السابقة، حيث أصبحت تستخدم C# Job System بالإضافة إلى Backend Compiled إسمه Burst Compiler حيث يعتبر مترجم متدني المستوى Low Level Virtual Machine ويقوم بتحويل أسطر لغة الـ C# إلى أسطر محسنة بلغة الآلة Machine Code .

5. تحسينات على ال Physics

بالبداية قامت الشركة بتطوير النسخة المستخدمة من PhysX المحرك مفتوح المصدر المطور من شركة Nvidia الخاص بالحسابات الفيزيائية، حيث تم تطوير المكتبة من نسخة v3.4 إلى v4.1 ، ويمكن الرجوع إلى صفحة المحرك لمشاهدة الأمور الجديدة التي تم إضافتها، من أهمها هي تقديم Solver جديد لربط ال Joint الخاصة بتحريك المجسمات وجعلها أقل عرضة لعمليات ال Stretch بالتفاعل مع المجسمات المحيطة، وتطوير خوارزمية سابقة لتصبح أكثر فاعلية في توليد المجسمات في وقت اللعب لتأخذ وقت وكلفة قليلة من مواصفات الجهاز، بالإضافة لأمور أخرى.

على صعيد آخر قامت شركة Unity بتقديم المحرك الفيزيائي الشهير Havok بنسخة متقدمة مبنية على تقنية ال DOTS حيث تعاونت الشركة المنتجة مع شركة Unity لإصدار هذه النسخة الحصرية، فهي متاحة فقط من خلال ال Package Manager وتحتوي على 3 باقات إحداها مجانية والباقي يأتي من ضمن ال subscription plans الخاصة لمحرك اليونيتي، ويجدر بالذكر أن محرك Havok مبني على native C++ حيث أنه يقدم نتائج سريعة ودقيقة لمن يهتمون بالدرجة الأولى بالفيزيائية في ألعابهم، وهي مناسبة جداً لأجهزة ال Consoles والموبايل.

أدوات المرئيات Graphics

1. نمط الإظهار المتقدم HDRP

إن كنت تطمح للإستفادة القصوى من المرئيات والإظهار المتقدم فعليك إختيار HDRP المختصر من High Definition Render Pipeline حيث أنه في هذه النسخة أصبح Verified بعدما كان تجريبي Preview ، فهو يقدم الجودة العالية للإظهار Rendering ، ويمكنك مشاهدة الفيلم الدعائي القصير المنتج من الشركة بعنوان ( The Heretic ) ، ففي نسخة 2019.3 أضافو إمكانية كتابة معالجة للصورة النهائية خاص بك بواسطة Custom Post-Processing ، بالإضافة إلى ميزة Physically Based Sky ، حيث أصبح بالإمكان الآن محاكاة الشمس والسماء الحقيقية بناءاً على الوقت، مما يتيح لك إلتقاط مشاهد نهارية أو ليلية جميلة.

أيضاً الآن بالإمكان تشغيل تقنية الواقع الإفتراضي VR مع الإظهار المتقدم HDRP للحصول على أقصى جودة تحاكي المشاهد الحقيقية، ويجب التنويه أن الإظهار المتقدم HDRP يستنزف موارد الجهاز لذلك ينصح بإستخدامه فقط مع الأجهزة المتطورة جداً high-end hardware.

ومن ضمن الميزات التجريبية الجديدة المضافة إلى HDRP ميزة real-time ray tracing features ، التي تعطي نتائج واقعية للضوء ولفيزيائية الضوء، فهي تقوم بحسابات الإنعكاس والظلال والإنكسار بالإعتماد على نوع المادة الساقط عليها الضوء، وهي تقدم أكثر ميزتين مطلوبتين وهما الـ global illumination والـ ambient occlusion بالإضافة للميزات الأخرى التي تحول الصور إلى حقيقة. التي كانت ولا تزال تحتاج إلى وقت تصيير طويل Long Time Render وإلى مواصفات جهاز عالية جداً، كما المصيرات Renderer المشهورة مثل ال Vray وغيرها.

2. نمط الإظهار المتوسط URP

نمط الإظهار المتوسط الـ Universal Render Pipeline أو ما كان يعرف سابقاً بالـ LWRP المختصر من Lightweight Render Pipeline هو نسخة مبسطة من نمط HDRP وهو أفضل من النمط التقليدي Default Render Pipeline ، حيث يأتي هذا النمط حالياً بشكل forward renderer حيث يقوم بحساب جميع الإضاءة في طبقة واحدة، وهو يدعم أنواع جديدة من الإضاءة في حال تم إستخدام 2D Renderer كما وضحنا في الجزء الأول من الميزات، وتم زيادة عدد الأضواء المسموح بها بهذا النمط إلى 256 ضوء في حال كان التطوير لغير الموبايل، أما الموبايل فتم زيادته أيضاً وهو يدعم 32 ضوء ، وهناك نسخة deferred renderer قادمة قريباً إليه.

المؤثرات البصرية Post-processing الآن تم تضمينها داخل النمط بعدما كان يتم إضافتها بشكل منفصل، حيث بإمكانك الحصول على تأثير تنعيم الأطراف ومانع التكسير anti-aliasing ، وتأثير التركيز بعمق depth of field ، وتأثير camera motion blur ، و Panini projection ، و bloom ، و lens distortion ، و chromatic aberration ، و color grading ، و tone mapping ، و vignette ، و film grain ، 8-bit dithering .

3. أداة Shader Graph

قبل الحديث عن أداة Shader Graph يمكننا التحدث أولاً عن أداة Visual Effect Graph، حيث يمكنك بشكل بصري أن تقوم بصنع نظام جزئيات Particle System معقد ومن صنع تأثيرات على مستوى الشاشة Post Processing أو حتى تأثيرات على واجهات اللعبة UI ، الضباب والمجسمات المضيئة وغيرها من التأثيرات التي تعطي إظهار أفضل Visual Effects كلها يمكن عملها داخل هذا المحرر. وفي هذه النسخة أصبحت هذه الأداة Verified بعدما كانت تجريبية Preview وهي تعمل الآن فقط مع النمط HDRP. ويمكنها التعامل مع أداة Shader Graph كما سنوضح الآن .

أما بالنسبة لأداة الـ Shader Graph ، فإنها ولا تزل مركز للتطوير كونها تفتح أفاق جديدة للمطورين ليقومو ببناء Custom Shader لكي يضعوه على المجسمات في داخل البرنامج، فقد قامو بإضافة vertex skinning لـ DOTS animation ، وأصبح هناك إمكانية لعمل العديد من النسخ static branches بعدما قامو بإضافة الـ Shader keywords ، أيضاً أصبح هناك إمكانية لعمل جمل ملاحظات Sticky notes داخل الـ Shader Graph للتوضيح لتساعد كل من يعمل معك في المشروع على فهم ما قمت بعمله.

4. تحسينات على أدوات الإضاءة

قامت الشركة أيضاً بعمل تحسينات على بعض الأدوات الخاصة بحسابات الإضاءة والظلال، فأصبح الآن بإمكانك دمج نفس الـ Light Probe بأكثر من مشهد الذين يعملون بطريقة المشاهد الترابطية additively loaded Scenes ، هذا يتيح للمطور تقسيم المرحلة الكبيرة إلى مشاهد Scenes صغيرة مترابطة مما يعطي فعالية أكبر للعبة، فبعد دمجهم وتحميل المراحل الصغيرة الجديدة يمكنك الحصول على نفس الحسابات السابقة بطريقة سلسة وبنتائج تعطي واقعية عالية، وتم تحسين حسابات الإضاءة فيها وتفادي بعض النتائج المزعجة سابقاً التي كانت تؤدي إلى ظهور Noise في المجسمات بسبب العدد الكبير للإضاءة.

على صعيد آخر، قامت الشركة بتحسين أداء حسابات الـ Progressive Lightmapper ، فحالياً هناك نوعين يمكنك بواسطتهما حساب خرائط الضوء Lightmap إما بالمعالج CPU أو بكرت الشاشة GPU ، فسابقاً كان التعامل مع ال Editor أثناء هذه الحسابات يعطي عدم أريحية للمطور حيث أنه يلاحظ وجود تقطيع كبير وقلة إستجابة بسبب العمل المستمر على حسابات الضوء، الآن أصبح الأمر أكثر إستقرارية وقابلية للتنقل والتعامل حتى أثناء الحسابات، بالإضافة إلى ميزات أخرى كلها تعمل بشكل أساسي على تقليل الوقت المستغرق وإعطاء نتائج مرضية والتقليل من الـ Noise الناتج أثناء عملية الحسابات.

واجهة المحرر، وأدوات العمل الجماعي

1. واجهة رسومية جديدة

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

وعلى غرار أغلب البرامج الكبيرة، تم الآن إضافة ميزة البحث السريع Quick Search من خلال الضغط على زر Alt + ` (حرف الذال ) والبحث مباشرة عن أي شيء داخل أو خارج المحرك، وهذا من هدفه تسريع عملية التطوير من خلال الإختيار السريع لما يحتاجه المطور أو المصمم.

2. محرر واجهات UI Builder

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

هناك أيضاً العديد من الأدوات التي قامت الشركة بتطويرها، فقامت الشركة بتحسين أداة ال Package manager نفسها، بدعمها لـ Git repository من خلال رابط، فضلاً عن إمكانية رؤية ال Assets التي قمت بشراءها أو تنزيلها مباشرة منه،

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

المنصات Platforms

1. نظام الإدخال Input System

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

أيضاً بهذه النسخة أصبحت أداة Incremental Garbage Collector مستقرة Verified ، الأداة المسؤولة عن إدارة الذاكرة وإزالة أي مجسمات لا حاجة للعبة بها، وأخيراً أعلنت شركة Unity عن دعمها لتصدير ألعابك لمنصة Stadia التي أعلنت عنها شركة Google قبل بضع سنوات.

أدوات أخرى

هناك العديد من المزايا الجديدة أيضاً التي لم يسعفنا الوقت للحديث عنها مثل AR Foundation ، وكيف قامت الشركة بتطوير وزيادة إنتاجية الواقع الإفتراضي VR والواقع المعزز AR ، وأيضاً أداة Device Simulator التي تتيح لك تجربة اللعبة على Emulator لرؤية النتيجة، والعديد من المزايا الأخرى التي يمكن الإطلاع عليها من صفحة الميزات الجديدة لدى الشركة.

إلى هنا نكون قد وصلنا إلى نهاية درسنا على أمل أن نلقاكم في درس جديد إن شاء الله.

post

ميزات 2019.3 Unity – الجزء الأول

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

تم إضافة الميزات للعديد من الاقسام الرئيسية، وسنتناول في هذا الجزء الأقسام التالية :
– التقسيم الجديد لنسخ المحرك، التجريبية وطويلة الأجل
– الأدوات الجديدة للفنانين والرسامين Artist and designers
– الأدوات الخاصة بالألعاب ثنائية البعد 2D Tools

على أن يتم الحديث عن الأقسام التالية في الجزء الثاني وهي:
– الأدوات الجديدة للمطورين Developers
– تحسينات الظهور Graphics
– تحسينات المحرك
– وإدارة المنصات

النسخ التجريبية، والنسخة طويلة الأمد

في البداية، قامت الشركة بتأكيد فصل المحرك إلى قسمين، القسم الأول يحتوي على المحرك الأصلي لوحده الـ Core ، والقسم الثاني هو Packages يتم إضافتها للقسم الأول، بهذه الخطوة يمكنك إستخدام نسخ مستقرة من المحرك أو ما أسموه LTS المختصر من Long-Term Support وإضافة أي مزايا جديده عليه مما يتم تطويره ما بعد إصدار تلك النسخة دون الحاجة لتجديد المحرك في كل نسخة مقبلة، فأي ميزة جديدة ستراها في هذه النسخة ستكون عبارة عن إضافة Package جديدة يمكن تنزيلها من ال Package Manager داخل المحرك، وهنا أيضاً قامو بتعريف النسخ الحديثة والتي تحتوي على نسخ تجريبية بـ TECH Releases حيث سيتم إصدار إثنتان منها كل سنة، على أن يتم إصدار النسخة المستقرة LTS مرة واحدة كل سنتين.

فيديو يشرح نظام النسخ المستقبلية من محرك الألعاب Unity

أدوات جديدة للـفنانين والمصممين

1. أدوات الأرضية Terrain Tools

يمكنك الآن صنع فجوات Hols وكهوف Caves في نظام الأرضية التابع للمحرك، الشيء الذي كان من أكثر الطلبات الملحة من قبل المصممين، حيث أنهم كانو سابقاً يضطرو لنمذجة مجسم الجبل والكهف بشكل منفصل عن Terrain مما كان يحتاج لكتابة أكواد خاصة بما يتعلق بالفيزيائية والأمور الأخرى، الآن أصبح بإمكانك بكل بساطة إختيار Paint Surface Mask tool ومسك الفرشاة والرسم على الـ Terrain كما لو كنت تقوم بتلوينها. والفجوات Holes ستتأثر بكل الأنظمة الأخرى مثل الفيزيائية والـ navigation mesh وحتى خرائط الضوء lightmapping التي ترتبط بشكل أساسي بمجسم الـ Terrain ، ويمكن للمبرمجين الوصول للفجوات والتحكم بها عبر custom terrain logic .

أداة Terrain Tools التي تسمح بصنع فجوات في الأرضية

أيضاً قامو بتحسين رسم التضاريس من خلال أدوات الرسم Terrain Material painting حيث قامو بإضافة 15 أداة للحفر على الـ Terrain لتعطي تفاصيل دقيقة وتقلل من الإعتماد على برامج خارجية قدر الإمكان، هذا كله يمكنك الحصول عليه بإضافة الـ Terrain Tools Package من الـ Package Manager .

أدوات فرشاة جديدة للرسم على الأرضية وإضافة تضاريس عالية الجودة

2. أدوات التحريك Animation Tools

تم إضافة أداة Animation Rigging التجريبية أيضاً إلى الـ Package Manager، حيث أنها تساعد وتسهل من عملية التحريك في الخط الزمني Timeline المخصص لعمل الحركة وهي موجة بشكل أساسي للأشخاص المسوؤلين عن التحريك Animators ، فهناك أدوات الدمج بين حركتين وإضافة الطبقات الخاصة بالتحريك Sequences and Layers لإنشاء حركات جديدة كلياً عن التي أتت عندما قمنا بإستيراد المجسم، والتي ترتبط إرتباط وثيق مع محرر الـ Rig Editor و ال Animation Window لتساعد المحركين من التقليل على إعتمادهم أيضاً على البرامج الخاصة بالتحريك خارج محرك الألعاب Unity.

أدوات منفصلة للمحركين Animator

3. الهئيات المُعَدّة مسبقاُ Presets

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

تغيير الإعدادات الأولية لأي شيء يزيد من سرعة التصميم

4. خامات من برامج مختلفة renderer materials

في هذه النسخة أصبح بالإمكان الإعتماد على مكتبات خامات Material من خارج المحرك، فهناك الكثير من برامج التصميم التي تمتلك أنواع مختلفة من الخامات بما يتناسب مع البرنامج، وفي هذا النسخة 2019.3 أصبح بالإمكان إستيرادها والتعامل معها مباشرة، والتي ستظهر نتيجة متطابقة مع البرنامج الأصلي دون الحاجة لعمل خامات جديدة متقاربة في المحرك، وهذا يعطي إمكانية أكبر للمصممين على البرامج الأخرى من الإبداع أكثر في الخامات على برامجهم. والأنواع التي يتم دعمها الآن هي: Autodesk Arnold Standard Surface shader, Autodesk 3ds Max physical material, and the Autodesk Interactive shader.

أصبح بالإمكان إستيراد الخامات من البرامج الخارجية دون الحاجة لتعديلها

5. منع إختيار مجسمات معينة Scene Picking

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

إظهار وإخفاء المجسمات أصبح أسهل الآن

أيضاً تم إستبدال الـ grids القياسية بأداة أكثر إنتياجية إسمها ProGrids ، حيث يمكنك إختيار المحور الذي تود إظهار الـ grid عليه وقيمة الإنتقال أو الدوران Snap ، ويمكنك الحصول على هذه الأداة من خلال تثبيتها من Package Manager ثم ستجدها متاحة ضمن قوائم المحرك.

أداة ال ProGrids تعطي تحكم أكبر في موقع المجسمات

6. أدوات DOTS-powered للمصممين

لعل من أبرز ما جاء في هذه النسخة هي إحتوائها على أداتين موجهة للـ Designers تعمل بتقنية الـ DOTS ، و DOTS إختصار لـ Data-Oriented Technology Stack ، ويمكن توضيحها بشكل بسيط على أنها محاولة إستغلال الـ MultiCore Processors لإعطاء أداء خارق خصوصاً على أجهزة الموبايل، والتي تعطي سرعة عالية أيضاً في الحسابات والـ Frame Rate . الأداتان الجديدتان يمكن إضافتهما من خلال Package Manager تحت إسم Entities package ، وهي حالياً تجريبية Preview ، الأداة الأولى Conversion Workflow تقوم بتحويل المجسمات GameObjects إلى entities بضغطة واحدة، والأداة الثانية هي Unity Live Link ، حيث أنه أي تغيير داخل المحرك ينتج عنه تعديل في كل الأجهزة المتصلة معه. للمزيد من التفاصيل يمكن مراجعة الروابط في الأسفل.

أدوات DOTS سرعة خارقة في الأداء

الأدوات ثنائية البعد 2D Tools

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

1. مستورد ملفات الفوتوشوب 2D PSD Importer :

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

نفس الشخصية في الفوتوشوب هي في المحرك

2. التحريك ثنائي الأبعاد 2D Animation :

أصبح الآن من السهل تحريك الصور ثنائية الأبعاد Skeleton 2D Sprite ، حيث بإمكانك إضافة Bones وإضافة وزن لك منها، وبالتالي عمل حركة متكاملة للشخصية، وتم تقديم كل الأدوات التي يحتاجها المحرك Animator لينتهي من الحركة كما لو أنه يقوم بها في برنامج خارجي.

عمل عظام لتحريك الشخصية بسهولة

3. أداة بناء المراحل وأداة تشكيل الصورة:

المحرك الآن يتحوي على أداتين مهمتين في بناء المرحلة أو ما يسمى بخريطة اللعبة World Map ، حيث أن الأداة الأولى هي 2D TileMap Editor ، وتقوم بأخذ مجموعة من الصور ثنائية البعد ورسمها لتبني خريطة لعبة كاملة، فمثلاً تقوم بعمل 3 صور واحدة للعشب وواحدة للتراب وواحدة للماء، وكل ما عليك هو إختيار إحداها وبدء الرسم على المحرك ليقوم هو بنفسه بضبط الصور وتركيبها معاً. والأداة الثانية هي 2D Sprite Shape ، حيث تفيد هذه الأداة في عمل خط طويل من صورة واحدة دون الحاجة لتكرارها في كل مرة، وايضاً يمكنك إختيار صور تقوم بملء الفجوة الداخلية بالتالي تحصل على شكل مناسب الذي إن قمت بعمله يدوياً سيأخذ منك الوقت الكثير عدا عن الدقة المطلوبة في حال كانت يدوية.

الرسم أصبح أسهل مع أدوات الصور ثنائية الأبعاد 2D Tools

4. دقة الصورة ذو النوع Pixel :

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

الصورة تبقى كما هي في حالة دورانها أو تغيير الدقة

أيضاً لازالت الشركة تقوم بتطوير العديد من الأدوات التي يهتم بها مطور الألعاب ثنائية الأبعاد، فهناك تحسينات على الضوء وعلى الظلال المستخدمة من خلال إستخدام خريطة Normal Map ، وأيضاً قامو بإضافة عدد من الأدوات الجديدة مثل 2D Animation’s Sprite Swap التي تجعلك تقوم بتبديل صور من شخصية معينة مع الحفاظ على العظام وتركيبها دون الحاجة لعملها من جديد.

إدوات إضاءة وظلال للشخصية

نلتقي في الجزء الثاني إن شاء الله.

post

#14 الدوال Methods – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OXW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الدوال Methods

 

السلام عليكم و رحمة الله و بركاته ، و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة لمبتدئين كلياً بواسطة السي شارب

درس اليوم ” الدوال الـ Method “

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

سابقاً لم يكن هناك دوال و كان المطور مجبراً على كتابة أسطر برمجية متتالية ، فتجد أن البرنامج عبارة عن 1000 سطر على سبيل المثال ، كلها متتالية حيث ينفذ السطر الأول ثم الثاني فالثالث و هكذا ….. مما كان يجعل الأمر صعباً

و خصوصاً في حال وجود أي خطأ في البرنامج فيجب أن يقوم بتتبع للبرنامج ليصل إلى مكان الخطأ

 

كما تعلمنا في كل الدروس السابقة نقوم بإنشاء مشروع جديد و نختار Visual C# ثم Console Application و سنكتب اسم البرنامج هذه المرة ” Methods ”
و تكلمنا أنه يجب أن نقوم بالبدء بالكتابة بين قوسي الدالة void Main

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

و الدالة يمكن شرحها بأنها قطعة برمجية  Block of Code تبدأ بقوس و تنتهي بقوس آخر ، و تحمل اسم , حيث يتم استدعاء هذا الاسم لتقوم بالعمل الخاص بها .

لاحظو الدالة الرئيسية void Main و هي الدالة التي يبدأ بها الـبرنامج

سنقوم الآن بكتابة دالة رئيسية و سنقوم بشرحها و شرح التركيبة الخاصة بها

هذه الدالة يمكن استخدامها و استدعاؤها في الدوال الأخرى كالتالي :

أخذ اسم الدالة (PrintMessage) ثم فتح القوس الخاص بها و اغلاقه و كتابة الفاصلة المنقوطة .

و لا ننسى أن نقوم بكتابة الدالة ReadLine

عند تشغيل التطبيق سيقوم بطباعة Hello World !

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

شرح الدالة

في البداية يجب أن تقوم بكتابة الدالة خارج الـ void Main  لأنه لا يمكن كتابة دالة داخل دالة

لذلك إذا أردت كتابة دالة فيجب كتابتها خارج الدوال الأخرى

الترتيب غير مهم هنا و هذا يعني أنه بإمكانك كتابتها قبل أو بعد الـ void Main

و عند الحاجة إليها أقوم بكتابة اسمها دون كتابة الأسطر البرمجية الموجودة بداخلها

 

فوائد الدوال :

(1) : استدعاء أسطر برمجية يتم كتابتها أكثر من مرة ، بحيث تقوم بكتابتها مرة واحدة داخل الدالة ثم تقوم باستدعاء الدالة في كل مرة تحتاج إلها .

(2) : عدم تكرار الأسطر البرمجية نفسها

(3) : تقوم بتنظيم المشروع

(4) : في حال حصول أي مشكلة يمكن تعديلها بشكل بسيط في مكان واحد دون تتبع التطبيق بشكل كامل

 

هذه القضايا سنتكلم عنها في الدروس القادمة و سنتحدث الآن عن الدالة void

 

 

الـ void هي نوع من أنواع البيانات أو أنواع الـ Data مثل integer  و  string

لكنها لا تعود بقيمة و سنتعرف عليها بعد قليل

يمكننا نقل السطر ;()Console.ReadLine إلى الدالة التي قمنا بإنشائها

 

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

 

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

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

ثم يقوم بتعريف Array من النوع char  ثم يأمر بتحويلها إلى مصفوفة ثم يقوم بعملية عكس لهذه المصفوفة

إذا لدينا ثلاث أسئلة و لكل سؤال 4 عمليات

و بالتالي لدينا تقريباً 12 سطر

و في النهاية يقوم بتعريف متغير جديد باسم result

و يقوم باستخدام الحلقة foreach ليقوم بأخذ هذه الأحرف و يجمعها ليعطي هذه النتيجة

نلاحظ عند تشغيل التطبيق أنه أخذ كلمة كلمة و لم يعكس الجملة كاملة ، حيث قمت بإدخال Osama  ثم  Deep ثم amman

فأخذ الاسم الأول و قام بعكسه ، ثم أضاف مسافة قبل الاسم الثاني ثم تابع أخذ الاسم الثاني و المدينة ،

عندها قام بإعطاء النتيجة كالتالي

Result : amaso peed namma

لنرى كيف نكتب دالة توفر علينا هذا الكم من الكتابة ، فبدلاً من كتابة 16 سطر سنقوم بكتابة 4 اسطر فقط و استدعاء هذه الدالة

 

الآن نقوم بتعريف دالة جديدة

ثم نكتب التالي ضم قوسي الدالة {   }

كما في المثال التالي :

 

في البداية سنقوم بالتطبيق على الـ firstName فقط ، سنستدعي الدالة ليقوم بعرض الموجود داخلها .

المتغير الأول هو السؤال و المتغير الثاني هو ناتج المدخل

الآن سيقوم بطباعة السؤال و ثم يكون بعملية عكس للأحرف المدخلة في الجواب

حيث يقوم بتحويله لمجموعة من character  و اسنادها في متغير جديد ثم يقوم بعكسها باستخدام الدالة Array.Reverse

و في النهاية سيقوم بطباعة firstNameArray

الآن لدينا الجزء المتكرر في كل المراحل السابقة و قد أصبح ضمن الدالة التي قمنا بإنشائها

الآن نقوم بعملية استدعاء للدالة التي قمنا بإنشائها

عندها سيسأل عن الاسم الأول و يطلب إدخاله ، و سيأخذ القيمة من المستخدم و يدخلها في متغير نصي  و يتابع

عند تشغيل التطبيق سيسأل عن الاسم و عند ادخال osama  يقوم بطباعة osama لكن بالشكل المعكوس … أي  amaso

 

الآن لنلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

لاحظوا أنه سيكون لدينا مشكلة إذا قمنا بكتابة هذه الدالة للاسم الثاني و اسم المدينة

المشكلة هي أنه إذا قمت باستدعاء اسم الدالة فعندها سيقوم بطباعة الاسم الأول لوحده ، و نحن لا نريد هذا

نحن نريد أن يقوم بإرجاع القيمة الناتجة و استخدامها لاحقا

 

فقد تكلمنا أن الـ void لا يرجع أي قيمة ، لكن بإمكاننا استبدال هذا النوع بـ string

أي أن هذه الدالة ستقوم بعمليات معينة ثم ستعيد نصاً إلى مكان استدعائها

 

بما أن هذه الدالة أصبحت من النوع string  و ليس void  فيجب أن ترجع قيمة و بالتالي ستحتوي على return لشيء ما في نهايتها

و القيمة التي نريد ارجاعها هي النص الموجود لدينا  فيصبح السطر الأخير :

;Return string.concat(firstNameArray)

عندها سيكون هذا السطر راجعاً من الدالة DisplayResult

أي أنني في الأعلى يمكنني أن أقوم بتعريف

;()string firstName = DisplayResult

و النوع الموجود قبل إشارة المساواة من النوع string وبالتالي DisplayResult ذات الأمر ، لأن الدالة الموجودة في الأسفل من النوع string و النتيجة الراجعة من النوع string

نقوم بتشغيل التطبيق لنتأكد من صحة المعلومات و نلاحظ أنني لا اريد أن أقوم بطباعة الناتج داخل الدالة الثانية بل سأقوم بطباعته في الدالة void

 

فعلا قام التطبيق بطباعة osama  بشكل معكوس

سنلاحظ بعد قليل أن هذه الدالة قامت باختصار كاف الاسطر السابقة

 

و نتذكر أن الدوال من الممكن أن تكون int , string أو أي نوع من أنواع البيانات و يمكن أن تكون دالة لا ترجع قيمة مثل void

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

الآن أريد استخدام هذه الدالة ليس فقط لطباعة الاسم الأول
بل لطباعة الاسم الأول و الأخير و السؤال عن المدينة التي ولد فيها

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

عندما نقوم باستدعاء الدالة يجب أن نرسل قيمة يتم ارسالها إلى الدالة

 

لذلك سنقوم بحذف السؤال في الدالة و نجعله قادماً من مكان استدعائها

إذا سنأخذ المتغير question و نضعه بعد string  بين قوسي الدالة (  )

الناتج كالتالي

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

 

الآن قمنا بإرسال هذا النص إلى الدالة و قام بطباعته و استخدام القيمة المرسالة مع هذه الدالة

نقوم بتعريف متغير جديد اسمه lastName ، و سأسأله سؤال ” ما هو اسمك الأخير” و القيمة الراجعة من الدالة سيقوم بإسناده للمتغير lastName
ثم نسأله عن مكان الولادة

لاحظو أن هذه الثلاث أسطر هي فعليا 12 سطر
لنتأكد أن القيمة الراجعة صحيحة

ثم نقوم بطباعة الناتج النهائي

بتشغيل التطبيق سيسأل عن الاسم الأول و الأخير و المدينة ، و سيقوم بعرض ذات النتيجة التي عرضها في التجربة الأولى

في حال حدوث مشكلة لا يجب تتبع الأسطر كلها ، بل نقوم بتتبع أسطر الدالة القليلة
حيث استخدمناها لتقليل عدد الأسطر

 

نصل الآن لنهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله

 

ملخص الدرس :

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الرابع عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على  الدوال Methods أو ما يسمى Function في لغات أخرى، والتي تعتبر العصب الرئيسي الذي يقوم عليه أي تطبيق ولا يخلو منها.

الدوال Methods :

يمكن تعريف الدالة على أنها قطعة برمجية Code Block تبدأ بجملة تعريفية بإسمها ونوعها سواء كانت نصية string أو رقمية int أو لا ترجع أي قيمة void أو أي نوع آخر. والدوال لها العديد من الميزات أهمها:
– تقليل عدد التكرارات الموجودة في التطبيق، وبالتالي قلة عدد الأسطر الإجمالي.
– تنظم المشروع، بحيث تكون الأسطر البرمجية الخاصة بعملية معينة في مكان واحد.
– سهولة إيجاد المشاكل المنطقية في حال وجودها لاحقاً.
و طريقة كتابة الدالة هكذا :
Method_Type Method_Name ()
}
{

خصائص الدوال :

كما ذكرنا قبل قليل، إن كانت الدالة غير النوع void ( لا ترجع أي قيمة)، أي أنها من النوع int أو string أو float أو أي نوع آخر، فيجب أن تقوم بإضافة سطر return value في نهايتها ويمكن الحصول على العائد من الدالة بعملية الإسناد، أيضاً يمكن إرسال قيم عند مناداة الدالة لإستخدامها داخل الدالة وهي ما تدعى arguments أو parameters ، وهي متغيرات يتم إستخدامها داخل الدالة للقيام بالمهمة الموكلة لها.

مصطلحات الدرس :

Methods :

Block of Code :

return :

float :

arguments :

parameters :

الأسطر البرمجية التي تم إستخدامها في الدرس :

post

بناء نموذج ذو جودة عالية وإظهاره داخل محرك Unity

خطوات تحويل صور إلى مجسم ثلاثي الأبعاد لإظهاره داخل محرك Unity

 لمحة عن المقالة:

السلام عليكم ورحمة الله وبركاته، في الآونة الأخيرة ظهرت برامج تساعد المنمذجين 3D Modelers لبناء نماذج حقيقية Models تحتوي على تفاصيل كثيرة High Details بالإضافة إلى الخرائط الخاصة بها Textures ، ولعل من أشهرها تطبيق Reality Capture ، هذه النماذج غالباً تحتاج لإعادة تنقيح قبل إستخدامها في محركات الألعاب بسبب حجمها الكبير، وغالباً يتم ذلك بواسطة برامج النمذجة مثل 3Ds Max أو Maya، قامت شركة Unity بكتابة درس تفصيلي من 100 صفحة تقريباً خطوة بخطوة من تجهيز الأدوات إلى تجهيز النموذج لوضعهم داخل لعبتك، سنقوم بسرد أهم العمليات المستخدمة في المقالة ثم وضع رابط للنسخة المفصلة.

الأدوات والتطبيقات المستخدمة :

بالنسبة للأدوات، تتراوح حسب قدرتك وحسب إمكانياتك المتاحة، كل ما كانت أدوات التصوير أفضل كلما حصلت على جودة أعلى، يمكنك إستخدام كاميرا الموبايل لكن النتيجة بالتأكيد لن تكون كمن يقوم بإستخدام كاميرا متخصصة للتصوير الفوتوغرافي، الكاميرا المستخدمة في المقالة هي Canon 6D مع العدة الخاصة بها.
أما بالنسبة للتطبيقات التي سيتم إستخدامها للتعديل وللإخراج النهائي فهنا أهمها:

– Reality Capture : البرنامج الذي ستستخدمه لتحويل الصور إلى مجسمات ثلاثية الألعاب ، رابط موقع البرنامج هنا.
– Autodesk 3ds Max : البرنامج الذي ستقوم بتعديل النموذج الأولي Raw model وإعادة بناءه Retopology لكي يصبح جاهز للإستخدام، أيضاً سيستخدم لعملية فرد الخرائط Unwrap UV ، رابط موقع البرنامج هنا.
– Adobe Photoshop : البرنامج الذي ستستخدمه لعمل تعديل على الخرائط الناتجة من البرنامج الأول Textures بحيث تتناسب مع النتيجة النهائية، رابط موقع البرنامج هنا.
– Unity : بالتأكيد لا ننسى المحرك الذي سنقوم بإظهار النموذج النهائي عليه، محرك اليونيتي مجاني ويمكن تحميله من هنا.
هناك بعض التطبيقات التي ستحتاجها في بعض التعديلات البسيطة أيضاً.

ما قبل التصوير:

هناك بعض القواعد الأساسية التي يجب أن تأخذها بالحسبان قبل البدء بعملية التصوير، أهمها:
– الإجابة على The 3 W’s : الشيء الذي تود تصويره What،  أفضل موقع يمكن الحصول عليه Where، أفضل وقت تستطيع الحصول على جودة عالية عليه When.
– صور أم فيديو : في النهاية يجب الحصول على صور من كل الزوايا لإعطاء إمكانية لبرنامج Reality Capture الحصول على جودة عالية.
– إعدادات الكاميرا : النتيحة تختلف كلياً حسب إعدادات الكاميرا المختارة، يجب أن تكون على دراية تامة بهذه الإعدادات.

الحصول على الصور :

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

معالجة النموذج :

بعد الحصول على الصور ووضعهم داخل تطبيق Reality Capture سيقوم بمعالجتهم وتحويلهم إلى مجسم 3D Model ، يجدر الإشارة إلى أن النموذج الناتج غالباً يحتاج إلى تعديل، سواءاً بإعادة ترتيب الأوجه Polygons Retopology ، أو بإعادة تركيب طريقة فرد المجسمات على الخريطة Unwrap UV Texture ، ويتم ذلك بإستخدام تطبيق 3ds Max .

معالجة خرائط النموذج :

أو ما يسمى 3D Model Textures ، وهناك العديد من الخرائط التي يتوجب عليك العناية بها للحصول على جودة عالية في إظهار النموذج، حيث ستستخدم هذه الخرائط في إخراج المادة النهائية Material التي تتأثر بفيزيائية المادة، ويتم إستخدام تطبيقات للحصول على هذه الخرائط أشهرها Xnormal، وهنا لمحة عن أهم الخرائط Textures المهمة :

– خريطة الألوان الأساسية Albedo Map: أو تسمى Diffuse Map، هذه الخريطة أساسية وتحتوي على الألوان الحقيقية للمجسم.
– خريطة التفاصيل Normal Map : وتحتوي على معلومات يتم إستخدامها لإظهار تفاصيل إضافية على المجسم إستناداً إلى زاوية الضوء.
– خريطة الظل الغير مباشر Ambient Occlusion Map : وتحتوي على الظلال الخفيفة التي تتواجد في حال عدم وجود مصدر ضوء مباشر على المجسم.
هناك العديد من الخرائط الأخرى أيضاً منها : Height Map, Vertex color Map,Object space Normals Map.

تجميع النموذج النهائي :

بعد الحصول على نموذج نظيف يمكن تصديره كـ FBX ، وبعد الإنتهاء من الخرائط الأساسية يمكن تصديرها كـ TGA لجودة عالية أو يمكن تحويلها إلى PNG لحجم أقل، بعد السابق يتم تجميعهم وإضافتهم داخل محرك الألعاب Unity ، لتظهر كما في الصورة التالية:

الكتاب الإلكتروني الأصلي الذي يحتوي على التفاصيل تجده هنا.

post

#13 المصفوفات Arrays – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : YIL

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  المصفوفات Arrays

السلام عليكم و رحمة الله و بركاته , و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

في درس اليوم سنتكلم إن شاء الله عن المصفوفات أو الـ Arrays

تعريف المصفوفات :

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

 

نذهب إلى File  ثم New ثم project و نتأكد من اختيار #Visual Cو نختار Console App
تكلمنا سابقاً أن المكان المخصص لكتابة الأكواد البرمجية هو بين قوسي الدالة void Main

كي لا نضيع الوقت قمت بكتابة هذه الاسطر سابقاً و سأقوم بلصقها هنا

لاحظو أنني قمت بتعريف خمسة متغيرات هنا ، و كل متغير يحتوي على قيمة معينة

نريد الآن أن نقوم بالبحث عن الرقم 16 ، عندها سأكون مجبراً على كتابة جمل شرطية if statement  لكل متغير لكي أحصل على القيمة و أقارنها بالقيمة المطلوبة

في البداية نسأل هل قيمة المتغير number1 تساوي 16

ثم ننتقل إلى الثاني … الثالث ……. الخامس و هكذا

في هذه الحالة سأكون مضطراً لكتابة كل المتغيرات و كتابة عدد كبير من جمل if statement

هنا يأتي دور المصفوفة Array

سأقوم مبدئيا بتحويل الجمل السابقة إلى جمل ملاحظات

يمكن تعريف الـ array كالتالي

;int[ ] myNumber = new int [5]

لاحظو في هذا السطر قمت بتعريف مصفوفة اسمها myNumber  من النوع integer و تحتوي على خمس قيم

قمنا بكتابة الأقواس المربعة بعد النوع مباشرةً

الآن أصبح عندي 5 عناصر أو خمس خانات استطيع التعامل معهم

كيف يمكنني أن أقوم بإدخال قيم إلى هذه العناصر ؟

يمكننا فعل ذلك كالتالي :

;myNumber[0] = 10
;myNumber[1] = 22
;myNumber[2] = 14
;myNumber[3] = 66
;myNumber[4] = 22

الخانة الموجودة بين القوسين [ ] تسمى index

لذلك عندما تريد استدعاء عنصر ضمن المصفوفة تضع اسم المصفوفة و رقمه بين الأقواس [  ] مع ملاحظة أن الخانة الأولى يجب أن تحمل الرقم 0

إذاً من خلال الأسطر السابقة قمت بإدخال قيم إلى العناصر الموجودة ضمن الـ Array

الآن ماذا لو أردت أن أقوم بعملية استدعاء للقيم ؟

سأقوم من خلال التالي بطباعة قيمة أحد العناصر في المصفوفة

;Console.WriteLine(myNumber[2] )

 و لا ننسى كتابة الدالة ReadLine لنتمكن من مشاهدة النتائج.

نقوم بتشغيل التطبيق و نلاحظ أن التطبيق قام بطباعة القيمة 14

طريقة ثانية

الآن هناك طريقة ثانية لتعريف المصفوفة و إدخال القيم بها مباشرةً .

;int [ ] myNumbes = new int [ ] {1, 5 , 3 , 4 , 66 , 55 }

و كما تكلمنا لو اردنا طباعة القيمة رقم 3 فسنكتب :

; Console.WriteLine(myNumber[2] )

 

هناك إمكانية لطباعة ” عدد العناصر الموجودة داخل المصفوفة “

عن طريق التالي :

;Console.WriteLine(myNumber.Length)

هنا قمنا بطلب أخذ الـ Length ، و هو كم عدد العناصر الموجودة ضمن المصفوفة

و لو قمنا بعمل تشغيل للتطبيق ، سنحصل على القيمة 6 ، و هو فعلاً عدد عناصر المصفوفة السابقة .

في الاسطر السابقة استعملنا النوع integer ، و بالمثل يمكننا استعمال أي نوع آخر

مثلا هنا أقوم بكتابة

;  string[] myStrings = new string[] { “Ahmad”, “Mohammad”, “Shady”, “Safaa” }

و بالمثل سنقوم بطباعة قيمة العنصر رقم 3

 

;Console.WriteLine(myStrings[2] )

و لاحظ أنه قام بطباعة شادي

 

تحدثنا في المحاضرة السابقة عن For Loop Statement  التي تقوم بعملية تكرار لأوامر معينة ، لاحظة الآن سأقوم باستخدامها لطباعة كل عناصر المصفوفة

و ذلك كالتالي :

 

لاحظو أنه قام بطباعة كل عنصر من عناصر المصفوفة و ذلك بناءً على الـى Length

لاحظو أن عدد العناصر في المصفوفة هو 4 و هذا يعني أن myStrings.Length يساوي 4

و لذلك عندما وصل إلى الرقم 3 لقيمة i  فهو فعلياً وصل إلى آخر عنصر في المصفوفة ، و عندما أصبحت i = 4 يقوم بالخروج من الحلقة و ذلك لأن 4 تساوي 4 و ليست أصغر منها طبقاً لشرط الحلقة و بالتالي بعد أن أصبح شرط الحلقة غير محقق قام بالخروج منها

حلقة foreach

هناك أيضاً حلقة يتم استخدامها بشكل كبير مع المصفوفات ، ألا و هي  foreach

شرح هذه الحلقة :

بعد إضافة foreach  نقوم بتعريف متغير من النوع الذي تم تعريف المصفوفة به
و هنا قمنا بتعربفه من النوع string  تبعاً لنوع المصفوفة myStrings و بالنسبة لاسم المتغير الجديد فهو اختياري لأننا سنقوم باستخدامه حصراً ضمن الاقواس {  }

ثم نقوم بإضافة الكلمة المحجوزة in ثثم اسم المصفوفة و ذلك بدون أقواس [  ]

عمل الحلقة :

في كل مرة سيقوم بأخذ أحد العناصر (على الترتيب) ثم يقوم بإسناده الى المتغير name و يقوم بطباعته

و لاحظ أننا لم نقم بإعطائه الـ index  الخاص بالعنصر و إنما طلبنا منه أن يقوم بجلب جميع العناصر الموجودة داخل المصفوفة

 

 

هناك أيضاً إمكانية للتعامل بشكل أكبر مع المصفوفات :

 

إذا كان لدي نص معين و أردت أن أقوم بطباعة هذا النص بالعكس ( عمليةReverse )

هناك نوع جديد من أنواع البيانات هو النوع char و تكلمنا سابقاً أنه يقبل حرفاً واحداً فقط

;’char x = ‘a

الآن لدينا التالي :

;!! string myWords = “i need to go to the hospital now

يمكنني  أن أحصل على مصفوفة من myWords عن طريق الجملة :

;()Char[ ] x = myWords.ToCharArray

من خلال هذا الجملة نقوم بفصل جميع الحروف الموجودة في النص و تحويلها إلى عناصر في المصفوفة

myWords.ToCharArray تقوم بالعودة بمصفوفة يتم اسنادها للمصفوفة x  من النوع char

و نلاحظ هنا أننا قمنا بكتابة char و ليس فقط Array في myWords.ToCharArray لأنني أريد تحويل جميع الخانات خانة خانة إلى النوع char

الآن لو قمت بوضع بكتابة الحلقة foreach كما في التالي :

لو قمت بتنفيذ التطبيق سيقوم بطباعة الجملة حرف حرف في كل سطر

و لعكس المصفوفة نقوم بكتابة التالي :

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

 

طبعاً المصفوفات لها استخدامات أكثر مما تم ذكره ، و الدروس القادمة ستكون كفيلة بصقل مهارتك باستخدام الـ Array

نصل الآن إلى نهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله .

ملخص الدرس :

تعريف المصفوفات:

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

المصفوفة Array :

يمكن تشبيه المصفوفة أنا عبارة عن صندوق فاكهة يحتوي تفاح، حيث أن هناك عدد كبير من التفاح غير أنه غير متساوي في المواصفات، فهناك الكبير وهناك ذو الحلاوة أكثر وهناك ذو الحمرة أكثر، غير أنهم يتشاركون بصفه أنهم جميعاً من النوع الواحد ألا وهو التفاح، والمصفوفة يمكن أن تكون أي نوع من أنواع البيانات الموجودة بداخل لغة السي شارب، سواءاً كانت نصية أو رقمية أو حتى متجهات ثلاثية البعد.
ويتم حجز المصفوفة بكنابة نوعها ثم أقواس مربعة ثم إسم المصفوفة ثم إعطاءها رقم للعناصر التي ستكون بداخلها هكذا :
int[] myNumbers = new int[5];

أو كما في المثال التالي :

مصطلحات الدرس :

Arrays :

Length :

foreach :

 index  :

Zero Base :

Reverse :

char :

ToCharAray :

 

post

#12 الحلقة التكرارية For – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : PQW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الحلقة التكرارية

السلام عليكم و رحمة الله و بركاته , و أهلاً و سهلا بكم في دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

الحلقة التكرارية التي لا يخلو application  من استخدامها لما فيها من تسهيل و اختصار للوقت

و كما نبدأ عادةً

ندخل الى File ==> New ==> Project  ,
و نختار #Visual C  ثم نختار Consloe application

سنسمي هذا الـ application  باسم  ForIteration

كما تكلمنا في الدروس السابقة المكان المناسب للبدء بكتابة الأسطر البرمجية هو بين قوسي الدالة  void Main

 

يطلب مني أحد الزبائن أن أقوم بطباع جملة معينة خمس مرات , فمن خلال معلوماتنا السابقة يمكننا كتابة التالي

;Console.WriteLine(“Statement 1”)
;Console.WriteLine(“Statement 2”)
;Console.WriteLine(“Statement 3”)
;Console.WriteLine(“Statement 4”)
;Console.WriteLine(“Statement 5”)

;()Console.ReadLine

ثم نقوم بعمل تشغيل للبرنامج لنرى أن البرنامج قد قام بطباعة الجمل المطلوبة بشكل صحيح

لنفرض أن الزبون قد غير رأيه و أراد طباعة 100 جملة

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

فكيف يمكننا عمل ” حلقة تكرارية ” لنصل إلى النتيجة ؟؟

هنا يأتي دور الحلقة التكرارية For Loop

For (    int  i   =  0;          i   <   20 ;      i++    )

و لتفصيل الـ  Expression الخاص بالحلقة :

;Int i = 0 : قمنا بتعريف متغير من النوع integer  و قمنا بإعطائه قيمة ابتدائية تساوي الصفر , حيث قمنا بعمليتي Declaration  و Assignment  في نفس الجملة .

;i < 20 : الشرط Condition  , و يجب أن يكون محققاً ليقوم بتنفيذ الحلقة

;i++ : معدل النقصان أو الزيادة للمتغير i  . و هو مشابه لـ i = i + 1 ;

 

تقوم بالحلقة بالتأكد من تحقق الشرط , و كما هو واضح فإن 0 و هي القيمة الأولية أصغر من 20 فالشرط محقق
تبدأ الزيادة بعد تنفيذ السطر الأخير من الحلقة , أي أنها تقوم بالتنفيذ حتى السطر الأخير ثم تبدأ بعملية الزيادة, و في تطبيقنا ستقوم بتنفيذ السطر

;Console.WriteLine(“statement” +i)

ثم تبدأ بعده بالزيادة

و نلاحظ عند التشغيل أن أول قيمة هي 0 مع أننا قمنا بكتابة  ++i , و يمكننا جعله يبدأ من القيمة 1 و ذلك بتعديل القيمة الأولية إلى 1 . كما يمكننا جعله ينفذ الجملة رقم 20 و ذلك من خلال تبديل الشرط إلى  (i  أصغر أو تساوي الـ 20 )


الآن سوف ننتقل لمرحلة جديدة , ألا و هي أن نستعمل الجملة الشرطية if statement  داخل حلقة For

سيقوم هنا بالتحقق من الشرط ” هل 1 أصغر أو يساوي الـ 20 ؟ ” نعم الشرط محقق ! سينتقل لتنفيذ الحلقة

سيقوم بالتحقق من محتوى الحلقة :

If (i == 8)
;Console.WriteLine(“Found  ” + i)

هل 1 = 8 ؟؟ الجواب لا … يعود للبداية مع زيادة 1
تصبح قيمة  i تساوي 2 و يسأل هل 2 أصغر أو تساوي 20 ؟ الجواب نعم ، يذهب لتنفيذ الحلقة فيسأل هل 2 تساوي 8 ؟ الجواب لا فيعود للبداية مع زيادة 1 في كل مرة

عندما يصل إلى الرقم 8 : يسأل هل i = 8 أصغر أو تساوي الـ 20 ؟ الجواب نعم
يذهب لتنفيذ الحلقة فيسأل هل 8 = 8 ؟ الجواب نعم فيقوم بتنفيذ الشرط و طباعة ” Found  8″. إلا أنه قام بتنفيذ الحلقة 20 مرة و لكن لم تتم كتابة سوى الحالة الثامنة و ذلك بسبب الشرط المذكور سابقاً .

إذاً : الـ Expression  الخاص بالحلقة يحتوي على :

◘ القسم الأول و هو القسم الذي يتم فيه تعريف المتغير الذي ستتم عليه عملية الزيادة و النقصان , و يتم في هذا القسم إعطاؤه قيمةً أوليةً .

◘ القسم الثاني و هو القسم الذي يحتوي على الشرط الواجب تحققه ليتم تنفيذ الحلقة و بمجرد أن يصبح شرط الحلقة غير محقق ( أي بعد الانتهاء من الرقم 20 ) يقوم بالخروج من الحلقة تلقائياً و تنفيذ الاسطر التالية ضمن التطبيق

◘ القسم الثالث و هو الذي يتم فيه تحديد مقدار الزيادة أو النقصان .و لا يشترط أن يكون i++  فيمكن التحكم به و جعله i +2  على سبيل المثال و عندها ستكون نتيجة التطبيق

Statement 1
statement 3
statement 5
.
.
statement 19

و بإمكانك جعل الـ Expression  كالتالي :

For    (   int i  =  20   ;        i  >=  1   ;    i – –   )

بالتالي قمنا بعكس العملية  , حيث سيبدأ من القيمة 20 و يقوم بالتحقق منها ثم البدء بعملية النقصان 1 ثم 1 ثم 1 ….

 

طباعة جدول الضرب

نستخدم لهذا الغرض حلقة For داخل حلقة For  ثانية .

و عند كتابة حلقة For    داخل حلقة ثانية فلا يجوز تعريف  نفس المتغير ، لأنه كما تعلمنا لا يجوز تعريف نفس المتغير مرتين
و نلاحظ أن + في هذا الـ Exprssion  ليست عملية حسابية ، بل هي لوصل نص مع نص آخر.

و لو اردنا طباعة جدول الضرب كاملا (مئة جملة ) بدون حلقة For  قد تقع في الأخطاء ، فضلاً عن الوقت المهدور

 

يمكننا أيضاً عمل بعض الرسومات باستخدام For Loop
عندما يبدأ التطبيق يبدأ بحالة i = 1
يدخل إلى الحلقة الثانية ، و يسأل هل j = 1   ، نعم صحيح ، فيقوم بطباعة نجمة  ثم الانتقال إلى حالة j = 2
و هي لا تحقق الشرط ( 2 اصغر او تساويi (1)  ) فيخرج من الحلقة و يقوم بتنفيذ تتمة الحلقة الأولى و هي كتابة سطر جديد ،
ثم  يذهب للحلقة الأولى ، و يقوم بعملية الزيادة على i   لتصبح 2
و هي تحقق الشرط ، فيذهب لتنفيذ الحلقة الثانية ويسأل هل  j   أصغر أو تساوي i  (2) ؟ نعم صحيح فيقوم بطباعة ” * ”
ثم يقوم بعملية الزيادة على  j  لتصبح 2 ثم يسأل هل j أصغر او تساوي i(2) ؟ هي تحقق الشرط فيقوم بكتابة نجمة أخرى على نفس السطر ، لأننا استخدمنا الدالة Write  و ليس WriteLine
ثم يذهب للحالة الثالثة و هي لا تحقق الشرط … فيخرج من الحرق الثانية و ينتقل من طباعة النجمات على نفس السطر إلى طباعة سطر جديد ،
و هكذا حتى يصل إلى i  تساوي 10 ليقوم بكتابة 10 نجمات ،
و عندما يصل إلى i = 11 يصبح شرط الحلقة غير محققاً فيقوم بالخروج منها


و هكذا نكون قد تعلمنا استخدام الجملة الشرطية داخل حلقة For  كما تعلمنا استعمال حلقة For  داخل حلقة For  أُخرى

 

نصل إلى نهاية درسنا ، ألقاك في الدرس التالي إن شاء الله

 ملخص الدرس :

مفهوم الحلقة التكرارية:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثاني عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على معنى الحلقة التكرارية for Iteration Statement وكيف يمكننا أن ننفذ أسطر برمجية معينة عدد من المرات بناءاً على تحقق شرط معين

الحلقة التكرارية for Iteration Statement :

لا يخلو أي تطبيق برمجي من تواجد الحلقات التكرارية لما فيها من أهمية وإختصار للوقت والجهد والحصول على نتائج عالية، ومن أشهر الحلقات التكرارية جملة For التي يمكن بواسطتها تنفيذ عدد من الأسطر البرمجية عند تحقق شرط معين، وتتكون هذه الحلقة من 3 أقسام رئيسية هي :
– تعريف متغير الحلقة : حيث يتم هنا تعريف المتغير الذي ستستخدمه الحلقة التكرارية ويتم إعطاءه قيمة أولية أي أننا نقوم بعمل Variable Declaration و Variable Initialization في نفس المقطع
– شرط الحلقة : وسحتوي على تعبير Expression حيث أن الناتج لهذا التعبير سيكون إما قيمة صحيحة True أو خاطئة False وبناءاً عليه ستستمر الحلقة التكرارية بالعمل طالما هذا الشرط محقق
– معدل التغيير : وهو مقدار الزيادة أو النقصان بعد إنتهاء تنفيذ دورة واحدة، ويكون التغيير على المتغير الذي تم تعديله في القسم الأول.

مصطلحات الدرس :

FOR Loop :

Efficient :

Syntax :

Iteration :

increment :

initial :

Two FOR Loop :

post

#11 التعبيرات Expressions – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OSO

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  العوامل والجمل والتعبيرات

العوامل والجمل والتعبيرات:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الحادي عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، سنتعرفُ على كافة أنواع الجمل البرمجية في لغة السي شارب، بالإضافة إلى كافة عوامل Operators اللغة و مفهوم التعبير Expression داخل تراكيب هذه اللغة. كما تعلمنا لبداية مشروع جديد نذهب إلى File ==> New ==> Project ، و سأقوم باختيار #Visual c  و من ثم Console Application ، وتكلمنا سابقاً أن المكان المخصص لكتابة الكود هو بين قوسي الدالة void Main ، سأقوم بتعريف المتغيرات التالية :

int x,   y,   z;

في السطر السابق، تسمى العملية عملية تعريف المتغيرات و تكون طبيعة هذه الجملة هي Variable Declaration  ، و هي جملة برمجية لحجز المتغيرات في الذاكرة، كما تعلمنا في الدروس السابقة، سأتابع وأكتب التالي :

;x  =  6
;y  =  44
;z  =  66

تسمى الأسطر السابقة: أسطر إسناد للمتغير Variables Assignment ، ولكن نتذكر وظيفة هذه الأسطر، دعنا نكتب جملة ملاحظة عنها، و تكلمنا عن كيفية كتابة جمل الملاحظة ، و تكلمنا عن أهمية جمل الملاحظة لتذكيرك بوظيفة الأسطر التي قمت بكتابتها، نكمل كتابة :

x  =  5 + 7;

في السطر السابق، استخدمنا عامل Operator الجمع المسمى Addition operator ، و إذا قمنا باستعمال الإشارات الباقية لعمليات الحساب فستكون كالتالي :

x  =  5 + 7;
y  =  4 – 2;
z  =  10 * 50;
x  =  10 / 2;

وهذه العوامل هي العوامل الأساسية للعمليات الحسابية Mathematical Operators ، أما في حال كانت القيمة المراد اسنادها لمتغير عبارة عن شيء مركب، فيمكن استخدام الأقواس لتحديد ترتيب أولويات العمليات المطلوبة كما في المثال التالي :

x  =  x + y * x – z;

قد تجد أن هذا التركيب للوهلة الأولى غير مفهوم لديك، و قد لا تكون على دراية بكيفية ترتيب العمليات الحسابية، فستسأل نفسك ما هي العملية التي تجري أولاً ، هل y * x ، ثم يتم جمع ناتجهما مع x  ثم يتم لاحقاً طرح z أم ماذا ؟ والحقيقة أن ترتيب الأولويات Order of Operations  هنا يتم باستخدام الأقواس ، حيث يتم إضافة الأقواس لإعطاء أولويات العمليات الحسابية و لتسهيل القراءة . فتصبح هذه الجملة بالشكل التالي :

x  =  ( x + y ) * ( x – z );

و يصبح المعنى ؛ قم بجمع (  x و y ) ثم قم بطرح ( z من x ) ثم قم بضرب الناتجين ببعضهما ، و حدث ذلك لأن الأولوية للأقواس دوماً

 

نكتب الآن :

If ( x == y)
}

{

تعلمنا أنه إذا اردنا أن نقوم بمقارنة ؛ هل قيمة هذا الجانب (x) تساوي قيمة الجانب الثاني (y)

هذا الـ Expression الموجود بين القوسين يسمى Equality operator و هو يقوم بعمل مقارنة بين طرفين و يقوم بإعطاء قيمة منطقية (True or False) و هذا عبارة عن Expression  و ليس عبارة حسابية أو إسناد قيم ، فعندما نرى x = 5 فهذا يعدّ عملية إسناد ، أما اذا رأينا إشارة مساواة مزدوجة فيكون عبارة عن Expression  و تكون القيمة True or False

 

لدينا هنا Expression  جديد يمكن أن نستخدمه ؛ ألا و هو :

If ( x < y )
}

{

هذا الـ Expression يسأل هل x  أكبر من y   ؟

ملاحظة: يخطئ البعض في تمييز الاشارتين أكبر و أصغر (  < & >)

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

و يسمى هذا الـ Expression  بـ ” Greater than operator “

و بالمقابل لدينا الـ Expression  المسمى “Less than operator”

و تكون جهة فم السمكة بالجهة المعاكسة للـ Expression السابق

 

لدينا الآن Expression  جديد ، و هو يسأل هل الطرف الأول x أكبر أو يساوي y

و  نلاحظ أن إشارة المساواة تمت اضافتها بعد العامل Greater than و

يسمى هذا الـ Expression بالاسم ” Graeter or equal operator ” و يكون بالشكل التالي :

if ( x >= y)
}

{

و بالطبع لدينا بالمثل الـ Expression  المعاكس للسابق و يكون بالشكل التالي :

if ( x <= y)
}

{

 و هو يسأل هل الطرف الأول أصغر أويساوي الطرف الثاني ؟ و يسمى Less than or equal operator

 

الآن سوف نتعلم إمكانية عمل أكثر من Condition  داخل الـ Expression  الواحد

تكلمنا سابقاً أن جملة الشرط تحتاج إلى شرط موجود بين القوسين (….)  لتقوم بتحديد هل هو [True or False]

الآن سوف نكتب التالي :

if ( x > y && z > y )
}

{

في هذا الـ Expression يلزم تحقق الشرطين (x > y) و (z > y) حتى تكون نتيجة الشرط ككل True  و يمكن توضيح ذلك من خلال التالي :

True && True = True

True && false = false

False && True = False

False && False = False

 

و في حال كانت النتيجة True  يتم تنفيذ جملة الشرط
و لتسهيل القراءة نستخدم الأقواس كما يلي :

if  (  (x  > y) && (z > y)  )

و يسمى العامل الشرطي ”  و  ” /  Conditional AND operator

 

نذهب الان لدراسة العامل الشرطي ”  أو  ” / Conitional OR operator  

و يكون بالشكل التالي :

if  (  (x  > y) || (z > y)  )

و هو يعني هل التعبير (x > y) أو (z > y) صحيح ؟؟

و يكتفي بتحقق أحد الشرطين لاعتبار النتيجة النهائية True و يمكن تلخيص ذلك كما يلي :

True || True = True

True || false = True

False || True = True

False || False = False

و كما نعلم إذا كانت القيمة النهائية True يتم تحقيق الشرط و البدء بتنفيذه

و الفرق بين ” العامل الشرطي (و) و العامل الشرطي (أو) هو أن العامل الشرطي (و) يتطلب تحقق كلا الشرطين ليعطي النتيجة True  … أما العامل الشرطي (أو) فيكتفي بتحقق أحدهما أو كليهما ليعتبر النتيجة النهائية True.

 

لاختبار ما سبق نكتب

;y = 6
;z = 7

if ( x == y)
}
;Console.WriteLine(“True”)
{

else
;Console.WriteLine(“False”)

;()Console.ReadLine

و يجب أن نضع الدالة Console.ReadLine  لنتمكن من مشاهدة نتيجة التطبيق

و نلاحظ أن كل ما كتبناه سابقاً لن يتم تنفيذه ،  و ذلك لأنه عبارة عن جمل شرطية فارغة

ملاحظة : كما تكلمنا سابقاً اذا كان لدينا تحت if  جملة واحدة فيمكننا إزالة الأقواس

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

نقوم بإضافة الجملة else

else
;Console.WriteLine(“False”)

نعود و نشغل التطبيق
و نلاحظ أن التطبيق أعطانا القيمة False ، و ذلك لأنه بالفعل الشرط لم يتحقق ، حيث أن x لا تساوي y

 

كذلك لدينا بالمثل الـ Condition  الذي يقول هل x لا تساوي  y

و تكون كتابته بالشكل

if ( x != y)
}

{

و لو قمنا بتطبيق هذا الكلام على تطبيقنا السابق لوجدنا النتيجة True  لأنه فعلا x لا تساوي y .

 

لنقم بتطبيق التالي على تطبيقنا السابق

نقوم بتغيير التعبير إلى (x > y) فنجد أن التطبيق سيعطينا False  و ذلك لأن x في الحقيقة أصغر من y

و لو قمنا بعكسه من “أكبر من” إلى “أصغر من” أي (x < y) فسنجد النتيجة True  لأن المقارنة صحيحة

 

الآن سنقوم بتجربة العامل الشرطي && كما سوف نرى :

if (  (z > y)  &&  (y > x)  )
}
;Console.WriteLine(“True”)
{
;()Console.ReadLine

فإذا كان True && True  تكون النتيجة النهائية True و يظهر التطبيق الكلمة True

لنقم بجعل النتيجة False  ، لذلك سنغير (y > x)  إلى (y == x)
عندها تصبح النتيجة النهائية False على رغم تحقق الشرط الأول ، إلا أن العامل && يتطلب تحقق الشرطين سوياً ليصبح True

 

نصل الآن إلى نهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله .

 

ملخص الدرس :

 

الجملة البرمجية Statement :

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

التعبير البرمجي Expression :

خليط بين واحد أو أكثر من : القيم ، المتغيرات ، المعاملات ، الثوابت أو الدوال Methods تقوم لغة البرمجة بتنفيذه أو بتعمل مجموعة عمليات سواء كانت حسابية أو تنفيذية، وهذه بعض الأمثلة عليها :

التعبير الحسابي : x = 5 + 7
إستدعاء الدوال : Console.WrieLine(x)

العوامل البرمجية Operators :

هناك العديد من العوامل البرمجية أكثرها إستعمالاً هي :
– العوامل الحسابية ( الرياضية ) : لإجراء عمليات حسابية والتعامل مع الناتج، وهناك 4 عمليات أساسية هي الجمع + والطرح – والضرب * والقسمة / .
– العوامل المنطقية : هي عوامل غالباً تستخدم في مقارنة قيمتين وأشهرها معامل و ذو الإختصار && And Operator ومعامل أو ذو الإختصار || Or Operator .

مصطلحات الدرس :

Variable Declaration :

Assignment Operator :

Addition Operator :

Mathematical  Operator :

Order of Operations :

Expression :

Greater than Operator :

Less than Operator :

Greater or Equal Operator :

Less than or Equal Operator :

Conditional AND Operator :

Conditional OR Operator :

Condition :

 

post

إستخدام مصادر جاهزة لتطوير لعبتك

إستخدام مصادر جاهزة لتطوير الألعاب، تزيد من كفاءة لعبتك وتقلل وقت التطوير

السلام عليكم ورحمة الله وبركاته

يتناقش معي العديد من المطورين الذين يدخلون عالم تطوير الألعاب عن حلمهم في تطوير فكرة لعبة يعتبرونها مميزة، ويتابعون أن العناصر التي يودون إستخدامها في مرحلة التطوير يجب أن تكون من صنعهم، بالتالي فهم من سيقومون بتصميم النماذج ثلاثية الأبعاد 3D Models على برنامج 3Ds Max أو Maya وهم من سيقومون بعمل هيكلية وتحريك لها Rigging and Animation ، وهم من سيقومون ببناء واجهات اللعبة 2D UI وهم من سيقومون برسم كافة الرسومات التي تحتاجها اللعبة على برنامج Photoshop ، ليس هذا فحسب بل سيقومون بتسجيل و تحرير الأصوات والموسيقى التي ستحتاجها اللعبةـ وفوق هذا كله هم من سيقومون ببرمجة اللعبة نفسها.

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

إبحث عن المصادر الجاهزة

من الأفضل أن تقوم بالبحث أولاً عن شيء قريب لفكرة لعبتك بحيث يتماشى مع الثيم الخاص بها سواءاً كانت لعبة ثلاثية الأبعاد أو لعبة ثنائية الأبعاد، حيث أن هناك العديد من المواقع التي تتيح لك كافة المستلزمات التي تحتاجها في رحلة تطوير لعبتك، سواءاً كانت مدفوعة الأجر أو مجانية، ولعل من أشهر المواقع التي تحتاجها كمطور ألعاب تستخدم محرك Unity هو Unity Asset Store ، الموقع الغني بكل ما تحتاجه سواءاً مجسمات ثلاثية الأبعاد 3D Models أو ملفات حركة Animation أو صوتيات Audio أو برمجيات جاهزة Scripting أو حتى مشاريع كاملة Complete Projects .

 

لم تجد ضالتك في المصادر الجاهزة؟

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

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

الخلاصة 

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

post

الألعاب الإلكترونية ايجابياتها وسلبياتها

السلام عليكم ورحمة الله وبركاته

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

* الألعاب الإلكترونية ، إيجابياتها وسلبياتها؟

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

* هل من أنواع تندرج تحتها ألعاب الفيديو؟

بالتأكيد ، فهناك تصنيفات عديدة لطبيعة ونوع اللعبة أو ما يطلق عليه Game Genres، ولعل أشهرها هو ألعاب المنظور الأول First Person Shooter ذو الإختصار FPS و ألعاب اللعب الجماعية الكبيرة Massively multiplayer online ذو الإختصار المعروف MMO وهناك العديد من الأنواع الأخرى مثل الألعاب الرياضية Sports والألعاب الإستراتيجية RTS وغيرها. للمزيد من الأنواع الأخرى يمكنك زيارة هذه الصفحة.

* أغلب العاب الفيديو أجنبية الصنع.. إلى ما نعزو التقصير العربي بذلك؟

ذلك بسبب قلة الخبرات العربية في هذا المجال وإن وجد تجدهم فرادى تحت مسمى مطور مستقل ( indie Developer ) ، بالإضافة قلة الوعي والإهتمام من أصحاب الأموال والمستثمرين العرب حول هذا المجال، لذلك إنطلقت منصة طورني التي تهدف بشكل أساسي إلى تكوين كادر عربي قادر على منافسة الشركات الكبيرة في هذا المجال.

* الألعاب العنيفة ما هي أخطارها؟

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

* هل تصميم وإطلاق تطبيقات خاصة بالألعاب أمر صعب؟

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

* عادة الأهل لا يهتمون ولا يطلعون على الألعاب التي يلعبها أطفالهم فكيف يمكن تمييز السيء من الجيد؟

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

* كيف يمكننا حماية أجهزة الأطفال من الألعاب السيئة؟

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

* ما هي طبيعة الألعاب المناسبة للأطفال؟

ألعاب تعليم اللغات والكلمات والحروف والحيوانات، حيث أنها تنمي ذكاء الطفل وتشجعه على التعليم بتفاعلية أكثر.

* متى ننتج ألعاب أطفالنا برأيك؟

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

post

#10 الجملة الشرطية IF – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : MHD

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الجملة الشرطية if Statement

الجملة الشرطية if statement:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ العاشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، سنتعرفُ على الجمل الشرطية والتي تعد أهم ركائز البرمجة، وهي ما ستطلق العنان لمخيلتك لكتابة العديد من التطبيقات الحقيقية، فستتعلم كيف تبني منطق logic تكون مخرجاته مختلفة بناءً على قيمةٍ معينة، ويمكن أن تكون هذه القيمة من مدخلات المستخدم بواسطة لوحة المفاتيح، أو قيمة قمنا بمعالجتها بناءً على متغيرات سابقة، وعندما أقول منطق logic، أعني أننا سنقوم بمقارنة شرط معين، وبناءً عليه سنتخذ إجراءات معينة، من خلال تنفيذ قطعة برمجية Code Block مختلفة باختلاف النتيجة.

تطبيق لعبة التخمين:

لإنشاء مشروع جديد، سأقوم بتكرار ما قمنا به في الدروس السابقة، سأذهب إلى قائمة File — > New — > Project، ومن شاشة New Project سأحرص على اختيار Visual C#، ثم اختيار Console Application، سأقوم بعدها بإعادة تسمية هذا المشروع إلى Decisions، ومن ثم نضغط على زر OK، ليبدأ برنامج الـ Visual Studio بتهيئة مشروع جديد، سأقوم بكتابة لعبة بسيطة، وسأبدأ بالكتابة داخل قوسي Static void Main في السطر رقم 13، يمكنك إيقاف الفيديو بعدما أقوم بإنهائه، لتتمكن من متابعتي:

	public static void Main()
	{
		    Console.WriteLine("**Osama's Big Givaway**");
            Console.Write("Choose 1,2 or 3 : ");
            string userValue = Console.ReadLine();

            if (userValue == "1")
            {
                string message = "Wow!! You won a new car";
                Console.WriteLine(message);
            }

            Console.ReadLine();
	}

لا ننسى أن نقوم بحفظ التطبيق، أو يمكننا تجاوز ذلك بتنفيذ التطبيق. لو قمنا بتنفيذ التطبيق، سنجد جوائز قيمة من العم أسامة، ويطلب التطبيق من المستخدم إدخال إحدى الأرقام التالية: 1 أو 2 أو 3، فلو قمتُ بإدخال القيمة 1 والضغط على زر Enter، ستجد رسالة “واو لقد رَبِحْتَ سيارة جديدة”، لا تخف من نفاذ الكمية ستحصل على السيارة الخاصة بك. ثم سأضغط على زر Enter لينتهي التطبيق، سأقومُ بتنفيذه مرةً أخرى فأنا أود الحصول على جوائز كبيرة أخرى، سأدخل الرقم 2، ستجدُ أنه لم يحصل شيء، ولو قمنا بتنفيذه مرة أخيرة وأدخلنا رقم 3 أو أي شيء آخر، ستجد أنه أيضاً لم يطبع أي شيء.

جملةُ اتخاذِ قرار Decision Statement :

دعنا الآن نشرح التطبيق ونتكلم عن الجملة الشرطية if Statement، التي قمت بكتابتها في الأسطر 17 إلى 21، والتي هي هدفنا الأساسي من هذا الدرس، فالجملة الشرطية if Statement، تسمى جملةُ اتخاذِ قرار Decision Statement، لأننا سنتخذ قرار بواسطتها لتنفيذَ أسطرٍ برمجيةٍ داخل الأقواس التالية، بناءً على نتيجة الشرط الموجود بين الأقواس هنا، ففي هذا المثال سيقوم التطبيق بالتحقق من القيمة التي سيدخلها المستخدم، بواسطة الدالة ReadLine التي تعرفنا عليها في الدروس السابقة، ومن ثم إسناد القيمة إلى المتغير userValue من النوع string، وبناءً على القيمة سيقوم التطبيق بعمل مقارنة مع النص “1”، بشكل بسيط هذه الجملة تعني: هل قيمة المتغير userValue تطابق القيمة “1”؟

ستلاحظ أيضاً أنني استخدمت علامتي مساواة، وليس علامة واحدة، ففي الدروس السابقة تعرفنا أن إشارة المساواة المفردة =، هي إشارة إسناد Assignment Operator،  فنحن نقوم بإسناد قيمة ما قام المستخدم بإدخاله، إلى المتغير userValue باستخدام إشارة المساواة. لكننا عندما نقوم باستخدام إشارتي مساواة متتاليتين، فإننا نقوم بعمل مقارنة تطابق بين القيمتين، فإن كانتا متطابقتين ستكون النتيجة صحيحة True، وإن لم تتطابقا فستكون النتيجة خاطئة False. وفي حالة المطابقة، أي أن النتيجة كانت صحيحة True، سيقوم التطبيق بتنفيذ القطعة البرمجية الـ Code Block، التي تتبع الجملة الشرطية مباشرةً، أما إن لم تتطابق القيم وكانت النتيجة خاطئة False، فإن التطبيق سيقوم بتجاهل القطعة البرمجية التي تتبع الجملة if statement، وسيقوم بمتابعة تنفيذ الأسطر بعد أن يتخطاها.

الجملة الشرطية else if :

ستجد أن لعبتنا ناقصة، فلا يوجد جوائز لمن قام بإدخال رقم 2 أو رقم 3، أيضاً ماذا إن قام المستخدم بإدخال قيمة 4 مثلاً أو أي قيمة أخرى؟ نحن بحاجة لضبط كافة الاحتمالات التي سيقوم المستخدم بإدخالها، لذلك دعني أكمل كتابة الأسطر البرمجية، من خلال كتابة else if  أسفل القطعة البرمجية الخاصة بجملة if الأولى، وسأقوم بكتابة ذلك كالتالي:

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

        if (userValue == "1")
        {
			string message = "Wow!! You won a new car";
            Console.WriteLine(message);
        }
		else if (userValue == "2")
        {
			string message = "Wow!! You won a new boat";
            Console.WriteLine(message);
        }
		else if (userValue == "3")
        {
			string message = "Wow!! You won a soup";
            Console.WriteLine(message);
        }

        Console.ReadLine();
	}

كما ترى أنه يمكن إستخدام جملة else if في حال أردنا مقارنة قيم أخرى، ففي تطبيقي هنا قمت باستخدام اثنتين منهما، فإن لم يتحقق الشرط الأول،  سيقوم التطبيق بالانتقال إلى الشرط الثاني، وإن لم يتحقق الشرط الثاني، سينتقل إلى الشرط الثالث وهكذا، بحسب عدد جمل else if التي قمتَ بكتابتها، لكن إن تحقق الشرط الأول، فلن يقوم بالتحقق من الشروط اللاحقة، وسيقوم بتنفيذ الأسطر من 18 إلى 21 ومن ثم الانتقال إلى السطر 33 مباشرة، بالمثل إن كان ناتج المقارنة في الجملة الشرطية الأولى في سطر 17 False، سينتقل للتحقق من الشرط الثاني في السطر 22 فإن تحقق الشرط، سيقوم بتنفيذ الأسطر من 23 إلى 26، ثم سيقوم بالانتقال مباشرة إلى السطر 32 وهكذا. دعنا الآن نقوم بتنفيذ التطبيق مرة أخرى لنرى ماذا سنحصل إن أدخلنا الرقم 2، والرقم 3.

أما في حال قمتُ بإدخال رقم 4 أو أي شيء آخر، ستجد أن التطبيق لا يطبع شيء، وهنا يأتي دور الجملة الشرطية else statement، حيث أن التطبيق سينفذها في حال عدم تحقق أي شرط قمنا بكتابته سابقاً، وهي ما نطلق عليه اسم Catch all case.

الجملة الشرطية else :

ولفعل ذلك سأقوم بكتابة جملة else statement، بعد كل الجمل الشرطية التي قمنا بكتابتها، أي في السطر رقم 32 سأقوم بكتابة:

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

        if (userValue == "1")
        {
			string message = "Wow!! You won a new car";
            Console.WriteLine(message);
        }
		else if (userValue == "2")
        {
			string message = "Wow!! You won a new boat";
            Console.WriteLine(message);
        }
		else if (userValue == "3")
        {
			string message = "Wow!! You won a soup";
            Console.WriteLine(message);
        }
		else
		{
			string message = "wrong choice";
            Console.WriteLine(message);			
		}

        Console.ReadLine();
	}

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

أكثر إنتاجية more Efficient :

بعد الانتهاء من شرح الجملة الشرطية if statement، ستجد أني قمت بكتابة العديد من الأسطر المكررة، وقمت بكتابتها بشكل مقصود، لنتعلم معاً كيف يمكنك أن تكون مطوراً أكثر فاعلية more Efficient، في كتابة أسطرك البرمجية، فهناك العديد من الأسطر التي يمكنك تعديلها بل الاستغناء عنها نهائياً،  فأكثر جملة قمتُ بتكرارها هي جملة الطباعة:  Console.WriteLine

حيث أني قمت بتكرارها في الأسطر: 20 و25 و30 و35، ولأنها موجودة في كل الشروط، سيتم تنفيذها على كل الأحوال، بالتالي يمكنني وضعها بعد كل الجمل الشرطية مرة واحدة فقط، سأقوم بوضعها في السطر رقم 38 وحذف كل التكرارات السابقة، لكن بعد فعل ذلك ستجد أن هناك خط أحمر متعرج، ظهر تحت المتغير message في السطر 35، وهو دليل على وجود خطأ في هذا المتغير، ولو قمنا بوضع مؤشر الفأرة عليه، سنحصل على رسالة مفادها أن هذا المتغير غير معرف في النطاق الحالي، سنتحدث عن النطاقات scope في دروس مقبلة إن شاء الله، لكن لتوضيح الخطأ بشكل مبسط، يجب أن تعرف أنه عند حجز متغير داخل قطعة برمجية، لن يكون متاح خارج هذه القطعة، بمعنى آخر أنك لو قمت بحجز متغير داخل قطعة برمجية، تبدأ بقوس وتنتهي بآخر لن يكون هذا المتغير متاح خارج هذه الأقواس، ولحل هذه المشكلة يتوجب علينا تعريف هذا المتغير خارج القطعة البرمجية الحالية، بالتالي سيكون متاح لكل القطع البرمجية الداخلية، لذلك قبل بداية الجمل الشرطية سأقوم بحجز المتغير message، وإسناد قيمة أولية فارغة له،

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

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

		string message;
        if (userValue == "1")
			message = "Wow!! You won a new car";
		else if (userValue == "2")
			message = "Wow!! You won a new boat";
		else if (userValue == "3")
			message = "Wow!! You won a soup";
		else
		{
			message = "wrong choice";	
			message = message + ", You Lose!!";
		}
		
		Console.WriteLine(message);	
        Console.ReadLine();
	}

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

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

الجملة الشرطية المختصرة conditional operator :

سأقوم بتحويل الأسطر السابقة إلى فقرة ملاحظة، لأننا سنتعرف إلى شكل مبسط للجملة الشرطية إن أردنا مقارنة قيمة واحدة فقط، وذلك باستخدام إشارة جديدة تسمى conditional operator، وسأقوم بنسخ الثلاث أسطر الأولى لأني سأستخدمها مرة أخرى، وسأكتب الأسطر التالية :

	public static void Main()
	{
		/*
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

		string message;
        if (userValue == "1")
			message = "Wow!! You won a new car";
		else if (userValue == "2")
			message = "Wow!! You won a new boat";
		else if (userValue == "3")
			message = "Wow!! You won a soup";
		else
		{
			message = "wrong choice";	
			message = message + ", You Lose!!";
		}
		
		Console.WriteLine(message);	
		*/
		
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();
		
		string message = (userValue == "1") ? "car" : "nothing";
        Console.Write("you won ");
        Console.Write(message);
        Console.Write(".");
		
        Console.ReadLine();
	}

في السطر رقم 40، قمت بحجز متغير وإسناد قيمة له بناء على قيمة userValue، فبعد إشارة المساواة الـ Assignment operator، وضعت مقارنة داخل القوسين بواسطة إشارة المساواة مرتين، حيث سيكون ناتج المقارنة إما صحيح true أو خاطئ false، بعدها بواسطة إشارة السؤال التي تسمى conditional operator، وضعت قيمتين، حيث سيتم إسناد القيمة الأولى إن كان ناتج المقارنة true، أو سيتم إسناد القيمة الثانية إن كان ناتج المقارنة خاطئ false، دعنا ننفذ التطبيق وندخل 1، ستجد أني ربحت سيارة، وإن نفذناه مرة أخرى وأدخلت أي شيء آخر سأربح لا شيء. وهذا هو الشكل المختصر للجملة الشرطية، لكني لا أحبذ استخدامه لأنه مبهم قليلاً، ولأن الجملة if statement أقرب لفهم الإنسان منها، ولكن وجب علي تبيانها لك في حال شاهدتها لاحقاً في أي تطبيق آخر.

الإستبدال بواسطة الـ Replacement code :

الآن في الأسطر 41 و 42 و 43، ستلاحظ أني قمت بطباعة نصوص باستخدام Write method، لتبقى على نفس السطر، وتعمدت فصلها في 3 جمل لأنني سأعلمك طريقة، ستسهل عليك عملية ربط النصوص في حال كان هناك متغير في وسطها، فلا داعي لأن تقوم بربط 3 نصوص باستخدام إشارة الربط + مرتين، فيمكنك إستخدام الـ Replacement code ، حيث سيتم استبدال الرقم صفر مع القوسين بالقيمة التي تتبع الفاصلة، ولو قمت بتنفيذ التطبيق ستجد نفس القيمة المتوقعة. بإمكانك أيضاً طباعة قيمتين، فلو قمت بالتنفيذ، ستجد أنه قام باستبدال {0} بقيمة المتغير userValuse، وبالمثل قام باستبدال {1} بقيمة المتغير message، كما يمكنك إضافة العدد الذي تريد من الـ Replacement code.

لعلك تسأل الآن: لماذا بدأنا بالرقم صفر بين الأقواس؟ أليس الأصح أن نبدأ من الرقم واحد؟ الحقيقة أن لغة السي شارب تبدأ العد من الرقم 0، وتستخدم ذلك في كثير من الأمور كما سنتعلم في دروس متقدمة إن شاء الله، لذلك يطلق على لغة الـ C# اسم Zero based Language، أي أن نقطة العد فيها يبدأ من 0 وليس 1.

تهنئة وطلب :

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

مهمة لك :

في الختام، سأطلب منك كتابة تطبيق يسأل المستخدم عن فئة عمره، حيث ستجعلهُ يختار من 4 فئات ( يعني يدخل “1” أو “2” أو “3” أو “4” ):
الفئة الأولى: إن كان عمره 15 سنة أو أقل،
الفئة الثانية: إن كان عمره بين 16 و 25،
الفئة الثالثة: إن كان عمره بين 26 و 40،
والفئة الأخيرة: إن كان عمره 41 أو أكثر،
وبناءً على فئته ستقدم له نصيحة مناسبة له، فمثلاً لو كان عمره أقل من 15 سنة وأدخل الرقم “1” ستنصحه بالإكثار من تناول الشوربة اللذيذة وهكذا. قم بإرفاق النتيجة على حسابك الشخصي مع عمل Mention لحسابي الشخصي وإرفاق #طورني. نصل إلى نهاية هذا الدرس، ألقاك في الدرس التالي إن شاء الله.

 

مصطلحات الدرس :

if Statement : الجملة الشرطية التي تنفذ أسطر معينة إذا تحقق الشرط
Conditional Operator : شكل مختصر جداً للجملة الشرطية والمعامل يكون علامة ( ؟ ) بدلاً من كلمة if
 Logic : جملة منطقية بمعنى الناتج إما ( صحيح ) أو ( خاطئ)
Decision Statement : جملة قرار تنفذ شء إذا كان الشرط صحيح
Code block : قطعة برمجية تبدأ بقوس وتنتهي بقوس آخر، وفي بعض الأحيان يكون لها إسم
static void Main : الدالة الرئيسية التي يقوم التطبيق بالبدء منها
Assignment Operator : عامل المساواة وال1ي يقوم بعملية إسناد القيمة على اليسار إلى القيمة التي على اليمين
True : شرط صحيح
False : شرط خاطئ
evaluation : تقييم ومحاولة مساواة
else if: جملة تأتي بعد جملة if لتضع شرط ثاني في حال لم يتحقق الشرط الأول
else : الجملة التي يتم تنفيذها إذا لم يتحقق كل الشروط التي قبلها
catch all cases : وهي جملة else
 Efficient : طريقة نموذجية
Replacement Code : طريقة لإضافة متغير داخل نص بدلاً من إضافة رمز الوصل +