الحمد لله الذي نالت الورشة رضاك وافادتك، وهنالك ورشات قريبة ان شاء الله ستناقش المواضيع المتقدمة في اليونيتي والتي نادراً ما تم تغطيتها باللغة العربية.
إعـــــــلان
تقليص
لا يوجد إعلان حتى الآن.
ورشة عمل لعبة من نوع Shoot 'em Up
تقليص
X
-
موضوع رائع الي ابعد الحدود وافادني كثيرا خصوصا وان معلوماتي عن المحرك الجديد تحتاج تحديث
موضوعك يستحق التثبيت وان يكون من ضمن المواضيع المثبيته
اعجبني الشرح والصور بالموضوع كذلك شخصكم اسلوبكم في الردود عالاعضاء بارك الله فيك و وفقك لمئ يحب ويرضئ
وتقبل تحياتياللهم اني اسألك باسمك الاعظم اللذي اذا دعيت به اجبت ان تنصر المسلمين وجندك على الظالمين
وتفتك باعدائك اعداء الدين
تعليق
-
المشاركة الأصلية بواسطة لا اعلم مشاهدة المشاركةموضوع رائع الي ابعد الحدود وافادني كثيرا خصوصا وان معلوماتي عن المحرك الجديد تحتاج تحديث
موضوعك يستحق التثبيت وان يكون من ضمن المواضيع المثبيته
اعجبني الشرح والصور بالموضوع كذلك شخصكم اسلوبكم في الردود عالاعضاء بارك الله فيك و وفقك لمئ يحب ويرضئ
وتقبل تحياتي
واتمنى ان واجهتك اي مشكلة في الورشة او اردت ان تستفسر عن موضع فأخبرني به كي نتعاون على حله.عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها
تعليق
-
السلام عليكم اخي محمد حبيت اطرح سؤال هنا ادا كان مافي مانع , طبعأً علشان ما اعمل زحمة في المنتدى , سؤالي بسيط :
انا عندي كائنات في اللعبة بأسم Enemy طبعاً هذول الاعداء وفيهم تاج بأسم Enemy ايضاً Layer تبعهم بأسم Enemy طبعاً انا ما استخدمت Rigidbody فيهم فقط جعلتهم يتجهوا الى اللاعب ,بحيث ان المسافة تكون فاصلة بينهم يعني بين الاعداء و اللاعب علشان ما يتصادموا ,هنا حبيت حصلت مشكلة مع باقي الاعداء طبعاً هي مش مشكلة لكن حبيت اصلح هذا الشي , الي حصل ان الاعداء يدخلوا في بعض و انا حبيت اعمل مسافة بين كل انمي و آخر , طبعاً ما استخدمت Rigidbody علشان اعمل Collision بينهم بحيث ما يتصادموا ,بس حبيت اعمل مسافة بين كل انمي عبر متغير Distance ,برضوا مازالوا يدخلو مع بعض مع اني استخدمت المتغير طبعاً لانهم كلهم يحتووا على تاج موحد و لاير موحد لكن حبيت اسألك ادا كان في طريقة ثانية , او اضطر استخدم Rigidbody علشان اعمل Collision بينهم ؟
وشكراًمدونتي Home OF Games تهتم بتطوير الألعاب
قناتي YouTube
لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة.
تعليق
-
متابع للورشة استمرو
تعليق
-
المشاركة الأصلية بواسطة EMAD_ARIF مشاهدة المشاركةالسلام عليكم اخي محمد حبيت اطرح سؤال هنا ادا كان مافي مانع , طبعأً علشان ما اعمل زحمة في المنتدى , سؤالي بسيط :
انا عندي كائنات في اللعبة بأسم Enemy طبعاً هذول الاعداء وفيهم تاج بأسم Enemy ايضاً Layer تبعهم بأسم Enemy طبعاً انا ما استخدمت Rigidbody فيهم فقط جعلتهم يتجهوا الى اللاعب ,بحيث ان المسافة تكون فاصلة بينهم يعني بين الاعداء و اللاعب علشان ما يتصادموا ,هنا حبيت حصلت مشكلة مع باقي الاعداء طبعاً هي مش مشكلة لكن حبيت اصلح هذا الشي , الي حصل ان الاعداء يدخلوا في بعض و انا حبيت اعمل مسافة بين كل انمي و آخر , طبعاً ما استخدمت Rigidbody علشان اعمل Collision بينهم بحيث ما يتصادموا ,بس حبيت اعمل مسافة بين كل انمي عبر متغير Distance ,برضوا مازالوا يدخلو مع بعض مع اني استخدمت المتغير طبعاً لانهم كلهم يحتووا على تاج موحد و لاير موحد لكن حبيت اسألك ادا كان في طريقة ثانية , او اضطر استخدم Rigidbody علشان اعمل Collision بينهم ؟
وشكراً
الآن سأشرح لك الطريقة التي استعملتها لفعل ذلك. في البداية، عدم استخدام الفيزياء في نظري هو امر متعب وسيتطلب منك جهد كبير، لأنك مثلاً ستضطر الى امتلاك مصفوفة بجميع الاعداء (وهو امر صعب) ومن ثم القيام في كل فريم بالتحقق من المسافة بين كل عدو وعدو ومعرفة اذا ما كانت المسافة ضمن النطاق المحدد وبعدها الابتعاد عن بعضهم، وكما ترى تطبيق وصيانة هذا الكود امر معقد نوعاً ما.
اما مع الفيزياء فالامر اسهل، ما سنقوم به هو رسم دائرة (تخيلية) حول كل عدو وهذه الدائرة تفحص وجود اي جسم ملامس لها وعلى هذا الاساس نتصرف، وهو بدون شك اسهل من الطريقة السابقة، هذا هو السكريبت الذي يتحكم بكل عدو:
كود:private Transform player; public LayerMask enemyLayer; private Vector2 force; private Rigidbody2D myRb2D; private Collider2D myCollider2D; private void Start () { player = GameObject.Find("Player").transform; myRb2D = GetComponent<Rigidbody2D>(); myCollider2D = GetComponent<Collider2D>(); } private void FixedUpdate () { Move(); } private void Move() { Collider2D firstEnemy = Physics2D.OverlapCircle(transform.position, 2.0f, playerLayer.value); if(firstEnemy != myCollider2D) { Vector2 moveAwayVector = (transform.position - firstEnemy.gameObject.transform.position); force = moveAwayVector.normalized * 10; myRb2D.AddRelativeForce(force); return; } Vector2 moveTowardPlayerVector = player.position - transform.position; force = moveTowardPlayerVector.normalized * 5; myRb2D.AddForce(force); }
في الدالة Start عرفنا اغلب المتغيرات. في الدالة FixedUpdate لم اضع كود التحريك داخلها بل نقلته الى دالة خارجية، واستخدمت FixedUpdate لأننا سنستخدم الفيزياء للتحريك.
داخل الدالة Move: في كل فريم يوجد حالتان للعدو، اما ان يتحرك نحو اللاعب، او في حال كان هنالك عدو قريب يجب ان يبتعد عنه، ولا يجب تطبيق قوتين معاً في نفس الفريم لذا سنفحص اولاً تواجد عدو قريب، وسنستخدم الدالة OverlapCircle التي تقوم برسم دائرة حول نقطة ما بقطر معين وتعيد لنا اول كولايدر اصطدم بها (يوجد نسخة منها تعيد لك جميع الكولايدرات). الآن نأخذ هذا الكولايدر ونتحقق من انه ليس الكولايدر الخاص بنا اي بالعدو الموجود عليه السكريبت) لأن الدالة تفحص كل ما بداخلها، وبعد ذلك نقوم بتطبيق قوة محلية معاكسة للابتعاد عن هذا العدو وتعتمد هذه القوة على شعاع Vector3 يمثل طرح موقعنا من موقع العدو الملامس لنا ومن ثم عمل Normalize له نتخلص من الطول ونبقي على الجهة). وبعد القيام بذلك نصل الى return كي نخرج من الدالة ولا نكملها.
طيب في حال لم نلامس عدو فإننا سنتجه نحو اللاعب عن طريق تطبيق قوة تدفعنا باتجاهه وهي ايضاً ناتجة عن طرح موقعنا من موقع اللاعب مع عمل Normalize.
شكل الدالة OvellapCircle:
كود:public static Collider2D OverlapCircle(Vector2 point, float radius, int layerMask = DefaultRaycastLayers);
ايضاَ يجب ان تعدل ال Linear Drag الخاص بكل عدو الى قيمة 5 (وهي متناسبة مع القوى) وهكذا لن تؤثر القوى بشكل كبير في الاعداء وكذلك ستجعلها تخفف السرعة بشكل تدريجي نوعاً ما.
طيب سؤال أخير، لماذا استخدمنا OverlapCircel ولم نستخدم CircleCast؟ للأسف الكثير يفهم CircleCast بشكل خاطئ، ان CircleCast تقوم بعمل دائرة بمساحة معينة ومن ثم تقوم بتحريكها على طول شعاع معين وتفحص كل الكولايدرات الموجودة على هذا الشعاع، بمعنى انها تقوم بعمل شعاع ثخين، ويمكنك رؤية شكل الدالة:
كود:public static RaycastHit2D CircleCast(Vector2 origin, float radius, Vector2 direction, float distance = Mathf.Infinity, int layerMask = DefaultRaycastLayers);
أتمنى ان أكون قد افدتك وفي حال وجود أي استفسارات أخرى اخي عماد اسأل وبإذن الله نتعاون على حلها.
التعديل الأخير تم بواسطة MohammadT3d; 13 / 09 / 2015, 10:24 PM.عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها
تعليق
-
اشكرك الف شكر اخي محمد صراحة ما قصرت , اعطيتنا كود رائع جداً و عمل بشكل جيد ,احب انك تعرف اخي اني اكرة ان انقل الاكواد دون شرح صراحة انت شرحت كل شيئ بشكل واضح و انا عدلت على الكود بحيث تناسب مع اكوادي , الف شكر لك اخي ماقصرت ^_^ .مدونتي Home OF Games تهتم بتطوير الألعاب
قناتي YouTube
لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة.
تعليق
-
السلام عليكم اخي محمد , اولاً اشكرك على كل شيئ و كل المساعدات التي قدمتها لي.
انا دائماً في اوقات فراغي ابدأ اقرأ كتابك , صراحة الكتاب جميل جداً و مفيد , اليوم مريت على طريقتة تحميل المستويات , انا سابقاً كنت عامل سلايدر و كنت اظهر ارقام عشوائية تظهر ان اليفل يقوم بتحميل الليفل الي بعدة صراحة ما ارتحت لهذة الفكرة , لهذا لما مريت على الشرح الموجود في الكتاب , احولت اطبقة عندي و صراحة عمل بشكل جيد بحيث ان العبة صارت مرتبة و زالت مشاكل التعليق عند تجميل المستويات , هنا حبيت اسألك سؤال بسيط عن المتغير progress , انت قلت ان قيمتة هي واحد ,كلامك صحيح قيمتة واحد , لكن سؤالي هنا هل اقدر اغير قيمتة يعني مثلاً بدل القيمة واحد احول قيمتة الى 100 ؟ لاني عامل رقم للتحميل ان صحت العبارة هذا الرقم يظهر كم باقي من الوقت علشان يتحمل المستوى بشكل كامل ,لكن تظهر قيمتة 1 و انا حابب اخلي قيمتة 100 , صراحة حاول بحيث اني خليت القيمة 100 بهذا الشكل :
progress = 100 طبعاً بعد ما كتبت المتغير تبعي و اعرف ان المتغير progress ياخد قيم عشرية float لكن ماضبطت , اعذرنا لو طولت عليك في الكلام بس حبيت اشرح المشكلة , و شكراً لك على كل شيء.
مدونتي Home OF Games تهتم بتطوير الألعاب
قناتي YouTube
لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة.
تعليق
-
اخي ببساطة اضرب بمئة، فإذا كانت قيمته مثلاً 1 وضربته في مئة سيصبح 100 واذا كانت قيمته 0.5 سيصبح 50 وهكذا يمكنك عرضها في نص على شكل نسبة مئوية، وهذا كمثال بسيط (بفرض ان loadingText هو متغير Text يمثل كائن الواجهات الذي سيعرض قيمة التحميل):
كود:loadinText.text = (loadingLevel.progress * 100)
.
عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها
تعليق
-
صراحة اخي مش عارف كيف اشكرك اعطيتنا اجوبة على كل سؤال ،اشكرك الف شكر ماقصرت و ان شاء الله منتظر كتابك القادم باذن الله ☺😊.مدونتي Home OF Games تهتم بتطوير الألعاب
قناتي YouTube
لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة.
تعليق
-
بدي تساعدني بشي
انا صممت طيارة وعملت سكبربت التحكم وكل شي فيها المهم
اريد ان اعمل عداد لارتفاع الطائرة عن الارض
واريد ان اعمل عداد لسرعة ايضا
واريد ان اعمل عداد لميلان الطيارة عن الافق
كيف ممكن اعمل كل هاد الاشياء
مع العلم
انا + البرمجة = صفرليس من الصعب أن تضحي من أجل صديق .. ولكن من الصعب أن تحب وتجد صديقاً يستحق التضحية
تعليق
-
المشاركة الأصلية بواسطة SHADIA مشاهدة المشاركةبدي تساعدني بشي
انا صممت طيارة وعملت سكبربت التحكم وكل شي فيها المهم
اريد ان اعمل عداد لارتفاع الطائرة عن الارض
واريد ان اعمل عداد لسرعة ايضا
واريد ان اعمل عداد لميلان الطيارة عن الافق
كيف ممكن اعمل كل هاد الاشياء
مع العلم
انا + البرمجة = صفر
ابدء بزيادرة مهاراتك بالتدريج، ابدء بالالعاب البسيطة وبالسهلة، سؤالي لك هل تستطيع عمل لعبة Tic Tac Toe؟ بما انك صفر في البرمجة فهذا يعني لا، طيب هل المنطقي وانت لا تعرف عمل لعبة بسيطة مثل هذه ان تبدأ بلعبة طائرات، وماذا ستستفيد اذا انتهيت منها وكل اكوادك منقولة.
المبرمج والمصم الحقيقي يتعلم مكونات الكود كي يشكل منها ما يشاء وليس العكس. انا بودي مساعدتك ولكنني لا اود ان اصيد السمك بدلاً منك، اخي ابدء بالبسيط البسيط وسأساعدك واسأل اسئلة في مستواك وسنحاول اجابتك عنها، يعني لو كنت متوسط الخبرة لأمكنني مساعدتك في لعبة الطائرات والتناقش فيها.
بدون شك لن يعجبك كلامي وستقول بأنني بدل هذا الحديث كان يجب ان اقدم لك الاكواد وما الى ذلك ولكن انا اريد مصلحتك.
بما انك صفر في البرمجة فلتبدأ فيها:- ابدء بتعلم اساسيات السي شارب وحاول ان تفهم كل ما يتعلق فيها، ولا تحاول تجاوز مواضعي لأنك تتعلم الاساسيات
- بعد ذلك ابدء بتعلم اساسيات اليونيتي وهيكليته، جرب تحميل مشاريع جاهزة مفتوحة المصدر وتفكيكها
- قناة اليونيت مليئة بالفيديوهات لكل المستويات هذا عدا عن ال Docs الخاصة به
- يوجد قنوات ودروس عربية للمحرك يونيتي على الانترنت ستساعد نوعاً ما
- الاخ FreeMan لديه موقع جيد يتحدث فيه عن تصميم الالعاب نظرياً كما انه قام بدورة لعمل لعبة مشابهة ل Angry Birds تتحدث عن الكثير من الامور الخاصة بتطوير الالعاب
- اخيراً جرب تطبيق هذه الورشة، وللعلم هذه الورشة للمبتدئين لذا قم بتصفحها وحدد نسبة معرفتك لمواضيعها فهذه النسبة ستمثل نسبة تعلمك لليونيتي
بعد ذلك كله ستجد بأن مواضيع تصميم الطائرة ليست بألغاز معقدة جداً (لأن مستواك ازداد) وسيصبح بإمكانك التفكير في كيفية عمل مثل هذه الامور وبرمجتها بنفسك مع طلب بعض المساعدة والاستعانة بالمصادر الموجودة على شبكة الانترنتعليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها
تعليق
-
المشاركة الأصلية بواسطة MohammadT3d مشاهدة المشاركةاخي العزيز حالك هو حال الكثيرين ممن يدخلون هذا المجال، نعم هو مجال صناعة الالعاب ولكنه ليس لعبة، الموضوع صعب ولكن يمكنك الاحتراف اذا مشيت على الطريق الصحيح، ولكن السؤال هنا هل مشيت على الطريق الصحيح؟ انا تابعت عدة مواضيع لك وعدة اسئلة لك والنتيجة واضحة انت مبتدئ مئة في المئة، وهذا ليس بعيب كلنا كنا مبتدئين (وانا لم احترف) ولكن الطريق الى الاحتراف بدون شك لن يكون عبر البدء بتصنيع لعبة طائرات.
ابدء بزيادرة مهاراتك بالتدريج، ابدء بالالعاب البسيطة وبالسهلة، سؤالي لك هل تستطيع عمل لعبة Tic Tac Toe؟ بما انك صفر في البرمجة فهذا يعني لا، طيب هل المنطقي وانت لا تعرف عمل لعبة بسيطة مثل هذه ان تبدأ بلعبة طائرات، وماذا ستستفيد اذا انتهيت منها وكل اكوادك منقولة.
المبرمج والمصم الحقيقي يتعلم مكونات الكود كي يشكل منها ما يشاء وليس العكس. انا بودي مساعدتك ولكنني لا اود ان اصيد السمك بدلاً منك، اخي ابدء بالبسيط البسيط وسأساعدك واسأل اسئلة في مستواك وسنحاول اجابتك عنها، يعني لو كنت متوسط الخبرة لأمكنني مساعدتك في لعبة الطائرات والتناقش فيها.
بدون شك لن يعجبك كلامي وستقول بأنني بدل هذا الحديث كان يجب ان اقدم لك الاكواد وما الى ذلك ولكن انا اريد مصلحتك.
بما انك صفر في البرمجة فلتبدأ فيها:- ابدء بتعلم اساسيات السي شارب وحاول ان تفهم كل ما يتعلق فيها، ولا تحاول تجاوز مواضعي لأنك تتعلم الاساسيات
- بعد ذلك ابدء بتعلم اساسيات اليونيتي وهيكليته، جرب تحميل مشاريع جاهزة مفتوحة المصدر وتفكيكها
- قناة اليونيت مليئة بالفيديوهات لكل المستويات هذا عدا عن ال Docs الخاصة به
- يوجد قنوات ودروس عربية للمحرك يونيتي على الانترنت ستساعد نوعاً ما
- الاخ FreeMan لديه موقع جيد يتحدث فيه عن تصميم الالعاب نظرياً كما انه قام بدورة لعمل لعبة مشابهة ل Angry Birds تتحدث عن الكثير من الامور الخاصة بتطوير الالعاب
- اخيراً جرب تطبيق هذه الورشة، وللعلم هذه الورشة للمبتدئين لذا قم بتصفحها وحدد نسبة معرفتك لمواضيعها فهذه النسبة ستمثل نسبة تعلمك لليونيتي
بعد ذلك كله ستجد بأن مواضيع تصميم الطائرة ليست بألغاز معقدة جداً (لأن مستواك ازداد) وسيصبح بإمكانك التفكير في كيفية عمل مثل هذه الامور وبرمجتها بنفسك مع طلب بعض المساعدة والاستعانة بالمصادر الموجودة على شبكة الانترنت
انا ما بدي اتعلم اليونيتي اصلاً
فقط بدي اصنع لعبة لمرة واحدة فقط
لاني اريد تعلم udk عما قريب ولا اريد تعلم unity
اذا بدقدر تساعدني اعطيني السكربتات او دروسليس من الصعب أن تضحي من أجل صديق .. ولكن من الصعب أن تحب وتجد صديقاً يستحق التضحية
تعليق
-
لا افهم سب تصميمك لهذه اللعبة الوحيدة مادمت ستترك، ولكن سأساعدك رغم عدم اقتناعي بالامر (سؤالك عن العدادات هو سؤال غريب نوعاً ما لأنها امور بسيطة جداً لمن يحرك طائرة):
-بالنسبة لعداد ارتفاع الطائرة فهذا يجب ان يكون قيمة المحور y للطائرة باستخدام فئة transform.position، لذا قم بربط هذه القيمة بأي عداد ترغب فيه (ان كان نص او ان كان صورة او Slider عمودي بحسب ذوقك) وعلماً ان احداثيات اليونيتي هي بالامتار، لذا يفضل ان تناسب مقاسات الطائرة مع المقاسات الحقيقية حتى تحصل على ارتفاع منطقي، يعني طول طائرة الميكويان ميج 31 هو حوالي 22.6 متر وارتفاعها حوالي 6.15 متر لذا قم بضبط قيم ال scale الخاصة بالطائرة.
-بالنسبة لعداد الدوران فهذا ايضاً يتعلق بربط قيمة الدوران حول المحور الذي ترغب فيه مع العداد الذي ترغب فيه (يوجد العديد من الاشكال للعدادات وبحسب الدوران الذي تود حسابه وحول اي محور) باستخدام transform.rotation.
-بالنسبة لعداد السرعة فهو ايضاً عن طريق ربط القيمة Rigidbody.velocity بالعداد الذي ترغب فيه، ولكن الامر هنا يحتاج الى بعض الانتباه، لأن السرعة قد لا تكون منطقية بحسب قيمة القوة المؤثرة على الطائرة وبحسب قيمة الجاذبية وبحسب قيمة احتكاك الهواء Linear Drag والتي في النهاية ستنتج قيمة سرعة قد تكون غير مقبولة منطقياً ولكنها جيدة في اللعبة، لذا يجب عليك اما ضبط القيم للوصول الى السرعة الحقيقية (وهو امر قد يكون غير وارد لأن سرعة الطائرات الحربية قد تصل الى 3000 كيلومتر) او الوصول الى قيمة مثالية ومن ثم استخدام بعض العمليات الحسابية مثل الضرب والقسمة كي تعرضها بشكل صحيح في العداد.
صراحة لم اجرب تصميم مثل هكذا محاكاة سابقة ولكن المشاريع الاساسية التي تأتي مع اليونيتي 5 تحتوي على محاكاة لا بأس بها لطائة يمكنك الاطلاع عليها، ولكن بحسب معرفتي فإن محاكاة الطائرات لا تتم وفقاً للحياة العملية او الفيزيائية بل يتم عمل اكواد خاصة ذات نتائج مرضية.عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها
تعليق
تعليق