Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

ورشة عمل لعبة من نوع Shoot 'em Up

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • ورشة عمل لعبة من نوع Shoot 'em Up

    السلام عليكم ورحمة الله وبركاته
    خلال الفترة السابقة كنت اقوم بكتابة ورشة لصنع لعبة Shoot 'em Up باستخدام محرك Unity 5، واليوم والحمد لله انتهيت منها.
    تناقش الورشة تصميم اللعبة بدءاً من وثيقة التصميم الى عمل منصب اللعبة. وتستهدف الورشة المطورين في المرحلة دون المتوسطة.
    على كل حال كامل تفاصيل الورشة موجودة في ملف الورشة على شكل PDF بحوالي 169 صفحة.

    ملفات الورشة (جميع الملفات مرفوعة على Google Drive لذا لا روابط مختصرة او اعلانات ومشابه):
    • ملف الورشة بصيغة PDF من هنا.
    • اللعبة النهائية نسخة الويندوز (أرشيف مضغوط وليس منصب) من هنا.


    اتمنى ان يكون الموضع موضوع نقاش حول كامل اجزاء الورشة مثل اللاعب، الاعداء، القوائم، المعمارية المستخدمة، كي يكون الموضوع مميز وذا كمية معلومات كبيرة.

    محتويات الورشة:
    -وثيقة تصميم اللعبة
    -معمارية اللعبة
    -تصميم اللاعب
    -تصميم العدو الاول
    -تصميم العدو الثاني
    -تصميم زعيم الاعداء
    -تصميم مدير اللعبة ومدير الاعداء
    -تصميم الاضافات Power Ups
    -تصميم المؤثرات المرئية
    -تصميم المؤثرات الصوتية
    -تصميم العناصر المرئية داخل اللعبة ونظام الرصيد
    -تصميم قوائم اللعبة
    -عمل Optimization وDebugging
    -نشر اللعبة وعمل منصب متعدد المنصات

    في حال وجود اي اخطاء ارجو ان تعلموني بها كي اقوم بتصحيحها وتحديث الورشة لاحقاً.
    قراءة طيبة.
    التعديل الأخير تم بواسطة MohammadT3d; 21 / 08 / 2015, 12:10 AM.
    عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

  • #2
    قرات بداية الكتاب و صراحة عجبنا ,ان شاء الله راح اكمل قرائتة و راح ابعثلك بعض الاسئلة بخصوص البرمجة , في البداية لاحظت انك استخدمت مفاتيح ادخل بشكل مباشر لتحديد اتجاة الحركة , كان فيك تستخدم Horizontal و Vertical و كان فيك تحدد الاتجاة الموجب و السالب في الشرط مثلاً

    if(Input.GetAxis("Horizontal " > 0)
    و تكتب جواب الشرط تبعة بهذا الشكل , لكن حابب اسألك شيئ سريع , انا واجهتنا مشكلة ان الكائن لما ينظر لى الماوس على محور z ينظر الية من الجانب الموجب يعني 90 درجة فقط , انا تكلمت مع بعض الناس بخصوص المشكلة دي و قالوا لي استخدم Mahtf.Lerp , صراحة استخدمتها و مش عارف وش المشكلة .



    Ray ray = Camera.Main.ScreenPointToRay(Input.mousePosition);

    RayCastHit hit;

    if(Physics.RayCast(ray, out hit,Mathf.Infiniti))
    {
    transform.LookAt(hit.Point);
    transform.eulerAngles = new Vector3(0,0,transform.eulerAngles.x);
    }
    مدونتي Home OF Games تهتم بتطوير الألعاب
    قناتي
    YouTube

    لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
    .

    تعليق


    • #3
      اهلاً اخي عماد واتمنى ان تكثر من طرح الاسئلة عن الورشة وبأن تنال اعجابك.
      بالنسبة طريقة Input.GetAxis هي طريقة شائعة وسهلة ولكن فضلت التكلم اكثر عن ال Vector3 بشكل اكبر وكيفية التعديل عليها، وستلاحظ هذا الامر في بقية الورشة حيث انني فضلت طرق على طرق فقط رغبة مني بالمرور عليها، وفي نهاية الورشة ذكرت بأنه في عالم الالعاب يمكن عمل الشيء الواحد بعدة طرق وهو امر جميل جداً ويسمح للمبرمج باختيار ما يناسبه وما يعتاد عليه.
      بالنسبة لمشكلتك فحسب خبرتي الدالة Transform.LockAt لا تستخدم للالعاب ثنائية الابعاد لأنها ستجعل الجسم يدور بشكل جانبي، ويوجد العديد من الطرق للقيام بذلك باستخدام Vector3 او Quaternion ولكن في الورشة نفسها في فقرة حركة اللاعب اتحدث عن تدوير الاعب نحو الفأرة واستخدمت طريقة النسب المثلثية وهي بسيطة جداً جربها، واذا لم تنجح معك سأقدم لك طرق اخرى لتدوير جسم نحو نقطة معينة (والتي هي في حالتك الفأرة).
      عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

      تعليق


      • #4
        اولا شكرا على الرد اخي صراحة كتاب مرة روووعة . قرائت جزء بسيط منة و راح استكمل الباقي . بالنسبة لاستخدام المتغير transform
        Lookat هو اني قد جربت جميع الطرق صحيح انة في اكثر من طريقة علشان احل المشكلة تبعي لان طرحت المتغير. دا فقط على ما احصل حل نهائي و للعلم ان بعد اطلاق اللعبة راح استهدم متغير ثاني و اعرف ان lookat ليس هو الحل في الالعاب 2D. ياريت لو كان عندك فيس علشان اتواصل معك و للعلم فقط انني عندي خبرة في البرمجة و مش مبتدئ بس حابب استفسر منك عن بعض الاكواد و لاحظت في كتابك انك استخدمت بغض الدوال الموجودة في مستندات الاسكربتنج في اليونتي للعلم فقط انني جزعت عليها بس ماعرف وش وضيفتها وكيف راح تفيدنا ع العموم لو عندك فيس ياريت تعطينا عنوانك و لو حابب تشوف اللعبة تبعي اكتب في اليوتيوب Cannon of Lights تحديث رقم ٣
        راح تشوف الفيديو .و لو حابب تستفسر عن اللعبة ياريت تتواصل معي عبر الفيس بوك دا حسابي .
        www.facebook.com/EMAD.Unity3D
        مدونتي Home OF Games تهتم بتطوير الألعاب
        قناتي
        YouTube

        لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
        .

        تعليق


        • #5
          اخي عماد صراحة لا امتلك حساب فيسبوك ويمكنك التأكد من ذلك في مدونتي حيث وضعت حساب التويتر فقط، ولكن ان لدي بريد gmail يمكنك التواصل معي من خلاله عن طريق Hangouts، ولكن اذا كانت الاستفسارات حول الورشة فيفضل ان نضعها هنا كي يستفيد الجميع.
          بريدي: mohammadT3d@gmail.com
          عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

          تعليق


          • #6
            اوك مش مشكلة , راح اطرح عليك الاسئلة تبعي هنا اصلاً في متغيرات ماعندي فكرة عن طريقة استخدامها في اليونتي رغم اني مريت عليها .
            السؤال الاول : انت استخدمت Mathf.Atan2 علشان تظهر ال tan الموجود بين المحوري x,y اي انك تظهر الوتر , و صراحة استخدامك كان مضبوط 100% مع العلم ان درس دائرة الوحدة و عارف استخرج الوتر بس في البرمجة ماعندي فكرة , و عرفت من خلال شرحك ان Red2Deg هو المتغير الي ينقلك من وحدة الراديان الى الدرجات , سؤالي هنا كيف اعرف ان الراديان راح يعملي مشكلة في الحركة اي لو ما استخدمت Red2Deg وش الي كان راح يحصل ؟؟

            سؤالي الثاني : الصراحة انا ماعندي فكرة كبيرة عن استخدام دالة FixedUpdate , للعلم اني قرات عليها و عرفت انها تستخدمت للتعامل مع متغيرات Rigidbody , لكن ياريت تعطينا فكرة اكبر عليها .

            سؤالي الثالث : صراحة ماعندي فكرة كبيرة عن foreach مع العلم اني استخدمتها لعمل ContectPoint في لعبة اي اني استخدمت كلاس ContectPoint فيها بغض النظر عن فهم طريقة عمل الجملة لاني نقلتة من فيديو بشكل مباشر ...

            سؤالي الرابع و الاهم : لاحظت في الصفحة 38 في برمجة صحة العدو انك استخدمت دالة IEnumerator صراحة انا شفت فيديو في اليوتيوب من موقع اليونتي ان دالة تتيح لك عمل تحمل لل Load قبل الدخول الى اللعبة يعني مثلاً انا حالياً العب في المستوى الاول هو في نفس الوقت يحمل المستوى الثاني علشان ادخلة بسرعة , للعلم اني استخدمت اللدالة في يونتي 4 و طلب مني استخدام يونتي برو علشان تعمل الدالة و حالياً استخدم يونتي 5 و الدالة شغالة بس ياريت تعطينا فكرة عن آلية عمل الدالة و ليش انا استخدم yield return في نفس الوقت فيها .

            و سؤالي الخامس و الاخير : هو كيف اقدر استخدم return ههههه لا تضحك علي صراحة ما عرفت كيف استخدمها اكثر من مرة اصلاً ما درست جافا و للعلم ان لي فترة طويلة اتعلم البرمجة في اليونتي و عندي خبرة في البرمجة لكن في اشياء ما افهمها و صراحة اشياء كثيرة تعلمتها من كتابك و خاصة طريقة استخدام Mahtf اكثر من مرة و بعض المتغيرات فيها الي ما فهمتها صراحة عرفتها في كتابك .

            و اشكرك الف شكر على هذا الكتاب الجميل و ياريت لو تعمل كتاب تشرح فيه المتغيرات و الدوال الي ما نفهمها علشان تعم الفائدة الجميع .
            مدونتي Home OF Games تهتم بتطوير الألعاب
            قناتي
            YouTube

            لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
            .

            تعليق


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

              السؤال الثاني: في الصفحة 18 ستجد شرح مفصل ل Fixed Update والفرق بينها وبين ال Update وإن احتجت الى معلومات اكثر فسأجيبك.

              السؤال الثالث: foreach هي حلقة تكرارية في لغة السي شارب، ووظيفتها الدوران على جميع عناصر Container ما مثل مصفوفة او List (ولنكن ادق على اي فئة تطبق ال IEnumerabler)، واحد واحد لذا لا حاجة لوضع سقف علوي مثل ما نفعل في حلقة for، ولكن foreach لا تسمح لك بالقفز على عناصر محددة من خلال تحديد قيمة المتغير i مثل حلقة for، كما انها تمشي بشكل خطي موجب يعني (n+1) فلا يمكنك العودة للخلف، ولكنها ببساطة مريحة جداً في حال احببت الدوران على جميع عناصر container ما، وهذا شكلها:
              كود:
              int[] myInts = {4, 52, 23, 524, 1};
              
              foreach(int myInt in myInts)
              {
              	Debug.Log(myInt);
              }
              كما تلاحظ سييتم الدوران على جميع العناصر دون الحاجة منك ان تدخل عدد العناصر او ما شابه وسيتم طباعة قيمة كل عنصر لكونسول اليونيتي.
              ولكن في اليونيتي يوجد مشكلة في حلقة ال foreach لذا لا يجب استخدامها ووضحت ذلك في القسم قبل الاخير من الورشة واوضحت عيوبها على الاداء.

              السؤال الرابع: في الصفحة نفسها ذكرت ما هي الدالة، ولكن ربما الشرح موجز، المهم هذه الدالة تسمى Coroutine وهي دالة يمكنك ايقاف تنفيذها لمدة معينة وهو مالا تقوم به الدوال العادية فإي دالة متى ما استدعيتها لا يمكنك ايقافها.
              يتم ايقاف ال Coroutine عن طريق yield return ويتم تحديد مدة الايقاف بالعبارة التي تأتي بعد ال yield return فاذا كانت null فيعني ان توقف التنفيذ لمدة فريم واحد، بينما WaitForSeconds توقف التنفيذ لعدد محدد من الثواني انت تحدده، ويوجد غيرهم، وبالنسبة لشاشة التحميل فقمت بوضع مثال كامل عن عمل شاشة التحميل ستجد في فقرة شرح قوائم اللعبة، وفي الواقع ما كان ممنوعاً في اليونيتي 4 هو الدالة LoadLevelAsync وليس ال Coroutine.
              كي تحترف ال Coroutines قم بتجربتها عدة مرات وبعدة اشكال وابحث عن امثلة، فهي بسيطة جداً ومفيدة جداً.

              السؤال الخامس: كل دالة في السي شارب يمكن ان تعيد قيمة، يعني لنقل بأنك تعطيها بيانات، فتعالج البيانات ومن ثم تعيد لك نتيجة المعالجة، كأبسط مثال دالة الجمع تعطيها رقمين فتعيد لك ناتج الجمع. المهم في السي شارب الدالة يمكن ان تعيد شيء او يمكن الا تعيد، ونوع الاعادة يتم وضعه في تعريف الدالة:
              كود:
              returnType methodName (arguments)
              {
              	
              }
              الآن void تعني بأن الدالة لا تعيد شيء، int يعني بأنها يجب ان تعيد عدد صحيح وهكذا. جملة الاعداة تكون باستخدام كلمة return وبعدها قيمة الاعادة والتي يجب ان يكون نوعها مماثل للنوع المحدد في تعريف الدالة.
              خذ مثال الدالة Vector3.Distance والتي تعيد لك float لاحظ تعريفها:
              كود:
              public static float Distance(Vector2 a, Vector2 b);
              كما تلاحظ فإن نوع قيمة الاعادة هو float، فأنت ببساطة تعطيها متجهين وتعيد لك المسافة بينهما (باعتبار كل متجه سيمثل نقطة).
              لاحظ هذا الكود:
              كود:
              float distance = Vector3.Distance(point1, point2);
              الم تلاحظ كيف ساوينا بين متغير ودالة، والسبب اننا ساوينا بين المتغير والقيمة التي تعيدها لنا الدالة. ببساطة راجع اكوادك وستجد كيف ان الكثير من الدوال تعيد والكثير ايضاً لا تعيد شي يعني void وستفهم الامر تماماً.
              ملاحظ اخيرة هي ان return يجب ان تكون آخر جملة لأنه لن يتم بعدها تنفيذ اي سطر لذلك يضعها المبرمجون في دوالهم للخروج من التنفيذ عند حصول شرط معين مثلاً:
              كود:
              public void Movement()
              {
              	if(isDead)
              		return;
              	
              	//Move the player
              }
              اذا واجهتك المزيد من الاسئلة فلا مشكلة على الرحب والسعة اسئل قدر ما تشاء، واذا لم تفهم تماماً نقطة ما او عدة نقاط فساشرحها لك بتفصيل اكبر ان شاء الله.
              عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

              تعليق


              • #8
                الف شكر على الاجوبة صراحة افدتنا كثير , للعلم فقط انا اعمل على لعبتي و ما ولجهتنا اي مشاكل مع العلم اني استخدم الدوال الطبيعية الموجودة معي Start و Update و ما استخدمت اي دالة ثانية كـ IEnumerabler حتى اني ما استخدمت foreach ولا return , حابب استفسر عن شيئ انا اعمل على لعبتي في جهاز لابتوب صعيف نسبياً لكن لا بأس رغم ان العمل يجري بشكل بطيئ في البرنامج بسبب ضعف الجهاز , لكن لما عملت فحص للدوال و اي الدوال تحسب اكثر ظهر ان دالة Update تأخد 27% من total , حالياً ما عندي فكرة عن هذا و المشكلة الكبرى ان الانترنت هو العائق الرئيسي بيني و بين الدروس , لكن انا دائماً ارجع الى اسكربتينج اليونتي و اقرا الدوال و المتغيرات دائماً ما ادخل الى الموقع لكن بعض الدوال اجد انة مالها شرح تفصيلي , حابب استفسر لو عندك فكرة عن نظام حفظ الملفات Bin طريقة استخدامة في اليونتي , لاني قبل كدا استخدمتة علشان احفظ الاسكورات و ما عمل و للعلم اني شفت فيديوهات في النت و الاحظ ان بعد استخدام نظام Bin تظهر ملف بأسم Bin بعد تصدير اللعبة !
                مدونتي Home OF Games تهتم بتطوير الألعاب
                قناتي
                YouTube

                لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
                .

                تعليق


                • #9
                  سؤال انت دارس لغة برمجة قبل كدا ؟
                  مدونتي Home OF Games تهتم بتطوير الألعاب
                  قناتي
                  YouTube

                  لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
                  .

                  تعليق


                  • #10
                    ان شاء الله تكون قد فهمت جميع المواضيع، واتمنى منك ان تستخدم هذه الامور لأنها ستسهل عملك كثيراً.
                    بالنسبة لكمية الاستهلاك فالامر لا يعتمد على النسبة المئوية بل على الثواني، فمثلاً 90 بالمئة من 1 ميلي ثانية هو مقدار بسيط جداً، هذا امر، امر آخر هو ان عملية ال Rendering وعمليات الفيزياء قد تكون بسيطة في اللعبة (رغم انها تأخذ 73 بالمئة) ولذلك سيكون من العادي ان تأخذ Update نسبة كبيرة (لاحظ انني اقول نسبة وليس وقت)، اما بالنسبة لضعف المعالج فإن هذا الامر غير وارد لأنه اذا كان المعالج ضعيف فإن كل العمليات سيزداد وقت تنفيذها.
                    على كل حال كما قلت لك، اولاً تأكد من الوقت فقد يكون وقت الفريم قصير جداً وبالتالي من الطبيعي ان تزداد النسبة، ومن ثم قم بعمل بروفايل detailed للسكريبتات واستكشف اين يضيع الوقت فقد يكون هنالك دالة تستهلك وقت كبير او ما شابه.
                    عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

                    تعليق


                    • #11
                      صراحة انا درست لغة السي شارب بشكل كبير ومن بعدها انتقلت الى اليونيتي واجدها الطريقة الافضل لاحتراف اليونيتي.
                      عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

                      تعليق


                      • #12
                        بالنسبة لسؤالك عن نظام الحفظ، فإنك يجب ان تفهم الموضوع بشكل اكبر، الامر كله يعتمد على عملية ال ......ize، يعني حفظ الفئات الخاصة ب على شكل بايتات (او اشكال اخرى) كي تقوم بنقلها مثلاً او تخزينها او استعادتها لاحقاً، ويوجد في السي شارب عدة انواع من ال ......ization واشهرها ال Binary (التحويل الى بايتات) وال XML (التحويل الى ملف XML) وال SOAP (معيارية محددة لل XML).
                        المهم، الاشهر في اليونيتي هما ال Binary وال XML ويتم استخدام فئات مثل System.Runtime.......ization.Formatters.Binary.BinaryFormatter او System.Xml.......ization.Xml......izer كي يتم تحويل الكائن الى الصيغة المخصصة.
                        للاسف فإن الموضع طويل ويحتاج الى مقالة كاملة قد اقوم بها في المستقبل، ولكن من الافضل ان تجرب الامر في السي شارب لوحدها خصوصاً ان المصادر على الانترنت وافرة عن ال ......ization في السي شارب (كبداية عليك بال MSDN) ومن ثم طبق الامر على اليونيتي، ولكن لا تخف الموضع سهل، بالتوفيق.
                        عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

                        تعليق


                        • #13
                          اشكرك اخي على اردود الرائعة صراحة استفدت منك و الى الان مازلت اقراء كتابك و صراحة في اشياء ما فهمتها لانة ماعندي فكرة عنها ياريت تعمل كتاب يشرح الدواف و و امتغيرات الي تطرق لها المبرمجين و شكرا
                          مدونتي Home OF Games تهتم بتطوير الألعاب
                          قناتي
                          YouTube

                          لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
                          .

                          تعليق


                          • #14
                            لا مشكلة اخي عماد، اسأل بقدر ما تشاء طالما انني اعرف الاجابة فلن اكتمها على احد، وان شاء الله سأحاول نشر دروس متنوعة في المستقبل القريب.
                            عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

                            تعليق


                            • #15
                              مرحبا اخ محمد صراحة كتابك رائع
                              الشكر الجزيل لك في البداية على المقالات المترجمة
                              و الشكر لك مرة ثانية على هذا الكتاب الرائع
                              بعيدا عن البرمجة التي ارى انك متميز فيها
                              لقد عرفت من الكتاب معلومات قيمة عن اليونتي خصوصا محرك الفيزياء وطريقة التعامل معه التي طالما واجهت مشاكل معها خصوصا في لعبتي الاخيرة

                              تعليق

                              يعمل...
                              X