为儿童创建一个移动应用程序的故事,使您可以用自己的思想赚钱。 延续性

延续iOS / Android移动应用程序发展的历史,以激励孩子们进行数学运算


这是故事的第二部分(结合我的错误及其解决方案的故事),讲述了我如何(在业余时间大约两年中)开发了一个移动应用程序(适用于iOS / Android),该应用程序激发了我女儿解决数学示例的动机。 结果,事实证明,该应用程序使孩子可以用自己的思想赚钱。


在这里阅读第一部分


第二部分计划


  • 关于编写代码
  • 关于版本控制
  • 关于配音
  • 关于图标
  • 关于Android的版本和大小
  • 关于iOS版本和大小
  • 关于标题和晋升
  • 统计资料
  • 我后悔
  • 什么了解
  • 参考文献

编程琐事让我的生活更轻松


  • 自从Mono以来,我继续使用// TODO (在注释中)标记需要确定的位置。 然后,可以在“任务列表”选项卡上方便地监视所有这些位置(Ctrl + \,称为T):

使用// todo创建任务列表


  • 最近,我开始使用诸如#region这样的功能来隐藏变量枚举的区域:

在代码中使用区域


  • 使用热键Ctrl + K,Ctrl + S的顺序将部分代码包装成一些结构很方便。 例如,我选择需要放在if内的代码部分,然后按Ctrl + K,然后立即按Ctrl + S,输入所需的运算符(如果),然后按Enter。
  • 如果您坚持一种样式,则可以极大地简化代码的工作,例如,在这里- 牢记UnityC#样式指南
  • 我很高兴与Coroutine成为朋友-这些功能大致可以将其执行扩展到几个框架。 即 他们不会尝试在一个帧中完成任何任务(计算半秒钟,从而将性能降低到2 FPS),但是他们在第一帧中做了一些工作,在第二帧中做了一些工作,依此类推,以至于游戏不会变慢。 他们的另一个目的是执行不需要在每个帧中直接完成的操作(例如,每秒检查3次)。

下面的示例显示了一个交通灯的协同程序,该交通灯无限次(每十秒钟)依次点亮黄,红,绿灯:


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()); } } 

如果使用人类语言,那么yield语句只是告诉Unity,有必要将函数的执行转移到下一帧(必要时进行多次),直到执行为止,然后继续执行下一个yield指令。 T.O. 协程红绿灯将像这样运行:


  1. 首先要等待10秒(首次屈服),
  2. 然后BlinkYellow协程开始(第二产量),直到完成为止,BlinkRed协程不会开始,
  3. BlinkYellow完成后,BlinkRed启动,
  4. BlinkRed完成后,将启动BlinkGreen,
  5. 然后循环从头开始重复(请参阅第1点)。

版本控制,好吧,真的很必要!


帮助我开始将GitHub与Unity结合使用的视频- 如何将GitHub与Unity结合使用


尽管我自己(没有团队)独自编写了代码,但我意识到代码的版本控制对我而言至关重要:


  • 我不再害怕对代码进行任何根本性的更改,而这些更改可能会破坏项目。
  • 返回到您以前的工作状态非常容易。
  • 比较文件和代码很方便。
  • 您可以清楚地看到代码中发生了什么变化。
  • 无论计算机发生什么变化,我始终在云中拥有一个备份版本。

但是只有在使用版本控制时,您才需要习惯于很小一部分来提交(发布更新)。 为了一开始不像我的那样,我更改了20个文件,添加了很多新功能,并以“ Fuh,现在终于可以使用”的名称一次全部完成了。


很好,我曾经发现最好不要向存储库中添加缓存文件(库文件夹),临时文件(tmp,obj文件夹)以及Unity即时生成的所有内容。 实际上,只需要将Assets和ProjectSettings文件夹添加到资源库。


不必使用GitHub,因为GitHub的缺点在于,使用免费帐户无法将代码设为私有(仅对您自己可见)。 但是如果可能的话,还有GitLabBitbucket


我如何将rprprrruk插入麦克风


我认为我的申请具有教育意义,并尽可能尝试不要分散注意力。 因此,有时用户会抱怨缺乏音乐或界面非常简单(尽管简单的界面并不是因为我太想要它,而是因为我不知道如何做得更好)。 在音乐方面,我现在处在一个十字路口:我想补充一点点东西(老师不太可能会批准将数学作业定为音乐的决定)。


音乐,音乐,但没有声音表演是不可能的。 最初,我在免费的声音中搜索所需的声音,但是后来我意识到,与我自己制作声音相比,搜索花费的时间更多。 因此,我只需要用电话麦克风在嘴里创建大多数声音,然后使用Audacity (一种用于记录和编辑音频的免费多平台软件,即可将声音从一种格式转换为另一种格式)进行处理。


通常,在Audacity中创建声音效果的逻辑如下:


  1. 切断所有不必要的内容。
  2. 使用降噪效果(从录音中去除噪音)。
  3. 添加了哇哇哇音的卡通效果。
  4. 通过效果器,以频率播放低音和高音,从而使智能手机扬声器上的声音听起来更甜美。
  5. 如果我说了些什么,“更改音调”,“速度”和“速度”的效果会将我的声音变成花栗鼠。

起初,我的声音明显落后于事件(不是在编辑器中,而是在智能手机上)。 将“ DSP缓冲区大小”选项设置为“ 最佳延迟” (“编辑”->“项目设置”->“音频”)很有帮助, 这些都是提示 (问题和答案中均如此)。


女儿如何产生图标创意


在开发应用程序时,我尝试了几次以自己创建图标的过程,但是没有一个扎根(实际上,有些残渣出来了)。 因此,当要公开出版时,我委托我的女儿开发了一个图标。 我向她解释了该图标应该很吸引人,并解释了该应用程序的含义。 她怀着极大的热情,立刻画出了一张完全不合适的图画。 我拒绝了它,并解释了到底有什么需要改进或根本不使用。 然后一切都按预期进行-她得罪了并停止绘制图标。


半个月后,侮辱过去了,她更加彻底地完成了任务:她将笔记本上的方块切成盒子(iPod屏幕上图标的大小),并开始一个接一个地绘制选项:


女儿绘制的图标选项


带给我。 我选择了我喜欢的想法。 他说了朝哪个方向前进。 她去画了以下选项。 经过两天和三打的选择,我们在右下方定居(上图)。


然后,我让女儿画一个放大的图标(下图左侧的第一个图标),并对其进行了数字化处理(左图的第二个图标),然后……给艺术家的一个朋友打电话,以帮助我进行颜色选择。 结果,获得了中央版本。 然后,我开始在商店中整个应用程序的生命周期中逐渐研磨图标(右侧第二个图标)。 现在,她看起来像是最右边的:


图标创建进度


Android版


Unity Android Build的这段视频-如何帮助我创建我的第一个APK文件,其中介绍了如何在不安装繁重的Android Studio的情况下配置所有内容。


我再说一遍,我没有配备Android的设备(我只是请我的朋友在新版本构建后进行测试),因此我在视频中显示的设备没有任何错误。


但是没有障碍,它仍然无法做到。 我不得不修补Android SDK更新了很长时间,因为Unity不想使用最新的更新。 结果,事实证明有必要允许Unity选择并安装更新本身的必要版本。 即 我只是单击Unity本身中的Update Android SDK按钮,但没有尝试自己更新所有内容,如视频所示。


手动更新Android SDK时出现问题

直到我意识到需要从Unity下进行更新之前,我苦了很长时间,使用sdkmanager.bat脚本手动更新(您需要将此脚本与--update参数一起使用,而不是与android.bat一起使用,如视频中所示)。 在更新过程中,他抱怨说自己无法覆盖tools文件夹(他本人是从该文件夹开始的)。 我尝试了很多技巧,但我什至不记得有什么帮助,似乎是某种使用符号链接的解决方案。


此外,还会弹出与Java相关的无法理解的错误。 原来 Java Development Kit 的版本存在问题-它也不需要与最新版本一起安装。 我尝试了几个旧的,其中一个错误消失了,并且一切正常。


借助用于在Google Play上发布的签名APK, 如何为Android Market视频签名Unity应用程序对我有所帮助。 我仔细保存了这两个密码,因为每次创建新版本时都需要输入它们。 如果丢失了它们,您将无法更新该应用程序(只需使用新密钥发布一个新的应用程序)。


与iOS版本不同,该图标最初必须带有圆角,否则在某些设备上,它将保持完美的正方形。


Android的构建大小


现在我的apk文件大小为22MB。


我使用有损纹理/精灵压缩格式很好地减小了装配体的大小-RGBA紧缩ETC2 (用于带有alpha的精灵)和RGB紧缩ETC (用于没有alpha的纹理)。 最主要的是将Compressor Quality设置为100(此参数不会影响最终设备上的纹理速度,而只会影响编辑器中的纹理质量和压缩速度)。


使用铃鼓进行的其他任何舞蹈都不允许我大幅减少apk文件的大小(以下描述的某些细微差别除外)。


现在我正在使用以下..


.. 播放器设置中的设置 ..


..一方面是最小尺寸,另一方面是设备的最大覆盖范围:


  • Unity 2018.1(版本越新,包装越好,所有东西越多)。
  • 自动图形API(Unity本身选择OpenGLES2和3)。
  • 脚本后端-Mono(它可能不比IL2CPP快,但是程序集绝对较小)。
  • 目标体系结构-ARMv7和x86。 通过取消对Intel x86的支持,我将apk大小又减少了10MB(原为12MB)。 但是我不知道删除此复选标记后会切断多少设备。 我所知道的是,这种架构下的手机已经发布两年了。 而且那些可以用一只手的手指数(我知道的最后一个是华硕Zenfone,联想K 900,Xolo x1000,也许还有一些)。 如果我胡说八道,请在评论中纠正我。
  • 装料水平-条形组件-安全地切断不必要的代码。 其他选择可以而且确实可以增加尺寸(我在家里还没有注意到),但并不是那么安全。
  • 构建系统-Gradle(允许您激活Minify选项)。
  • Minify-Proguard-缩短所有类和变量的名称,以节省字节的大小,但是,此外,它使代码的可读性降低,从而防止了逆向工程。

iOS版本


我在妻子的Macbook上收集了一个应用程序(我记得他们买了2015年最便宜的MacBook Air)。


要甚至在Xcode 9.3版中为iOS 7进行构建,只需将值7.0手动驱动到Deployment Target字段中(在General选项卡上)。


要将语言(我使用精益本地化将应用程序翻译成的语言)添加到AppStore中的应用程序描述中,我们必须在info.plist文件中添加以下行(例如,在<dict>之后的任何位置):


 <key>CFBundleLocalizations</key> <array> <string>English</string> <string>Russian</string> </array> 

现在我正在使用Unity 2017.4为iOS进行构建(如我在上面所述,我需要iOS 7支持,否则我将使用2018.1)。


iOS构建大小


现在,我的iPhone的下载文件大小为44 MB。


不幸的是,在iOS下,我无法使用Crunched Sprite,因为iPhone 5s之前的设备( 不支持Metal和OpenGL ES 3.0不支持它们


当我尝试不惜任何代价减小构建大小时,如果满足以下条件,则会获得最小大小(34 MB):


  • 使用Unity 2018(即最低支持的版本是iOS 8),
  • 图形API仅选择Metal,
  • 仅保留Target Architectures x64,
  • 使用紧缩的纹理。

但是我仍然没有弄清楚如何使用应用程序精简 -这种事情允许应用程序商店自动为最终用户的特定iPhone / iPad / iPod构建我的应用程序(这导致下载文件的大小减小)。 我只是有时间自己将文章起草到书签中:



我要分享的我的播放器设置”


  • 一次输入自动签名团队ID (您可以在Apple Developer网站上的“ 帐户”>“会员资格”中输入 )并选中“ 自动签名”框,这样以后就不用每次在Xcode中都使用它了,这很方便。
  • 我将加速度计频率设置为“ 禁用” (禁用了加速度计),因为我没有使用它。 我可以为人们节省一些电量。
  • 后台行为 - 挂起 -这样,当您按下“主页”按钮时,应用程序不会关闭,而是继续在后台运行(例如,您可以使用OnApplicationPause捕获此事件以保存游戏)。

我如何选择名字以及我用来晋升的东西


有多少人使用Booking和TripAdvisor,但我从没注意到他们在AppStore中的名称不仅是Booking,还包括“ Booking.com Travel Deals”和“ TripAdvisor Hotels Restaurants”(名称用关键字稀释,因此该应用程序基于这些关键字可以找到apstor)。 因此,我决定不使用旧名称Math4Ami,但是很长一段时间以来我都使用不同的措词来包含我需要的关键字。 最后,我首先学习了Pocket Money:数学,后来学习了Math&Earn Pocket Money。 在俄语中,这些选项听起来像是“用于数学的零用钱”和“零用钱和数学:学习和赚钱”。


我通过将链接发送/发布给朋友和熟人来提升我的应用程序,在我的博客上写了两篇文章,并在同一位置悬挂了一条横幅。


顺便说一句,如果您将此行放在<head>网页中:


 <meta name="apple-itunes-app" content="app-id=1372434662" /> 

..然后,在iPhone上打开此页面,每个人都将在顶部看到应用程序的横幅。


下载统计


首先,我发布了iOS版本。


iOS应用下载统计


许多人谈论对苹果设备的厌恶,并坚信Android要凉爽得多。 我决定进行检查,并在经过20天的apk文件汇编程序后,在Google Play上发布了该版本。


Android应用安装统计


您不会得出客观结论(或根本不会得出结论),而只是主观判断-我期望Google平台能提供更多结论,但目前看来,结果比苹果差一半。


我很遗憾:


  • 切换到新版本的Unity时,我没有做备份,
  • 没有使用版本控制系统(如git),
  • 我试图与Perforce一起工作(这是一个糟糕的系统-它不切实际地减慢了开发速度),
  • 以前没有使用过ScriptableObject(SO)-太酷了
  • 我在一个很长的表格中编写了代码(很害怕记住我以后如何重构此表格),
  • 我不知道代码味道是什么,但是哦,我需要如何了解它们,
  • 我尝试在所有地方使用全局变量,而不是局部变量(认为偏执狂,如果我经常请求一个函数,则会在函数内部一次又一次地创建局部变量,并且只会有一个全局变量。因此,在使用局部变量对该函数进行了数百次调用之后,由于垃圾收集器,我会浪费大量内存和性能,)
  • 我并非始终以代码和所有资产的名义坚持统一的风格。 这是UE4好榜样 (关于资产命名有很多有用的东西,我也在Unity中使用它),
  • 我忘记了我主要为我的女儿编写该应用程序,而不是为了编写漂亮的代码或取悦其他用户。

我意识到:


  • 孩子们很容易坐在我的应用程序上(安装应用程序后,他们可以在其中悬挂数小时,直到手机上的电池坐下为止),
  • 即使在不谈论金钱的情况下,孩子也会沉迷于在我的应用程序中进行数学运算。 如果一家人有两个孩子,甚至会通过电话打架解决例子,
  • 我的应用程序对孩子们非常无聊。 第二天,很少有人玩这个应用程序,即使孩子意识到他会为此收到钱,
  • 用户/孩子保留能力差并不是我的应用程序特别要解决的问题,而是教孩子的具体问题(学校老师告诉我)。 该应用程序应非常多样化,以便始终保持对儿童的兴趣,
  • 父母和孩子经常会误解应用程序的原理,并认为通过解决示例,他们将从我(开发商)那里得到钱。 我收到了不同的信件,信中涉及以下问题:如何取款,可以取款到webmoney或paypal,在哪里指定通过支票汇款的地址等,
  • 如果您为对差评的回答所犯的错误和疏忽表示歉意(并解释其实际工作方式),那么人们会原谅错误并消除不良评分,
  • 您在自己的晋升上做不到,
  • 孩子们成长很快,而在我编写应用程序时-我的女儿已经长大了。 但是,我的新“测试人员”正在成长!

参考文献


文章的链接列表,按其提及的顺序排列:


+如何牢记Unity的单一代码样式C#样式指南
+ GitHub有关如何将git固定到Unity的视频
+在GitLabBitbucket上有一个免费的私人存储库。
+免费Audacity,用于录制和编辑音频。
+ 如何消除声音延迟
+ Unity Android构建视频教程-如何
+视频如何为Android市场签署Unity应用
+ 支持Metal / OpenGL ES 3的Apple设备
+ 应用程序精简 (Apple文档)。
+ 应用程序精简 (Unity帮助)。
+ AssetBundle工作流程 (Unity文档)。
+ 在哪里获取团队ID
+什么是代码气味
+ 在UE4上的游戏项目中命名资产/资源的原则


感谢您的阅读!

Source: https://habr.com/ru/post/zh-CN414683/


All Articles