
Dies ist der zweite Teil der Geschichte (gemischt mit der Geschichte meiner Fehler und ihrer Lösungen) darüber, wie ich (für ungefähr zwei Jahre in meiner Freizeit) eine mobile Anwendung (für iOS / Android) entwickelt habe, die meine Tochter motivieren würde, mathematische Beispiele zu lösen. Als Ergebnis stellte sich heraus, dass ein Kind mit seinem Verstand Geld verdienen kann.
Lesen Sie hier den ersten Teil .
Teil Zwei Plan
- Über das Schreiben von Code
- Informationen zur Versionskontrolle
- Über Sprachausgabe
- Über das Symbol
- Über den Build für Android und über die Größe
- Über den Build für iOS und über die Größe
- Über den Titel und die Promotion
- Statistiken
- Was ich bereue
- Was verstanden
- Referenzen
Trivia in der Programmierung, die mir das Leben leichter macht
- Seit Mono verwende ich weiterhin // TODO (in den Kommentaren), um Stellen zu markieren, die finalisiert werden müssen. Alle diese Stellen können dann bequem auf der Registerkarte Aufgabenliste überwacht werden (Strg + \, T heißt):

- Vor kurzem habe ich begonnen, eine Funktion wie #region zu verwenden , um beispielsweise Bereiche der Aufzählung von Variablen auszublenden:

- Es ist praktisch, einen Teil des Codes mit einigen Konstrukten zu umbrechen, indem Sie die Tastenkombinationen Strg + K, Strg + S verwenden. Zum Beispiel wähle ich den Teil des Codes aus, der in das if eingefügt werden soll, und drücke Strg + K, drücke dann sofort Strg + S, gebe den Namen des Operators (falls) ein, den Sie benötigen, und drücke die Eingabetaste.
- Dies vereinfacht die Arbeit mit Code erheblich, wenn Sie sich beispielsweise an einen einzelnen Stil halten, wie hier - den C # Style Guide mit Blick auf Unity .
- Ich bin sehr froh, dass ich mich mit Coroutine angefreundet habe - das sind ungefähr Funktionen, die ihre Ausführung in mehrere Frames ausdehnen. Das heißt, Sie versuchen nicht, eine Aufgabe in einem Frame zu erledigen (sie berechnen sie für eine halbe Sekunde, wodurch die Leistung auf 2 FPS reduziert wird), aber sie tun ein wenig im ersten Frame, ein wenig im zweiten und so weiter, damit das Spiel nicht langsamer wird. Der andere Zweck besteht darin, etwas auszuführen, das nicht direkt in jedem Frame ausgeführt werden muss (z. B. dreimal pro Sekunde etwas überprüfen).
Das folgende Beispiel zeigt die Coroutine einer Ampel, die unendlich (alle zehn Sekunden) ein gelbes, rotes und grünes Licht aufleuchtet:
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()); } }
In menschlicher Sprache teilt die Yield-Anweisung Unity lediglich mit, dass die Ausführung der Funktion bis zur Ausführung auf den nächsten Frame (so oft wie nötig) übertragen werden muss, und fährt dann mit der nächsten Yield-Anweisung fort. T.O. Coroutine TrafficLights wird folgendermaßen ausgeführt:
- zuerst gibt es eine Wartezeit von 10 Sekunden (erste Ausbeute),
- dann beginnt die BlinkYellow-Coroutine (zweite Ausbeute) und bis sie endet, startet die BlinkRed-Coroutine nicht.
- Nach Abschluss von BlinkYellow wird BlinkRed gestartet.
- Nach Abschluss von BlinkRed wird BlinkGreen gestartet.
- dann wiederholt sich der Zyklus von Anfang an (siehe Punkt 1).
Versionskontrolle, nur wirklich notwendig!
Das Video, das mir geholfen hat, GitHub in Verbindung mit Unity zu verwenden - Verwendung von GitHub mit Unity .
Trotz der Tatsache, dass ich selbst (alleine, ohne Team) den Code schreibe, wurde mir klar, dass die Versionskontrolle des Codes für mich einfach von entscheidender Bedeutung ist:
- Ich hatte keine Angst mehr, Änderungen am Code vorzunehmen, die das Projekt ruinieren könnten.
- Es ist sehr einfach, zu Ihrem vorherigen Arbeitszustand zurückzukehren.
- Es ist bequem, Dateien mit Code zu vergleichen.
- Sie können deutlich sehen, was sich im Code geändert hat.
- Egal was mit meinem Computer passiert, ich habe immer eine Backup-Version in der Cloud.
Aber nur wenn Sie mit der Versionskontrolle arbeiten, müssen Sie sich daran gewöhnen, in sehr kleinen Portionen Commits (nach Updates) durchzuführen. Um zunächst nicht so zu sein wie ich, habe ich 20 Dateien geändert, eine Menge neuer Funktionen hinzugefügt und alles gleichzeitig unter dem Namen "Fuh, jetzt funktioniert es endlich" erstellt.
Es ist gut, dass ich einmal herausgefunden habe, dass es besser ist, keine Cache-Dateien (Bibliotheksordner), temporäre Dateien (tmp, obj-Ordner) zum Repository und alles, was Unity im laufenden Betrieb generiert, hinzuzufügen. Tatsächlich mussten nur die Ordner Assets und ProjectSettings zum Repository hinzugefügt werden.
Es ist nicht erforderlich, GitHub zu verwenden, da das Minus darin besteht, dass es in einem kostenlosen Konto unmöglich ist, den Code privat zu machen (nur für Sie selbst sichtbar). Aber dann gibt es, wo möglich, GitLab oder Bitbucket .
Wie bin ich ins Mikrofon gekommen?
Ich empfinde meine Bewerbung als lehrreich und versuche, wenn möglich, keine Ablenkungen zu verwenden. Daher beschweren sich Benutzer manchmal beispielsweise über den Mangel an Musik oder eine sehr einfache Benutzeroberfläche (obwohl eine einfache Benutzeroberfläche nicht darauf zurückzuführen ist, dass ich sie so sehr wollte, sondern darauf, dass ich nicht weiß, wie ich sie besser machen kann). Mit Musik stehe ich jetzt ein wenig am Scheideweg: Ich möchte hinzufügen und stupsen (es ist unwahrscheinlich, dass Lehrer die Entscheidung einer Mathe-Hausaufgabe für Musik gutheißen).
Musik, Musik, aber ohne Sprachausgabe ist unmöglich. Zuerst suchte ich nach den Sounds, die ich unter den freien brauchte, aber dann wurde mir klar, dass die Suche länger dauert, als wenn ich sie selbst gemacht hätte. Daher habe ich einfach die meisten Sounds mit meinem Mund in einem Telefonmikrofon erstellt und sie dann mit Audacity (einer kostenlosen Multi-Plattform-Software zum Aufnehmen und Bearbeiten von Audio, mit der ich Sound von einem Format in ein anderes konvertiert habe) verarbeitet.
Am häufigsten lautete die Logik zum Erstellen eines Soundeffekts in Audacity wie folgt:
- Schneiden Sie alles Unnötige ab.
- Verwendet den Rauschunterdrückungseffekt (um Rauschen aus der Aufnahme zu entfernen).
- Der Sound des Cartoon-Effekts Wahwah wurde hinzugefügt.
- Mit Effekten wurden Bässe und Höhen mit Frequenzen gespielt, so dass der Klang auf den Lautsprechern von Smartphones süßer klang.
- Wenn ich etwas sagte, änderten die Effekte von Pitch, Speed und Tempo den Klang meiner Stimme in Chipmunks.
Zunächst blieb mein Sound deutlich hinter dem Ereignis zurück (nicht im Editor, sondern auf dem Smartphone). Die Option DSP-Puffergröße auf Beste Latenz (Bearbeiten -> Projekteinstellungen -> Audio) hat geholfen, und dies sind die Tipps (sowohl in der Frage als auch in der Antwort).
Wie Tochter Icon-Ideen generierte
Während ich die Anwendung entwickelte, habe ich mehrmals versucht, die Symbole selbst zu erstellen, aber keines von ihnen hat Wurzeln geschlagen (und in Wahrheit kam eine Art Bodensatz heraus). Daher vertraute ich meiner Tochter bei der offenen Veröffentlichung die Entwicklung einer Ikone an. Ich erklärte ihr, dass das Symbol attraktiv sein und die Bedeutung der Anwendung erklären sollte. Sie war begeistert und zeichnete sofort ein völlig ungeeignetes Bild. Ich lehnte es ab und erklärte, was genau verbessert oder überhaupt nicht verwendet werden muss. Dann lief alles wie erwartet - sie war beleidigt und hörte auf, Ikonen zu zeichnen.
Nach einem halben Monat verging die Beleidigung und sie näherte sich der Aufgabe gründlicher: Sie schnitt Quadrate aus dem Notizbuch in die Schachtel (die Größe des Symbols auf dem Bildschirm ihres iPod) und begann, nacheinander Optionen zu zeichnen:

Brachte mich. Ich habe die Ideen ausgewählt, die mir gefallen haben. Er sagte, in welche Richtung er weitergehen sollte. Sie ging, um die folgenden Optionen zu zeichnen. Nach zwei Tagen und drei Dutzend Optionen haben wir uns unten rechts niedergelassen (Foto oben).
Dann bat ich meine Tochter, eine vergrößerte Version des Symbols zu zeichnen (die erste links in der Abbildung unten), die ich digitalisierte (die zweite links) und ... einen Freund des Künstlers anrief, um mir bei der Farbauswahl zu helfen. Als Ergebnis wurde eine zentrale Version erhalten. Dann fing ich an, das Symbol (das zweite rechts) während der gesamten Lebensdauer der Anwendung in Geschäften schrittweise zu schleifen. Und jetzt sieht sie ganz rechts aus:

Android Build
Dieses Video von Unity Android Build - Wie ich bei der Erstellung meiner ersten APK-Datei geholfen habe, zeigt, wie alles konfiguriert wird, ohne das schwere Android Studio zu installieren.
Ich wiederhole, dass ich keine Geräte mit Android habe (ich bitte meine Freunde nur, nach dem neuen Build zu testen) und daher keine Fehler mit den im Video gezeigten Geräten hatte.
Aber ohne Probleme konnte es immer noch nicht gehen. Ich musste lange mit dem Android SDK-Update basteln, weil Unity nicht mit den neuesten Updates arbeiten wollte. Als Ergebnis stellte sich heraus, dass Unity die erforderliche Version des Updates selbst auswählen und installieren musste. Das heißt, Ich habe gerade in Unity selbst auf die Schaltfläche Android SDK aktualisieren geklickt und nicht versucht, alles selbst zu aktualisieren, wie im Video gezeigt.
Problem beim manuellen Aktualisieren des Android SDKBis mir klar wurde, dass ich unter Unity aktualisieren musste, litt ich lange unter der manuellen Aktualisierung mit dem Skript sdkmanager.bat (Sie müssen dieses Skript mit dem Parameter --update verwenden, nicht mit der im Video angegebenen Datei android.bat). Während des Updates beschwerte er sich, dass er den Tools-Ordner (von dem aus er selbst gestartet habe) nicht überschreiben könne. Ich habe eine Reihe von Tipps ausprobiert und kann mich nicht einmal daran erinnern, was geholfen hat. Es scheint eine Lösung mit symbolischen Links zu sein.
Außerdem tauchten unverständliche Fehler im Zusammenhang mit Java auf. Es stellte sich heraus, dass es ein Problem mit der Version des Java Development Kit gab - es musste auch nicht mit der neuesten Version installiert werden. Ich habe mehrere alte ausprobiert und bei einem von ihnen sind die Fehler verschwunden und alles hat funktioniert.
Mit der Signatur-Apk für die Veröffentlichung auf Google Play hat mir das Signieren einer Unity-App für das Android- Marktvideo geholfen. Ich habe diese beiden Passwörter sorgfältig gespeichert und gespeichert, da sie jedes Mal eingegeben werden müssen, wenn Sie einen neuen Build erstellen. Und wenn Sie sie verlieren, können Sie die Anwendung nicht aktualisieren (geben Sie einfach eine neue mit neuen Schlüsseln frei).
Das Symbol muss im Gegensatz zur iOS-Version zunächst mit abgerundeten Ecken erstellt werden. Andernfalls bleibt es auf einigen Geräten perfekt quadratisch.
Build-Größe für Android
Jetzt ist meine apk Dateigröße 22MB.
Ich habe die Baugruppengröße mit dem verlustbehafteten Textur- / Sprite-Komprimierungsformat - RGBA Crunched ETC2 (für Sprites mit Alpha) und RGB Crunched ETC (für Texturen ohne Alpha) gut reduziert . Die Hauptsache war, die Kompressorqualität auf 100 zu setzen (dieser Parameter beeinflusst nicht die Geschwindigkeit der Texturen auf dem Endgerät, sondern nur die Texturqualität und die Kompressionsgeschwindigkeit im Editor).
Bei anderen Tänzen mit Tamburinen konnte ich die Größe der apk-Datei nicht signifikant reduzieren (mit Ausnahme einiger unten beschriebener Nuancen).
Jetzt benutze ich folgendes ..
.. Einstellungen aus den Player-Einstellungen ..
.. für die minimale Größe einerseits und die maximale Abdeckung von Geräten andererseits:
- Unity 2018.1 (je neuer die Version, desto besser verpackt sie und desto mehr Goodies).
- Auto Graphics API (Unity selbst wählt OpenGLES2 und 3).
- Scripting Backend - Mono (es ist möglicherweise nicht schneller als IL2CPP, aber die Assembly ist definitiv kleiner).
- Zielarchitekturen - ARMv7 und x86. Durch das Entfernen der Intel x86-Unterstützung habe ich die Apk-Größe um weitere 10 MB reduziert (dies wären 12 MB). Ich weiß jedoch nicht, wie viele Geräte ich durch Entfernen dieses Häkchens abgeschnitten habe. Was ich weiß ist, dass Telefone unter dieser Architektur bereits seit zwei Jahren nicht mehr veröffentlicht wurden. Und diejenigen, die waren, können an den Fingern einer Hand gezählt werden (die letzten, die ich kenne, sind Asus Zenfone, Lenovo K 900, Xolo x1000 und es kann noch einige geben). Bitte korrigieren Sie mich in den Kommentaren, wenn ich Unsinn spreche.
- Rührstufe - Streifenbaugruppen - Schneidet unnötigen Code sicher ab. Andere Optionen können und können eine Art Größengewinn erzielen (ich habe es zu Hause nicht bemerkt), sind aber nicht so sicher.
- Build System - Gradle (ermöglicht das Aktivieren der Option Minify).
- Minify - Proguard - verkürzt die Namen aller Klassen und Variablen, um miserable Bytes an Größe zu sparen, macht den Code jedoch als Bonus weniger lesbar, um Reverse Engineering zu verhindern.
IOS bauen
Ich sammle eine Anwendung auf dem MacBook meiner Frau (ich erinnere mich, dass sie das billigste MacBook Air von 2015 genommen haben).
Um auch in Xcode Version 9.3 für iOS 7 zu erstellen, war es ausreichend, den Wert 7.0 manuell in das Feld Bereitstellungsziel (auf der Registerkarte Allgemein) einzugeben.
Um der Anwendungsbeschreibung im AppStore Sprachen (in die ich die Anwendung mithilfe von Lean Localization übersetzt habe) hinzuzufügen, mussten wir der Datei info.plist die folgenden Zeilen hinzufügen (irgendwo, beispielsweise unmittelbar nach <dict>):
<key>CFBundleLocalizations</key> <array> <string>English</string> <string>Russian</string> </array>
Jetzt verwende ich Unity 2017.4, um für iOS zu erstellen (wie oben beschrieben, benötige ich iOS 7-Unterstützung, andernfalls würde ich 2018.1 verwenden).
IOS Build-Größe
Jetzt beträgt die Größe der heruntergeladenen Datei für mein iPhone 44 MB.
Leider kann ich unter iOS keine Crunched-Sprites verwenden, da diese auf Geräten, die älter als das iPhone 5s sind, nicht unterstützt werden ( ohne Unterstützung für Metal und OpenGL ES 3.0 ).
Als ich versuchte, die Build-Größe um jeden Preis zu reduzieren, wurde die kleinste Größe (34 MB) erhalten, wenn:
- Verwenden Sie Unity 2018 (d. h. die mindestens unterstützte Version ist iOS 8).
- Grafik-API nur Metall auswählen,
- Lassen Sie nur Zielarchitekturen x64,
- Verwenden Sie knirschende Texturen.
Ich habe jedoch immer noch nicht herausgefunden, wie ich mit dem Ausdünnen von Apps arbeiten soll. Auf diese Weise kann der Appstore meine Anwendung automatisch für ein bestimmtes iPhone / iPad / iPod des Endbenutzers erstellen (was zu einer Verringerung der Größe der heruntergeladenen Datei führt). Ich hatte gerade Zeit, selbst Artikel in meine Lesezeichen zu schreiben:
Meine Player-Einstellungen, die ich teilen möchte:
- Es ist praktisch, die Team-ID für das automatische Signieren einmal einzugeben (Sie finden sie auf der Apple Developer-Website unter Konto> Mitgliedschaft ) und das Kontrollkästchen Automatisch signieren zu aktivieren, damit Sie dies später nicht jedes Mal in Xcode tun.
- Ich habe die Beschleunigungsmesserfrequenz auf Deaktiviert gesetzt (ich habe den Beschleunigungsmesser deaktiviert), weil ich ihn nicht benutze. Ich kann den Leuten ein wenig Batterie sparen.
- Verhalten im Hintergrund - Anhalten - Auf diese Weise wird die Anwendung nicht geschlossen, wenn Sie die Home-Taste drücken, sondern arbeitet weiterhin im Hintergrund (Sie können dieses Ereignis beispielsweise mit OnApplicationPause abfangen , um das Spiel zu speichern).
Wie ich den Namen gewählt habe und was ich für die Werbung verwendet habe
Wie viele haben Booking und TripAdvisor verwendet, aber ich habe nie bemerkt, dass ihr Name im AppStore nicht nur Booking, sondern "Booking.com Travel Deals" und "TripAdvisor Hotels Restaurants" ist (der Name wird mit Schlüsselwörtern verwässert, sodass die Anwendung auf diesen Schlüsselwörtern basiert gefunden auf der Suche nach apstor). Aus diesem Grund habe ich mich entschieden, nicht den alten Namen Math4Ami zu verwenden, sondern lange Zeit mit verschiedenen Formulierungen gespielt, um die benötigten Schlüsselwörter aufzunehmen. Am Ende kam ich zuerst zu Pocket Money: Math und später zu Math & Earn Pocket Money. Auf Russisch klangen diese Optionen wie Taschengeld für Mathematik und Taschengeld und Mathematik: Lernen und verdienen.
Ich habe meine Bewerbung beworben, indem ich Links zu Freunden und Bekannten gesendet / veröffentlicht, zwei Artikel in meinem Blog geschrieben und an derselben Stelle ein Banner aufgehängt habe.
Übrigens, wenn Sie diese Zeile in die <head> Webseiten einfügen:
<meta name="apple-itunes-app" content="app-id=1372434662" />
Wenn Sie diese Seite auf dem iPhone öffnen, sieht jeder das Banner Ihrer Anwendung oben.
Statistiken herunterladen
Zuerst habe ich die iOS-Version veröffentlicht.

Viele Leute sprachen über Abneigung gegen Apple-Geräte und waren überzeugt, dass Android viel cooler ist. Ich entschied mich zu überprüfen und veröffentlichte nach 20 Tagen mit der Zusammenstellung der apk-Datei eine Veröffentlichung bei Google Play.

Sie werden keine objektiven Schlussfolgerungen (oder gar keine) ziehen, sondern rein subjektiv - ich habe mehr von der Google-Plattform erwartet, aber im Moment stellte sich heraus, dass es halb schlechter war als Apple.
Ich bedauere das:
- Ich habe beim Wechsel zur neuen Version von Unity keine Backups erstellt.
- habe kein Versionskontrollsystem (wie git) verwendet,
- Ich habe versucht, mit Perforce zu arbeiten (nur ein schreckliches System - es verlangsamt die Entwicklung unrealistisch).
- habe ScriptableObject (SO) noch nie benutzt - es ist so cool
- Ich habe den Code in ein langes Blatt geschrieben (es ist beängstigend, sich daran zu erinnern, wie ich dieses Blatt später überarbeitet habe).
- Ich wusste nicht, wie es nach Code roch , aber oh, wie ich darüber Bescheid wissen musste
- Ich habe versucht, überall globale Variablen zu verwenden, und nicht lokale (ich dachte paranoid, wenn ich häufig eine Funktion anfordere, wird die lokale Variable innerhalb der Funktion immer wieder erstellt, und es würde nur eine globale geben. Infolgedessen wird nach Hunderten von Aufrufen der Funktion mit lokalen Variablen Ich hätte eine Menge verschwendeten Arbeitsspeichers und Leistungsverlust aufgrund von Garbage Collector.
- Ich habe mich nicht immer an einen einheitlichen Stil im Code und im Namen aller Assets gehalten. Hier ist ein gutes Vorbild für UE4 (es gibt viele nützliche Dinge zum Benennen von Assets und ich verwende es auch in Unity).
- Ich habe vergessen, dass ich die Anwendung hauptsächlich für meine Tochter schreibe und nicht um eines schönen Codes willen oder um anderen Benutzern zu gefallen.
Mir wurde klar, dass:
- Kinder können sehr einfach auf meiner Anwendung sitzen (unmittelbar nach der Installation der Anwendung können sie stundenlang darin hängen, bis der Akku des Telefons leer ist).
- Kinder sind süchtig nach Mathe in meiner Bewerbung, auch wenn sie nicht über Geld sprechen. Wenn zwei Kinder in der Familie sind, kam es sogar zu telefonischen Kämpfen, um Beispiele zu lösen.
- Meine Bewerbung langweilt sich sehr schnell für Kinder. Am nächsten Tag spielten nur wenige Leute die Bewerbung, auch wenn das Kind realisierte, dass es Geld dafür erhalten würde.
- Eine schlechte Benutzer- / Kinderbindung ist nicht gerade das Problem meiner Bewerbung, sondern die Besonderheiten des Unterrichts von Kindern (dies wurde mir von Schullehrern mitgeteilt). Die Anwendung sollte sehr vielfältig sein, um das Interesse an Kindern jederzeit aufrechtzuerhalten.
- Sehr oft interpretieren Eltern und Kinder das Prinzip der Anwendung falsch und denken, dass sie durch das Lösen von Beispielen Geld von mir (vom Entwickler) erhalten. Ich erhielt verschiedene Briefe mit Fragen wie: Wie kann ich Geld abheben, kann ich auf Webmoney oder Paypal abheben, wo ich die Adresse für das Senden von Geld per Scheck angeben kann usw.
- Wenn Sie sich für Ihre Fehler und Versehen bei der Beantwortung schlechter Bewertungen entschuldigen (und auch erklären, wie es tatsächlich funktionieren sollte), neigen die Leute dazu, Fehler zu vergeben und schlechte Noten zu entfernen.
- Sie kommen mit Ihrer eigenen Werbung nicht weit.
- Kinder wachsen sehr schnell und während ich die App schrieb, ist meine Tochter ihr bereits entwachsen. Aber mein neuer "Tester" wird erwachsen!
Referenzen
Liste der Links aus dem Artikel in der Reihenfolge ihrer Erwähnung:
+ So behalten Sie einen C # Style Guide für einen einzelnen Codestil unter Berücksichtigung von Unity bei .
+ GitHub und Video zum Verschrauben von Git mit Unity .
+ Es gibt ein kostenloses privates Repository auf GitLab oder Bitbucket .
+ Kostenlose Audacity zum Aufnehmen und Bearbeiten von Audio.
+ So entfernen Sie die Tonverzögerung .
+ Unity Android Build Video Tutorial - Gewusst wie .
+ Video So unterschreiben Sie eine Unity-App für den Android-Markt .
+ Apple-Geräte, die Metal / OpenGL ES 3 unterstützen .
+ App-Ausdünnung (Apple-Dokumentation).
+ App-Ausdünnung (Unity-Hilfe).
+ AssetBundle Workflow (Unity-Dokumentation).
+ Wo bekomme ich die Team ID?
+ Was sind Code-Gerüche ?
+ Das Prinzip der Benennung von Assets / Ressourcen in Spielprojekten auf UE4 .
Danke fürs Lesen!