
C'est la deuxième partie de l'histoire (mélangée à l'histoire de mes erreurs et de leurs solutions) sur la façon dont j'ai (pendant environ deux ans pendant mon temps libre) développé une application mobile (pour iOS / Android) qui motiverait ma fille à résoudre des exemples mathématiques. En conséquence, il s'est avéré une application qui permet à un enfant de gagner de l'argent avec son esprit.
Lisez la première partie ici .
Plan de la deuxième partie
- À propos de l'écriture de code
- À propos du contrôle de version
- À propos du doublage
- À propos de l'icône
- À propos de la construction pour Android et de la taille
- À propos de la construction pour iOS et de la taille
- À propos du titre et de la promotion
- Statistiques
- Ce que je regrette
- Ce qui a compris
- Les références
Anecdotes en programmation qui me facilitent la vie
- Depuis Mono, je continue à utiliser // TODO (dans les commentaires) pour marquer les lieux à finaliser. Ensuite, tous ces endroits peuvent être facilement surveillés sur l'onglet Liste des tâches (Ctrl + \, T est appelé):

- Récemment, j'ai commencé à utiliser une fonctionnalité telle que #region , par exemple, pour masquer les zones d'énumération des variables:

- il est pratique d'envelopper une partie du code avec certaines constructions en utilisant la séquence de touches de raccourci Ctrl + K, Ctrl + S. Par exemple, je sélectionne la partie du code qui doit être placée à l'intérieur du if et appuyez sur Ctrl + K, puis immédiatement sur Ctrl + S, saisissez le nom de l'opérateur (si) dont vous avez besoin et appuyez sur Entrée.
- cela simplifie considérablement le travail avec le code si vous adhérez à un seul style, par exemple, comme ici - le Guide de style C # avec Unity à l'esprit .
- Je suis très heureux d'être devenu ami avec Coroutine - ce sont, en gros, des fonctions qui étendent leur exécution en plusieurs cadres. C'est-à-dire ils n'essaient pas de terminer une tâche dans une image (le calculer pendant une demi-seconde, réduisant ainsi les performances à 2 FPS), mais ils le font un peu dans la première image, un peu dans la seconde et ainsi de suite, afin que le jeu ne ralentisse pas. Leur autre objectif est d'effectuer quelque chose qui n'a pas besoin d'être fait directement dans chaque image (par exemple, vérifier quelque chose 3 fois par seconde).
L'exemple ci-dessous montre la coroutine d'un feu de circulation qui allume en continu (toutes les dix secondes) tour à tour un feu jaune, rouge, vert:
IEnumerator TrafficLights() { while (true) { yield return new WaitForSeconds(10f); yield StartCoroutine(this.GetComponent<Lamp>().BlinkYellow()); yield StartCoroutine(this.GetComponent<Lamp>().BlinkRed()); yield StartCoroutine(this.GetComponent<Lamp>().BlinkGreen()); } }
Si en langage humain, l' instruction yield indique simplement à Unity qu'il est nécessaire de transférer l'exécution de la fonction à la trame suivante (autant de fois que nécessaire) jusqu'à ce qu'elle soit exécutée, puis passez à l'instruction de rendement suivante. T.O. Coroutine TrafficLights fonctionnera comme ceci:
- il y a d'abord une attente de 10 secondes (premier rendement),
- puis la coroutine BlinkYellow démarre (deuxième rendement) et jusqu'à la fin, la coroutine BlinkRed ne démarre pas,
- à la fin de BlinkYellow, BlinkRed est lancé,
- à la fin de BlinkRed, BlinkGreen est lancé,
- puis le cycle se répète depuis le début (voir point 1).
Contrôle de version, enfin, vraiment nécessaire!
La vidéo qui m'a aidé à commencer à utiliser GitHub en conjonction avec Unity - Comment utiliser GitHub avec Unity .
Malgré le fait que j'écris moi-même (seul, sans équipe) le code, j'ai réalisé que le contrôle de version du code est tout simplement vital pour moi:
- J'ai cessé d'avoir peur de faire des changements cardinaux dans le code qui pourraient ruiner le projet.
- Il est très facile de revenir à votre condition de travail précédente.
- Il est pratique de comparer des fichiers avec du code.
- Vous pouvez clairement voir ce qui a changé dans le code.
- Peu importe ce qui arrive à mon ordinateur, j'ai toujours une version de sauvegarde dans le cloud.
Mais seulement lorsque vous travaillez avec le contrôle de version, vous devez vous habituer à valider (publier les mises à jour) en très petites portions. Afin de ne pas être comme le mien au début, j'ai changé 20 fichiers, ajouté une tonne de nouvelles fonctionnalités et fait tout cela à la fois sous le nom "Fuh, maintenant ça marche enfin".
Il est bon qu'une fois, j'ai compris qu'il vaut mieux ne pas ajouter de fichiers de cache (dossier Library), de fichiers temporaires (tmp, dossier obj) au référentiel, et tout ce que Unity génère à la volée. En fait, seuls les dossiers Assets et ProjectSettings devaient être ajoutés au référentiel.
Il n'est pas nécessaire d'utiliser GitHub, car son inconvénient est que dans un compte gratuit, il est impossible de rendre le code privé (visible uniquement par vous-même). Mais il y a aussi GitLab ou Bitbucket , si possible.
Comment ai-je rprprrruk dans le microphone
Je perçois ma candidature comme pédagogique et essaie, si possible, de ne pas utiliser les distractions. Par conséquent, les utilisateurs se plaignent parfois, par exemple, du manque de musique ou d'une interface très simple (bien qu'une interface simple ne soit pas parce que je la voulais tellement, mais parce que je ne sais pas comment faire mieux). Avec la musique, je suis un peu à la croisée des chemins maintenant: je veux ajouter et piquer (il est peu probable que les professeurs approuvent la décision de faire leurs devoirs de mathématiques en musique).
La musique, la musique, mais sans voix est impossible. Au début, j'ai recherché les sons dont j'avais besoin parmi les sons gratuits, mais j'ai réalisé qu'il fallait plus de temps pour chercher que si je les faisais moi-même. Par conséquent, j'ai simplement créé la plupart des sons avec ma bouche dans un microphone de téléphone, puis les ai traités à l'aide d' Audacity (un logiciel multiplateforme gratuit pour l'enregistrement et l'édition audio que j'ai utilisé pour convertir le son d'un format à un autre).
Le plus souvent, la logique de création d'un effet sonore dans Audacity était la suivante:
- Coupez tout inutile.
- Utilisé l'effet de réduction du bruit (pour supprimer le bruit de l'enregistrement).
- Ajout du son d'effet caricatural Wahwah.
- Avec des effets, Bass and Treble a été joué avec des fréquences afin que le son soit plus doux sur les haut-parleurs des smartphones.
- Si je dis quelque chose, les effets de Change Pitch, Speed et Tempo ont changé le son de ma voix en chipmunks.
Au début, mon son était très en retard par rapport à l'événement (pas dans l'éditeur, mais sur le smartphone). L'option Taille du tampon DSP définie sur Meilleure latence (Édition -> Paramètres du projet -> Audio) a aidé et ce sont les conseils (à la fois dans la question et dans la réponse).
Comment la fille a généré des idées d'icônes
Pendant que je développais l'application, j'ai essayé plusieurs fois de créer les icônes moi-même, mais aucune d'entre elles n'a pris racine (et en vérité, une sorte de lie est sortie). Par conséquent, lors de l'ouverture de la publication, j'ai confié le développement d'une icône à ma fille. Je lui ai expliqué que l'icône devait être attrayante et expliquer le sens de l'application. Elle est venue avec beaucoup d'enthousiasme et a instantanément dessiné une image complètement inappropriée. Je l'ai rejeté et expliqué ce qui doit être amélioré ou pas utilisé du tout. Puis tout s'est passé comme prévu - elle a été offensée et a cessé de dessiner des icônes.
Au bout d'un demi-mois, l'insulte a passé et elle a approfondi la tâche: elle a coupé des carrés du cahier dans la boîte (la taille de l'icône sur l'écran de son iPod) et a commencé à dessiner les options une par une:

M'a apporté. J'ai choisi les idées que j'aimais. Il a dit dans quelle direction aller. Elle est allée dessiner les options suivantes. Après deux jours et trois douzaines d'options, nous nous sommes installés en bas à droite (photo ci-dessus).
Ensuite, j'ai demandé à ma fille de dessiner une version agrandie de l'icône (la première à gauche dans la figure ci-dessous), que j'ai numérisée (la seconde à gauche) et ... j'ai appelé un ami de l'artiste pour m'aider avec la sélection des couleurs. En conséquence, une version centrale a été obtenue. Puis j'ai commencé à broyer progressivement l'icône (deuxième à droite) tout au long de la vie de l'application en magasin. Et maintenant, elle ressemble à l'extrême droite:

Version Android
Cette vidéo de Unity Android Build - Comment m'a aidé à créer mon premier fichier APK, qui explique comment tout configurer sans installer le lourd Android Studio.
Je répète que je n'ai pas d'appareils avec Android (je demande juste à mes amis de tester après la nouvelle version) et donc je n'ai eu aucune erreur avec les appareils montrés dans la vidéo.
Mais sans accroc, il ne pouvait toujours pas faire. J'ai dû bricoler la mise à jour du SDK Android pendant longtemps, car Unity ne voulait pas travailler avec les dernières mises à jour. En conséquence, il s'est avéré nécessaire de permettre à Unity de choisir et d'installer la version nécessaire de la mise à jour elle-même. C'est-à-dire Je viens de cliquer sur le bouton Mettre à jour le SDK Android dans Unity lui-même, et je n'ai pas essayé de tout mettre à jour moi-même, comme indiqué dans la vidéo.
Problème de mise à jour manuelle du SDK AndroidJusqu'à ce que je réalise que je devais mettre à jour sous Unity, j'ai longtemps souffert, en mettant à jour manuellement en utilisant le script sdkmanager.bat (vous devez utiliser ce script avec le paramètre --update, et non android.bat, ce qui est indiqué dans la vidéo). Pendant la mise à jour, il s'est plaint de ne pas pouvoir écraser le dossier des outils (à partir duquel il a lui-même commencé). J'ai essayé un tas de conseils et je ne me souviens même pas de ce qui a aidé, semble être une sorte de solution avec des liens symboliques.
En outre, des erreurs incompréhensibles liées à Java sont apparues. Il s'est avéré qu'il y avait un problème avec la version de Java Development Kit - il n'avait pas non plus besoin d'être installé avec la dernière version. J'ai essayé plusieurs anciens et sur l'un d'eux les erreurs ont disparu et tout a fonctionné.
Avec l'apk de signature pour la publication sur Google Play, la vidéo Comment signer une application Unity pour la vidéo Android Market m'a aidé. J'ai soigneusement enregistré et enregistré ces deux mots de passe, car ils doivent être saisis à chaque fois que vous créez une nouvelle version. Et si vous les perdez, vous ne pourrez pas mettre à jour l'application (il suffit d'en libérer une nouvelle avec de nouvelles clés).
L'icône, contrairement à la version iOS, doit d'abord être faite avec des coins arrondis, sinon sur certains appareils, elle restera parfaitement carrée.
Taille de construction pour Android
Maintenant, la taille de mon fichier apk est de 22 Mo.
J'ai bien réduit la taille de l'assemblage avec le format de compression avec perte de texture / sprite - RGBA Crunched ETC2 (pour les sprites avec alpha) et RGB Crunched ETC (pour les textures sans alpha). L'essentiel était de définir la qualité du compresseur = 100 (ce paramètre n'affecte pas la vitesse des textures sur le périphérique final, mais uniquement la qualité de la texture et la vitesse de compression dans l'éditeur).
Toutes les autres danses avec tambourins ne m'ont pas permis d'obtenir une réduction significative de la taille du fichier apk (à l'exception de certaines nuances décrites ci-dessous).
Maintenant, j'utilise ce qui suit ..
.. paramètres des paramètres du lecteur ..
.. pour la taille minimale d'une part et la couverture maximale des appareils d'autre part:
- Unity 2018.1 (plus la version est récente, mieux elle s'emballe et plus il y a de goodies).
- API Auto Graphics (Unity lui-même choisit OpenGLES2 et 3).
- Scripting Backend - Mono (il n'est peut-être pas plus rapide que IL2CPP, mais l'assemblage est nettement plus petit).
- Architectures cibles - ARMv7 et x86. En supprimant le support Intel x86, j'ai réduit la taille de l'apk de 10 Mo supplémentaires (ce serait 12 Mo). Mais je ne sais pas combien d'appareils j'ai coupé en supprimant cette coche. Ce que je sais, c'est que les téléphones ne sont pas sortis depuis deux ans déjà sous cette architecture. Et ceux qui l'ont été peuvent être comptés sur les doigts d'une main (les derniers que je connaisse sont Asus Zenfone, Lenovo K 900, Xolo x1000 et il peut y en avoir encore). Veuillez me corriger dans les commentaires si je parle de bêtises.
- Stirpping Level - Strip Assemblies - Coupe en toute sécurité le code inutile. D'autres options peuvent faire et font un certain gain de taille (je ne l'ai pas remarqué à la maison), mais pas si sûr.
- Build System - Gradle (vous permet d'activer l'option Minify).
- Minify - Proguard - raccourcit les noms de toutes les classes et variables afin de réduire la taille des octets misérables, mais, en bonus, rend le code moins lisible pour éviter l'ingénierie inverse.
Construction IOS
Je récupère une application sur le macbook de ma femme (je me souviens qu'ils ont pris le MacBook Air le moins cher de 2015).
Pour créer pour iOS 7 même dans Xcode version 9.3, il suffisait de conduire manuellement la valeur 7.0 dans le champ Cible de déploiement (sous l'onglet Général ).
Pour ajouter des langues (dans lesquelles j'ai traduit l'application à l'aide de la localisation Lean) à la description de l'application dans l'AppStore, nous avons dû ajouter les lignes suivantes au fichier info.plist (n'importe où, par exemple, immédiatement après <dict>):
<key>CFBundleLocalizations</key> <array> <string>English</string> <string>Russian</string> </array>
Maintenant, j'utilise Unity 2017.4 pour construire pour iOS (comme je l'ai écrit ci-dessus, j'ai besoin du support iOS 7, sinon j'utiliserais 2018.1).
Taille de construction IOS
Maintenant, la taille du fichier téléchargé pour mon iPhone est de 44 Mo.
Malheureusement, sous iOS, je ne peux pas utiliser les sprites Crunched, car ils ne sont pas pris en charge sur les appareils plus anciens que l'iPhone 5 ( sans prise en charge de Metal et OpenGL ES 3.0 ).
Lorsque j'ai essayé de réduire la taille de la construction à tout prix, la plus petite taille (34 Mo) a été obtenue si:
- utiliser Unity 2018 (c'est-à-dire que la version minimale prise en charge est iOS 8),
- L'API graphique ne sélectionne que le métal,
- laisser Target Architectures x64 uniquement,
- utilisez des textures croquantes.
Mais je n'ai toujours pas compris comment travailler avec l' amincissement d'application - c'est une chose qui permet à l'appstore de créer automatiquement mon application pour un iPhone / iPad / iPod spécifique de l'utilisateur final (ce qui entraîne une diminution de la taille du fichier téléchargé). J'ai juste eu le temps de rédiger moi-même des articles dans mes favoris:
Mes paramètres de joueur que je souhaite partager:
- Il est pratique d'entrer une fois l' ID d'équipe de signature automatique (vous pouvez l'obtenir sur le site Web des développeurs Apple ici Compte> Adhésion ) et de cocher la case Signer automatiquement afin de ne pas le faire à chaque fois dans Xcode plus tard.
- J'ai réglé la fréquence de l'accéléromètre sur Désactivé (j'ai désactivé l'accéléromètre), car je ne l'utilise pas. Je peux économiser un peu de batterie aux gens.
- Comportement en arrière - plan - Suspendre - de cette façon, l'application ne se ferme pas lorsque vous appuyez sur le bouton Accueil, mais continue de fonctionner en arrière-plan (vous pouvez intercepter cet événement en utilisant OnApplicationPause pour enregistrer le jeu, par exemple).
Comment j'ai choisi le nom et ce que j'ai utilisé pour la promotion
Combien ont utilisé Booking et TripAdvisor, mais je n'ai jamais remarqué que leur nom dans l'AppStore n'est pas seulement Booking, mais «Booking.com Travel Deals» et «TripAdvisor Hotels Restaurants» (le nom est dilué avec des mots clés, de sorte que l'application est basée sur ces mots clés trouvé à la recherche d'un apsteur). Par conséquent, j'ai décidé de ne pas utiliser l'ancien nom Math4Ami, mais pendant longtemps j'ai joué avec différentes formulations pour inclure les mots clés dont j'avais besoin. En fin de compte, je suis d'abord venu à Pocket Money: Math, puis à Learn Math & Earn Pocket Money. En russe, ces options ressemblaient à Pocket Money for Maths et Pocket Money and Maths: Learn and Earn.
J'ai fait la promotion de ma candidature en envoyant / publiant des liens vers celle-ci à des amis et connaissances, j'ai écrit deux articles sur mon blog et accroché une bannière au même endroit.
Soit dit en passant, si vous mettez cette ligne dans les pages Web <head>:
<meta name="apple-itunes-app" content="app-id=1372434662" />
.. puis, en ouvrant cette page sur l'iPhone, tout le monde verra la bannière de votre application en haut.
Télécharger les statistiques
J'ai d'abord publié la version iOS.

Beaucoup de gens ont parlé de l'aversion pour les appareils Apple et convaincus qu'Android est beaucoup plus cool. J'ai décidé de vérifier et, après 20 jours de procédure avec l'assemblage du fichier apk, j'ai fait une sortie sur Google Play.

Vous ne tirerez pas de conclusions objectives (ou pas du tout), mais purement subjectives - j'attendais plus de la plate-forme Google, mais pour le moment, cela s'est avéré à moitié pire qu'Apple.
Je regrette que:
- Je n'ai pas effectué de sauvegarde lors du passage à la nouvelle version d'Unity,
- n'a pas utilisé de système de contrôle de version (comme git),
- J'ai essayé de travailler avec Perforce (juste un système terrible - cela ralentit irréaliste le développement),
- je n'ai jamais utilisé ScriptableObject (SO) - c'est tellement cool
- J'ai écrit le code sur une longue feuille (ça fait peur de se souvenir comment j'ai refactorisé cette feuille plus tard),
- Je ne savais pas quelles étaient les odeurs de code , mais oh comment je devais les connaître,
- J'ai essayé d'utiliser des variables globales partout, et pas des variables locales (pensant paranoïaque que si je demande fréquemment une fonction, alors la variable locale à l'intérieur de la fonction sera créée encore et encore, et il n'y en aura qu'une seule globale. Par conséquent, après des centaines d'appels à la fonction avec des variables locales, J'aurais un tas de mémoire gaspillée et une perte de performances due à Garbage Collector),
- Je n'ai pas toujours adhéré à un style uniforme dans le code et au nom de tous les actifs. Voici un bon modèle pour UE4 (il y a beaucoup de choses utiles sur la dénomination des actifs et je l'utilise également dans Unity),
- J'ai oublié que j'écris l'application principalement pour ma fille, et non pour un beau code ou pour faire plaisir à d'autres utilisateurs.
J'ai réalisé que:
- les enfants sont très faciles à s'asseoir sur mon application (immédiatement après l'installation de l'application, ils peuvent y rester pendant des heures jusqu'à ce que la batterie du téléphone se repose),
- les enfants sont accros aux mathématiques dans ma candidature, même s'ils ne parlent pas d'argent. S'il y a deux enfants dans la famille, il est même venu se disputer par téléphone pour résoudre des exemples,
- Ma candidature s'ennuie très vite pour les enfants. Le lendemain, peu de gens ont joué à l'application, même si l'enfant s'est rendu compte qu'il recevrait de l'argent pour cela,
- la mauvaise rétention des utilisateurs / enfants n'est pas exactement le problème de ma candidature en particulier, mais les spécificités de l'enseignement aux enfants (cela m'a été dit par les enseignants). L'application doit être très diversifiée afin de maintenir l'intérêt des enfants tout le temps,
- assez souvent, les parents et les enfants interprètent mal le principe de l'application et pensent qu'en résolvant des exemples, ils recevront de l'argent de ma part (du développeur). J'ai reçu différentes lettres avec des questions telles que: comment retirer de l'argent, puis-je retirer vers webmoney ou paypal, où spécifier l'adresse pour envoyer de l'argent par chèque, etc.,
- si dans les réponses aux mauvaises critiques, nous nous excusons pour nos erreurs et nos oublis (et expliquons également comment cela devrait réellement fonctionner), alors les gens ont tendance à pardonner les erreurs et à supprimer les mauvaises notes,
- vous n'allez pas loin dans votre propre promotion,
- les enfants grandissent très vite et pendant que j'écrivais l'application - ma fille l'a déjà dépassé. Mais, mon nouveau «testeur» grandit!
Les références
Liste des liens de l'article dans l'ordre de leur mention:
+ Comment garder un seul style de code Guide de style C # avec Unity à l'esprit .
+ GitHub et vidéo sur la façon de visser git à Unity .
+ Il existe un référentiel privé gratuit sur GitLab ou Bitbucket .
+ Audacity gratuit pour l'enregistrement et l'édition audio.
+ Comment supprimer le retard sonore .
+ Unity Android Build Video Tutorial - Comment .
+ Vidéo Comment signer une application Unity pour le marché Android .
+ Appareils Apple prenant en charge Metal / OpenGL ES 3 .
+ Amincissement d'application (documentation Apple).
+ Amincissement d'application (aide Unity).
+ AssetBundle Workflow (documentation Unity).
+ Où obtenir l'ID de l'équipe .
+ Que sont les odeurs de code .
+ Le principe de nommer les actifs / ressources dans les projets de jeu sur UE4 .
Merci d'avoir lu!