
هذا هو الجزء الأول من القصة (ممزوجًا بقصة أخطائي وحلولها) حول الكيفية التي طورت بها (حوالي عامين في وقت فراغي) تطبيقًا للجوال لنظامي iOS و Android من شأنه أن يحفز ابنتي على حل أمثلة الرياضيات بحيث تحقيق الأتمتة في أساسيات الحساب (مستودع رقم 10 أو لوحة الضرب). ونتيجة لذلك ، تبين أنه تطبيق يسمح للطفل بكسب المال بعقله.
لقد استخدمت محرك الوحدة واللغة C # ، بالإضافة إلى مجموعة إضافية من البرامج مثل Photohsop الإلزامي أو Audacity (لإنشاء أصوات).
مخطط القصة (الجزء الأول)
- الخلفية
- حول تحقيق الدخل
- لماذا الوحدة
- حول كائنات قابلة للكتابة
- حول البرنامج المساعد Anima2D
- حول التوطين الهزيل
- حول iTween
- حول تحليلات الوحدة
- حول Visual Studio
- المراجع
الخلفية وخنافس كولورادو
كانت تجربتي السابقة عدة سنوات في مجال الأبعاد الثلاثية ، ومؤخرًا تطوير العديد من الألعاب المستقلة مع مبرمج ، حيث عملت بشكل أساسي كمصمم وفنان (نادرًا ما أكتب بعض النصوص الأولية في C #). على الرغم من أنني على دراية بالبرمجة مباشرة (اعتدت أن أضرب Basic في المدرسة وأعمل في C / C ++ في الجامعة).
بدأت هذه الملحمة بأكملها بمشكلة. رأيت أنه عند حل مشاكل المدرسة ، "ابنتي" تتعطل وتخطئ ، ليس على شيء معقد ، ولكن على أساس. قررت أنه سيكون من الممتع إذا كتبت لها تطبيقًا مضحكًا حيث ستحل أمثلة في شكل لعبة (اكتساب الخبرة بهذه الطريقة وتحقيق الأتمتة). ومن أجل تحفيزها أكثر ، تأكدت من أنها تلقت أموالًا لاتخاذ القرار الصحيح في الأمثلة (تم حساب مبلغ المال من خلال التطبيق بناءً على عدد الإجابات الصحيحة ، ثم استنتجت المبلغ المطلوب ، ودفع مبلغ نقدي لابنتي).
على الرغم ... بدأت هذه القصة حتى قبل ذلك. أولاً ، لقد قدمت ابنتي طلبًا دفع المال لتعلم الكلمات الإنجليزية. لكن تبين أن هذا التطبيق أصعب بكثير بحيث أصبح مناسبًا ليس فقط بالنسبة لي (المطور) وابنتي ، ولكن أيضًا للآباء الآخرين. لذلك ، لا يزال تطبيق اللغة الإنجليزية تطورًا داخليًا.
اخترت المال كمحفز ، لأنه كان أسهل في التنفيذ. وأيضًا بسبب ذكريات الطفولة الشخصية: أحببت أن أفعل كل شيء من أجل المال. حتى لو كانت مهمة شاقة للغاية ، مثل جمع خنافس كولورادو للبطاطس. أتذكر جمع جرة نصف لتر (دفع لي والداي 1 كوبيل لكل حشرة). لذا اعتقدت أنه منذ ابنتي (لم أتحقق منها ، لكنني متأكد تمامًا من ذلك) ، فيجب أن تحبها. حسنًا ، في النهاية لم أخسر.
زوجتي ضد تشجيع الأطفال على فعل شيء من أجل المال. لكن حجتي أقنعتها قليلاً: في حالة هذا التطبيق ، يتلقى الطفل المال ليس مقابل ما يجب أن يفعله (مثل الواجبات المنزلية) ، ولكن لحقيقة أنه يمارس أيضًا الرياضيات في وقت فراغه.
السبب الثاني الذي جعلني أتطور هو أنني أردت ممارسة البرمجة. لقد أصبح حلمي "أن أصبح مبرمجًا" منذ الصف الأول من المدرسة (مباشرة بعد حلم "أن أصبح عالماً" ، ولكن قبل حلم "صناعة الرسوم المتحركة").
تحقيق الدخل والمتعة
في البداية ، قدمت هذا التطبيق (كان اسم العمل Math4Ami) حصريًا لجهاز iPod touch 5 لابنتي. لم أفكر حتى في جعل التطبيق متاحًا على جميع أجهزة iOS أو نشره للجميع ، وخاصة ، لم أفكر في إصداره لمنصة Android (سمعت الكثير من القصص المخيفة من مطوري iOS بالإضافة إلى أنه ليس لدي شيء لاختبار إصدار Android عليه).
منذ بعض الوقت ، كنت أميل إلى نشره في AppStore (لقد انجذبت كثيرًا بفكرة أن لدي تطبيقًا خاصًا بي في متجر Apple ويمكن للجميع رؤيته).
اعتقدت أنني سأديره في غضون شهر. بعد كل شيء ، كانت جميع الوظائف جاهزة ، والشيء الوحيد المتبقي هو جعلها تعمل لجميع نسب العرض على الشاشة ومفهومة ليس فقط بالنسبة لي ، ولكن أيضًا للآباء الآخرين. والآن ، بعد ستة أشهر ، قمت بنشره على AppStore و Google Play.
قررت في البداية أن أجعل Math4Ami مجانيًا تمامًا بدون تلميح إلى تحقيق الدخل. هناك عدة أسباب لهذا القرار.
الأول. كما فهمت بالفعل ، فقد جعلتها في البداية مجانية لابنتي ولم أكن أريد أن أفسد أي شيء في "نهاية" التطور.
الثاني. قررت أنه سيكون تطورًا من أجل سعادتي. لدي بالفعل تجربة مماثلة - أقوم بإنشاء مدونة للمتعة (التي كانت في البداية تأكل المال فقط: المال للاستضافة واسم المجال ، والوقت لكتابة المقالات والترويج لها). كان منطقتي هو هذا: إذا كنت أدفع المال لزيارة الحديقة المائية ، أو أشتري كتابًا أو آيس كريمًا للاستمتاع ، فلماذا لا يمكنني دفع المال مقابل الاستضافة ، أو اسم النطاق أو العضوية في برنامج Apple Developer ، إذا كان ذلك يجلب لي أيضًا المتعة.
الثالث - من أجل جمهور أوسع ، والذي سيتم قطعه بشكل كبير ، مما يجعل التطبيق مدفوعًا (كما يفعل العديد من مطوري تطبيقات الأطفال). لقد رفضت أنواعًا أخرى من تحقيق الدخل للأسباب الموضحة أدناه.
لا يمكنني تحمل الإعلانات داخل اللعبة - لا أحبها عندما يتم تشويه تصميم التطبيق من خلال الرسائل الإعلانية (باستثناء الإعلان في شكل مشاهدات الفيديو حسب الرغبة ، وليس عندما ينبثق الفيديو قاب قوسين أو أدنى). بالإضافة إلى ذلك ، للمشاركة في برنامج "Made for children" في Apple و "Designed for Families" في Google ، تحتاج إلى تصفية الإعلانات المعروضة للأطفال بدقة.
عمليات الشراء داخل اللعبة ، أنا شخصياً ، بصفتي أحد الوالدين ، أحظر على جميع الأجهزة والأطفال ، عندما يقومون بتنزيل التطبيقات بمفردهم ، لا يمكنني ببساطة شراء أي شيء داخل التطبيق. شيء آخر هو عندما يشتري الوالد نفسه في البداية الطلب للطفل (لكني قلت بالفعل عن هذا أعلاه).
لماذا الوحدة وكيف
اخترت الوحدة لأنني عملت فيها من قبل وأعجبني. كان لدي أيضًا صديق جيد كمبرمج C # وكنت أتمنى أن يساعدني في البرمجة ، إذا كان ذلك. لدى Unity أيضًا مجتمع رائع ومن السهل جدًا العثور على إجابات في Google لجميع الأسئلة تقريبًا المتعلقة بتنفيذ شيء ما على C # + Unity.
لقد عملت أيضًا مع Unreal (كفنان ثلاثي الأبعاد) ، لكنني لم أفهم وظيفة C ++ أو 2D.
في البداية ، كان Math4Ami "غائم" ، على الرغم من أنه قيل بصوت عال. تم تخزين جميع البيانات على eVPS الخاص بي (خادم مرن افتراضي خاص) واستخدمت FTP لنقل ملفات TXT مع إعدادات البيانات والتطبيقات (لم تصل يدي إلى قاعدة البيانات ، على الرغم من أنني كتبت الخطوات الأولى في كتابة الخادم الخاص بي على node.js تعهد). للعمل مع بروتوكول نقل الملفات ، قمت بتثبيت Unity في فئة Simple C # FTP سهلة الاستخدام.
بعد ذلك ، عندما قررت جعل التطبيق عامًا ، تخليت عن جانب الخادم.
من ناحية ، قد يكون هذا مربكًا للغاية: قم بإجراء المصادقة (لا يحب المستخدمون ذلك) أو احفظ معرّف الجلسة في iCloud باستخدام NSUbiquitousKeyValueStore (هذا سيحدد المستخدم تلقائيًا بين إلغاء تثبيت التطبيق وإعادة تثبيته) ، ولكن ما زلت لا أستطيع معرفة ذلك بهذا (ربما المقالة التي كتبتها عن البرنامج المساعد Unity بشكل صحيح ستساعدني . الجزء 1: iOS ، ولكن بعد ذلك لم يكن كذلك).
من ناحية أخرى ، فإن البيانات في هذا التطبيق ليست مهمة للغاية بحيث يجب تخزينها على الخادم.
من ناحية أخرى ، لم تكن هناك حاجة لمزامنة الخادم. هنا لطلبي لتدريس اللغة الإنجليزية - نعم هناك ، كانت هناك حاجة إلى التزامن. نظرًا لأن أحد الوالدين يضيف كلمات جديدة في تطبيق الوالدين ، ويعلمها الطفل في تطبيق الأطفال (على الرغم من أنني ربما أنا هاوٍ لتعقيد الأمور).
ونتيجة لذلك ، تأكدت من تخزين كل شيء محليًا (على الجهاز) ، ولكن ليس بتنسيق txt ، ولكن بتنسيق JSON.
ScriptableObject والإجابات الصحيحة
تحول تنسيق JSON مع ScriptableObject إلى اكتشاف رائع. لقد استخدمت الأساليب الأصلية لـ UnityEngine لإجراء تسلسل للكائنات في json - JsonUtility (ثم حفظ ملفات نصية json محليًا على الجهاز إلى المجلد Application.persistentDataPath ).
ScriptableObject (SO) هو موضوع منفصل للمحادثة ، ولكن ما زلت أتطرق إليه. لا أستطيع حتى أن أتخيل كيف كنت أعيش بدون SO.
كل ما أستخدمه في عملي ، حصلت عليه من هذين الفيديوين الهائلين حول مبادئ العمل مع SO (والشفرة المصاحبة على GitHub و Bitbucket):
أنا شخصياً استخدمت SO لهذه الأغراض:
- لتخزين البيانات (حتى لا تضطر للذهاب إلى الرمز في كل مرة لإضافة وظائف أو بيانات جديدة):
- أمثلة متنوعة
- نوع العملة
- نمط الزر (لدي نفس الأزرار في العديد من الأماكن وأقوم فقط بإنشاء جلود لهم بناءً على SO) ،
- قيمة المكافأة ، إلخ.
- كمتغيرات عامة (والتي تكون مرئية في جميع المشاهد):
- عدد الإجابات الصحيحة
- مبلغ من المال المكتسب
- الإعدادات النشطة حاليًا
- نوع المثال الحالي
- المؤقت ، النتائج العالية ، إلخ.
- لتخزين المنطق (على سبيل المثال ، الاشتراك في حدث تلقي الإجابة الصحيحة).
النقص الوحيد في SO للعمل مع البيانات هو أنه لا يمكنك تخزين البيانات بين جلسات التطبيق فيه: ستحتوي أصول SO (بعد بداية باردة للتطبيق) دائمًا على البيانات التي كتبتها هناك في المحرر. لذلك ، منطق عملي هو كما يلي:
- بعد بدء التطبيق ، قرأت ملفات json من القرص وقم بتحميل البيانات منها في أصول SO (طريقة FromJsonOverwrite).
- أثناء تشغيل التطبيق وأحتاج إلى أقصى أداء - أنا أعمل فقط مع أصول كائن قابل للبرمجة. تقوم هذه الأصول بتخزين البيانات طوال الوقت أثناء تشغيل التطبيق أو في الخلفية.
- عندما تحتاج إلى حفظ البيانات (على سبيل المثال ، عند إنهاء التطبيق أو أثناء عملك) ، أقوم بتسلسل SO إلى json (طريقة ToJson) وحفظها على القرص.
هناك عيب (واضح) لهذا النهج - لا يمكنك حفظ معلمة واحدة تم تغييرها إلى القرص (إذا كان هناك العديد منها في SO) ، يجب عليك حفظ ملف json النصي بالكامل طوال الوقت.
لكن العديد من البيانات لا تحتاج إلى حفظها على القرص (على سبيل المثال ، العدد الحالي للإجابات الصحيحة) ومن ثم فإن SO أداة قوية تسمح لي بتبسيط العمل بشكل كبير.
في الفيديو أدناه ، أعرض مثالاً على تنفيذي للمحاسبة للإجابات الصحيحة وغير الصحيحة باستخدام UnityEvent (حدث - هل تغير عدد الإجابات الصحيحة) + المستمع (يقوم المستمعون ببعض الأعمال إذا سمعوا أن الإجابة الصحيحة تم استلامها ، ومنطق المستمعين المشتركين في الحدث هو أيضًا نفذت على SO) + SO (يتتبع عدد الإجابات الصحيحة):
وبالتالي ، لا يمكنني فقط إدخال الإجابات الصحيحة الخاطئة بيدي ، ولكن ببساطة عن طريق تحريك شريط التمرير ، وإنشاء أمثلة جديدة واختبار منطق التطبيق.
Anima2D ، شخصيات وابتسامة ارتعاش
يظهر الفيديو أعلاه أنه عندما يسقط بنس جديد ، تبدأ البنسات الأخرى بالابتسام على نطاق واسع ، وعندما يسقط أنبوب ، فإن البنسات تشعر بالرعب.
لفترة طويلة ، لم أتمكن من هزيمة الخلل ، عندما تحولت من نوع من الابتسامة إلى نوع آخر ، لم يحدث التغيير على الفور ، ولكنه يومض (من دولة إلى أخرى) لفترة من الوقت. علاوة على ذلك ، سأخبرك كيف أدركت هذا وكيف هزمت هذا الخلل.
يتم تنفيذ تغيير تعابير الوجه باستخدام البرنامج النصي Sprite Mesh Animation ، وهو جزء من البرنامج المساعد Anima2D القوي (الذي اشترته Unity مؤخرًا وحررته ). يقوم هذا النص البرمجي بشكل أساسي بتبديل العفاريت للفم (ابتسامة ، ابتسامة مفتوحة ، فم خائف) باستخدام شريط تمرير الإطار :

الكمين كله هو أنه لا يمكن تغيير قيمة منزلق الإطار مباشرة من البرامج النصية ، ولكن فقط من خلال نظام الرسوم المتحركة. لذلك ، قمت بإنشاء طبقة رسوم متحركة OpenSmile جديدة (السهم 1 في الشكل أدناه) في وضع المزج الإضافي بوزن يبلغ = 1 وإضافة رسوم متحركة للرعب ( Coin_scared ) وابتسامة عريضة ( SmillingWide ) هناك.
بالمناسبة ، هل لاحظت مثالاً سيئًا أقوم بإعداده مع أسماء الرسوم المتحركة؟ ما زلت في طور جلب الأسماء إلى أسلوب واحد. سيكون من الصحيح تغيير Coin_scared إلى A_CoinScared (لماذا قرأت ذلك للتو في قسم "ما يؤسفني").
لقد أنشأت طبقة جديدة ، ولم أستخدم الطبقة القديمة ، لأنني لم أرغب في الكتابة فوق الرسوم المتحركة للفم. كل ما كان علي فعله هو تغيير نقش الفم (من ابتسامة إلى ابتسامة عريضة أو من ابتسامة إلى رعب) وبقيت حركة الفم من الطبقة الأساسية. هذا هو السبب في أنني اخترت وضع المزج الإضافي - إضافة رسوم متحركة جديدة إلى واحدة موجودة (دون استبدالها).
في جوهرها ، فإن الرسوم المتحركة SmillingWide و Coin_scared ليست سوى رسوم متحركة لشريط التمرير Frame في الموضع 1 و 2 ، على التوالي.

كانت المشكلة برمتها أن الانتقال من أي حالة إلى حالة الرعب (عندما تنقر على انتقال (السهم 2 في الشكل أعلاه) ، يفتح المفتش خصائص هذا الانتقال (السهم 3 في الشكل أعلاه)) لم يحدث على الفور ، ولكن بسلاسة خلال فترة الانتقال (السهم 4 في الشكل أعلاه) ، والذي لم يكن فارغًا بشكل افتراضي. وبالتالي ، لا يمكن تغيير قيمة منزلق الإطار بشكل صحيح ، نظرًا لوجود أعداد صحيحة فقط ، مما يعني عدم وجود قيمة وسيطة بين 0 و 1. لذلك ، للتخلص من الخطأ الوامض ، كان من الضروري فقط إعادة تعيين قيمة مدة الانتقال .
حسنًا ، الزناد isScared (السهم 5 في الشكل أعلاه) بمثابة شرط للذهاب إلى حالة من الرعب. أقوم بتنشيط هذا المشغل في التعليمات البرمجية باستخدام الاستدعاء التالي للكائن الذي يتم تعليق مكون Animator عليه (مع وحدة التحكم ، التي عرضت طبقاتها أعلاه):
...GetComponent<Animator>().SetTrigger("isScared");
كيف قمت بترجمة التطبيق إلى لغات مختلفة
في مكان ما هنا ، في حبري ، قرأت أنك بحاجة إلى التفكير في الأقلمة في بداية إنشاء التطبيق واتبعت هذه النصيحة ... فورًا ... بعد عام ونصف من التطوير (بمجرد أن قررت أن Math4Ami ستكون عامة).
لماذا اخترت Lean Localization (باستثناء أن المكون الإضافي مجاني) لا أتذكر ، لكنني أتذكر أنني اخترت لفترة طويلة وبصعوبة.
تبين أن استخدامه بسيط للغاية. يمكنك إما تعيين اللغة يدويًا أو استخدام الكشف التلقائي عن اللغة. استقرت على الكشف التلقائي عن اللغة (باتباع مثال تطبيقات الأطفال الأخرى).
البرنامج المساعد يترجم كل شيء (من النص إلى الأصوات والصور).
لكنني ما زلت أرتكب خطأً واحدًا في التوطين (على الرغم من أنني قمت بذلك عن قصد ، لأنني أردت تجربة طرق مختلفة). الخطأ هو أنني لم أضع جميع العبارات في ملف نصي (على اليسار في الشكل أدناه). بقيت بعض العبارات داخل مكون الأقلمة (على اليمين في الشكل أدناه). لذلك ، عندما أعطي هذا الملف لمترجم ياباني ، يجب أن أعمل يدويًا (لنقل كل شيء إلى ملف نصي).

على الرغم من أنه لا يمكن ترجمة بعض الأشياء باستخدام ملف نصي (مثل المساحة "" ، التي استخدمتها كفاصل بين الآلاف) - لا يزال عليك استخدام المكون.
العصير iTween
ذات مرة ، شاهدت مقطع فيديو رائعًا عن Juice أو فقدته حول كيفية مساعدة جميع أنواع الحركات الصغيرة والفروق الدقيقة في الرسوم المتحركة في جعل عمل مذهل من لعبة مملة. وحتى قبل ذلك ، غرق فيديو آخر في روحي - فن اهتزاز الشاشة ، وهو في الواقع ليس فقط وليس اهتزاز الشاشة.
طوال الوقت كنت أقوم بإنشاء Math4Ami ، كنت أتذكر المفاهيم من مقاطع الفيديو المذكورة أعلاه ، بالإضافة إلى فكرة أن كل هذه الرسوم المتحركة الإضافية يجب أن تكون قصيرة قدر الإمكان وتتصرف بشكل أكبر في اللاوعي أكثر من الوعي. في بعض الأحيان ، قضيت وقتًا أطول في إضافة "العصير" بدلاً من إضافة وظائف مفيدة.
مكان واحد فقط يزعجني كثيرًا - العدد النهائي للأموال المكتسبة (يمكنك مشاهدة هذه اللحظة في نهاية عرض الفيديو الخاص بي أعلاه). لقد قمت بتقصيره في أقرب وقت ممكن ، ولكن لا يزال الأمر يستغرق أكثر من 4 ثوانٍ تقريبًا (تختفي لوحة المفاتيح ، ويظهر انتصار النقش ، ويتم عد النسخ ، ويتم الخروج من جدول السجلات ، ويتم عرض لوحة الاسم "سجل جديد" ، ويتم عرض الزر "المزيد").
أفضل مصدر عصير بالنسبة لي هو إضافة iTween المجانية. لا أستطيع حتى أن أتخيل كيف يمكنك بدون أي شيء أن تفعل أي شيء على الإطلاق. أستخدمه عند الحاجة إلى نوع من الرسوم المتحركة على الأقل (سواء كان رسمًا متحركًا لزر أو مظهر عنصر قائمة أو رسومًا متحركة لعد السنتات).
حاولت تنفيذ شيء مشابه بمفردي بناءً على Coroutines و Mathf.Lerp أو Mathf.MoveTowards ، لكنه لم يكن مرنًا وليس عالميًا (وأحيانًا كان يعمل بشكل مختلف في المحرر وعلى الجهاز). لذلك الآن لا أحاول إعادة اختراع العجلة ، أنا أستمتع فقط بـ iTween.
هناك عيوب في نظام الرسوم المتحركة هذا ، والتي قاتلت في البداية بشكل غير صحيح:
- إذا قمت أثناء عمل iTween بإخفاء كائن (من خلال SetActive (false) ، على سبيل المثال) ، ثم إظهاره مرة أخرى ، فسيستمر تنفيذ iTween من المكان الذي تمت مقاطعته.
- إذا قمت أثناء تشغيل iTween ببدء آخر (مما يؤثر على نفس القيم) ، فعند نهاية تنفيذ كل منهما ، قد لا يعود الكائن إلى موضعه الأصلي.
- تحتاج إلى تتبع أي GameObject تطلق iTween ، والرسوم المتحركة التي تعمل عليها.
على سبيل المثال (في النقطة الأخيرة) ، يبدأ الكائن A في iTween بحيث يعمل على الكائن B. لإيقاف الرسوم المتحركة في iTween ، لا يمكنك فقط بدء iTween.Stop () على الكائن A. تحتاج إلى بدء iTween.Stop (الكائن B).
تتمثل قوة iTween في قدرته على استخدام أنواع مختلفة من التيسير. Ising هي معلمة تخفف الحركة (بحيث لا تبدأ رعشة ولا تنتهي بغباء).
اكتشاف رائع بالنسبة لي هي أنواع ising:
- الربيع
- easyOutBounce
- easInBack
- سهولة
للعثور على الكائن المناسب ، أستخدم العرض التوضيحي للتخفيف المرئي (أحتاج إلى فلاش). وهنا آخذ الوثائق لجميع أنواع الرسوم المتحركة في iTween .
إحصاءات Apple و Google جيدة ، لكن Unity Analytics أفضل
حتى من تجربة الألعاب السابقة ، كنت أعلم أن امتلاك إحصائياتك أمر رائع جدًا. في البداية أردت إنشاء نوع من نظام التسجيل ، ولكن بعد ذلك تذكرت Unity Analitics . وما أدهشني عندما اتضح أن الإصدار المجاني من وظائف قضيتي لا يقتصر على أي شيء. سأكون أسوأ إذا كان لدي نوع من تحقيق الدخل ، فإن أدوات التحليلات متاحة فقط لمشتركي Pro.
ببساطة عن طريق تضمين Analytics.CustomEvent في المكان الصحيح في الرمز ، يمكنني تتبع الأمثلة الأكثر شيوعًا ، وعدد الأطفال الذين يحلون الأمثلة في الأيام الأولى أو بعد فترة ، وما إلى ذلك.
يمكنني مقارنة البيانات من منصات مختلفة (iOS و Android) في مكان واحد.
وكم من الأشياء المثيرة للاهتمام هناك ، ما أود أن أجربه ، ولكن كل الأيدي لا تصل. اكتب Remote Settings (تغيير محتوى التطبيق بدون تحديث) أو A / B Testing أو Tutorial Manager .
ستوديو مرئي مثل Sublime
في الماضي ، عندما كنت بحاجة إلى تعديل بعض التعليمات البرمجية (سواء كانت python أو html أو node.js) ، كنت أستخدم Notepad ++ (مجانًا تمامًا ، ولكن فقط على Windows) و Sublime Text (مدفوع لجميع أنظمة التشغيل ، ولكن يمكنك تجربته مجانًا )
في Unity ، كنت جالسًا في MonoDevelop ، لكنه كان سئمًا جدًا من أعطاله (مثل عدم القدرة على التبديل بين التخطيطات أو لصق شيء تم نسخه خارج Mono) لدرجة أنني قررت أن الوقت قد حان لإسقاط السفينة الغارقة والتسلق على Visual Studio Community 2017 (جيد ، إنه مجاني للمطورين الفرديين مثلي).
بالنسبة للمطورين في Unity 2018 ، هذا ليس مناسبًا الآن ، نظرًا لأن Visual Studio Code متعدد الأنظمة الأساسية تم تضمينه في الإصدار 2018. لكنني أردت أن يعمل تطبيقي في نظام التشغيل iOS 7 (نظرًا لأن هاتف iPhone الخاص بابنتي مع نظام التشغيل iOS هذا) ، لذلك كان علي استخدام أي إصدار من Unity أقدم من 2018.
لقد ساعدني في الانتقال إلى فيديو VS كيفية إعداد Visual Studio مع Unity .
من الصندوق ، لا تحتوي VS على جميع الأشياء الرائعة التي اعتدت عليها في المحررين الآخرين ، لذلك قمت بتبسيط حياتي:
- قم بتشغيل الخريطة المصغرة بدلاً من التمرير العمودي البسيط:

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

- أنا استخدم Strip'em لتصحيح نهايات السطر تلقائيًا.
مخطوطاتي لهذا التطبيق موجودة على جيثب. لا يوجد سوى نصوصاتي ، وليس مشروع الوحدة بالكامل - آسف ، إذا كان ذلك يجعلها مستحيلة الفهم. حتى اللحظة الأخيرة ، لم أخطط لإعطاء رابط للمصادر ، لأنني لا أعتبر أن الكود الخاص بي يستحق التركيز عليه. ولكن بعد ذلك غير رأيه بسبب احتمال أن يشير المطورون الأكثر خبرة إلى أخطائي.
هذه هي نهاية الجزء الأول. استمر في القراءة في الجزء الثاني ، حيث سأقول:
- حول كتابة التعليمات البرمجية
- حول التحكم في الإصدار
- حول التمثيل الصوتي
- حول الرمز
- حول Android Build
- حول بناء لنظام التشغيل iOS
- حول العنوان والترويج
- الإحصائيات
- ما يؤسفني
- ما فهمه
المراجع
قائمة الروابط من نص المقالة حسب ترتيب ذكرها:
+
فئة C # FTP بسيطة.+
معرف الجلسة لنظام iOS.+
نكتب البرنامج المساعد للوحدة بشكل صحيح. الجزء 1: iOS .
+
طرق تسلسل الكائنات في JSON (مساعدة رسمية).
+
ScriptableObject (مساعدة رسمية).
+ فيديو تعليمي
لعبة الهندسة المعمارية مع كائنات قابلة للبرمجة (
رمز ).
+ ورشة عمل
الإطاحة بسلوك أحادي السلوك في ثورة كائن كتابي مجيد (
كود ).
+ عرض
فيديو لتطبيقي في المحرر .
+
البرنامج المساعد Anima2D المجاني
للرسوم المتحركة الهيكلية لشخصيات ثنائية الأبعاد .
+ مكتبة مجانية لترجمة التطبيق -
الأقلمة العجاف.+ فيديو عن الحيل التي تحسن تصور اللعبة
عصيرها أو خسارتها .
+ فيديو عن تقنيات الرسوم المتحركة المموهة
فن اهتزاز الشاشة .
+
نظام رسوم متحركة مجاني ولكن قوي
iTween .
+ عرض مرئي
لأنواع ising (تحتاج إلى فلاش).
+
iTween (المساعدة الرسمية).
+
تحليلات الوحدة .
+ محررات النص
Notepad ++ و
Sublime Text .
+
Visual Studio Community 2017 و
Visual Studio Code .
+ فيديو تعليمي
كيفية إعداد Visual Studio مع Unity .
+ البرنامج المساعد
SemanticColorizer (لإعدادات لون الكود).
+ البرنامج المساعد
الهامش المباراة (تحديد الكلمة تحت النقل وجميع نسخه).
البرنامج المساعد +
Strip'em (التصحيح التلقائي لنهايات الخط).