我在Unity和C#中为一个女儿创建一个激励应用程序(iOS和Android)的故事

创建应用程序的故事,该应用程序使孩子们可以用自己的思想赚钱


这是故事的第一部分(结合我的错误及其解决方案的故事),讲述我如何(在业余时间大约两年中)如何开发适用于iOS和Android的移动应用程序,这将激励我的女儿解决数学示例,以便她在算术基础上实现了自动化(10号仓库或乘法算盘)。 结果,事实证明,该应用程序使孩子可以用自己的思想赚钱。


我使用了Unity引擎和C#语言,以及一套额外的软件,例如强制性的Photohsop或Audacity(用于创建声音)。


故事大纲(第一部分)


  • 背景知识
  • 关于获利
  • 为什么要团结
  • 关于脚本对象
  • 关于Anima2D插件
  • 关于精益本地化
  • 关于iTween
  • 关于Unity Analitics
  • 关于Visual Studio
  • 参考文献

背景和科罗拉多甲虫


我以前的经验是3D的开发,最近是与程序员一起开发多个独立游戏的经验,我主要是担任设计师和美术师(很少用C#编写一些基本脚本)。 虽然,我对编程有直接的了解(我曾经在学校里玩过Basic,然后在大学里涉猎C / C ++)。


这整个史诗始于一个问题。 我看到,在解决学校问题时,我的女儿“踩踏”并弄错了,不是因为复杂,而是基于错误。 我认为,如果我写给她一个有趣的应用程序,让她以游戏形式解决示例(以这种方式获得经验并实现自动化),那将很有趣。 为了激励她更多,我确保她收到了用于正确决定示例的款项(金额是由应用程序根据正确答案的数量计算出来的,然后我推断出必要的金额,并向女儿支付了现金)。


虽然...这个故事甚至更早开始。 首先,我让我的女儿成为一个付费学习英语单词的应用程序。 但是事实证明,该应用程序实施起来要困难得多,因此不仅对我(开发人员)和我的女儿,而且对其他父母也变得很方便。 因此,英语应用程序仍是内部开发。


我选择这笔钱作为激励因素,因为这是最容易实现的。 同时也由于个人的童年记忆:我喜欢为金钱而做的一切。 即使这是一项非常繁琐的工作,例如收集科罗拉多马铃薯甲虫。 我记得我收集了他们的半升罐子(我父母为每个虫子付给我1科比)。 因此,我认为自从我的女儿(我没有检查过,但我对此很确定)之后,她应该会喜欢它。 好吧,最后我没有输。


我的妻子反对鼓励孩子为钱做事。 但是我的论点使她有些信服:在这种情况下,孩子得到的钱不是因为他应该做的事情(例如家庭作业),而是因为他在业余时间练习数学。


我开始开发的第二个原因是因为我想练习编程。 自从学校一年级以来(就在“成为科学家”的梦想之后,但在“制作漫画”的梦想之前),“成为一名程序员”一直是我的梦想。


货币化和愉悦


最初,我专门为女儿的iPod touch 5制作了此应用程序(工作名称为Math4Ami)。 我什至没有想到要在所有iOS设备上都可以使用该应用程序,也不打算将其发布给所有人,尤其是我没有想到要在Android平台上发布该应用程序(我听到了来自iOS开发人员的许多恐怖故事,而且我没有任何可以测试其Android版本的消息)。


前段时间,我很想在AppStore中发布它(我被我认为自己将在Apple Store中拥有自己的应用程序并且每个人都可以看到它的想法深深吸引了我)。


我以为一个月后就可以解决。 毕竟,所有功能都已准备就绪,剩下的就是让它适用于屏幕的所有纵横比,不仅对我而且对其他父母也可以理解。 现在,六个月后,我在AppStore和Google Play上发布了它。


最初,我决定让Math4Ami完全免费,而无需货币化。 做出此决定有几个原因。


第一个 正如您已经了解的那样,我最初是为我的女儿免费提供的,并且不想在开发的“最后”花费任何精力。


第二个。 我认为这将是我的荣幸。 我已经有过类似的经历-我制作了一个休闲博客(起初只是为了赚钱:托管和域名费用,撰写文章及其促销的时间)。 我的逻辑是这样的:如果我花钱参观水上公园,买书或买冰淇淋以获得乐趣,那么为什么我不能负担得起钱来托管,注册苹果开发者计划的域名或会员资格,如果这也给我带来了乐趣。


第三个-为了扩大受众,这将被大幅削减,从而使应用程序付费(就像许多儿童应用程序的开发人员一样)。 我出于以下原因取消了其他类型的获利功能。


我无法忍受游戏中的广告-当应用程序的设计因广告消息而被毁容时,我不喜欢它(除了以随意的视频观看形式的广告,而不是当视频突然出现时的广告)。 此外,要参加Apple的“儿童制作”计划和Google的“专为家庭设计”计划,您需要严格过滤展示给儿童的广告。


在游戏中进行购买时,作为父母,我本人会阻止所有设备和儿童,当他们自己下载应用程序时,根本无法在应用程序内部购买任何东西。 另一件事是,当父母本人最初为孩子购买应用程序时(但是我上面已经说过了)。


为什么团结以及如何


我选择Unity是因为我之前曾在其中工作过,所以我喜欢它。 作为C#程序员,我还有一个好朋友,我希望他能在编程方面对我有所帮助。 Unity社区也很丰富,几乎可以在Google上找到有关在C#+ Unity上实现某些功能的所有问题的答案。


我还与Unreal(作为3D美术师)一起工作,但我既不了解C ++或2D功能。


最初,尽管说得很响,Math4Ami还是“阴天”。 所有数据都存储在我的eVPS(弹性虚拟专用服务器)上,我使用FTP传输带有数据和应用程序设置的TXT文件(尽管我已经在node.js上编写了将服务器写入服务器的第一步,但我的手并没有到达数据库。进行)。 为了使用ftp,我将易于使用的Simple C#FTP Class固定在Unity上。


然后,当我决定将应用程序公开时,我放弃了服务器端。


一方面,这太混乱了:进行身份验证(用户不喜欢)或使用NSUbiquitousKeyValueStore将会话标识符保存在iCloud中(这会在卸载应用程序和重新安装应用程序之间自动识别用户),但是我仍然无法弄清楚这样做(也许我正确编写Unity插件的文章对我有帮助。第1部分:iOS ,但还没有。)


另一方面,此应用程序中的数据不是很重要,因此需要将其存储在服务器上。


第三,不需要服务器同步。 这是我的英语教学申请-是的,需要同步。 由于父母在父母申请中添加了新单词,并且孩子在孩子的申请中教了他们(尽管也许我是业余爱好者,使事情变得复杂)。


结果,我确保所有内容都存储在本地(在设备上),而不是txt,而是JSON格式。


ScriptableObject和正确答案


JSON格式与ScriptableObject结合在一起是一个不错的发现。 我使用UnityEngine的本机方法序列化json- JsonUtility中的对象(然后将json文本文件在设备上本地保存到Application.persistentDataPath文件夹中)。


ScriptableObject (SO)是一个单独的对话主题,但我仍然会谈谈它。 我什至无法想象我以前怎么没有SO。


我在工作中使用的所有内容,都是从这两个非常有用的视频中获得的,这些视频介绍了使用SO的原理(以及GitHub和Bitbucket上的随附代码):



我个人将SO用于以下目的:


  • 要存储数据(这样就不必每次都添加代码来添加新功能或数据):
    • 各种各样的例子
    • 货币种类
    • 按钮样式(我在很多地方都有相同的按钮,而我只是根据SO为它们创建外观),
    • 奖励价值等

  • 作为全局变量(在所有场景中均可见):
    • 正确答案数
    • 赚到的钱
    • 当前有效的设置
    • 当前类型的例子
    • 计时器,高分等

  • 存储逻辑(例如,订阅接收正确答案的事件)。

SO处理数据的唯一缺点是您不能在其中的应用程序会话之间存储数据:SO资产(在应用程序冷启动之后)将始终包含您在编辑器中写入的数据。 因此,我的工作逻辑如下:


  1. 启动应用程序后,我从磁盘读取json文件,并将它们中的数据加载到SO资产中(FromJsonOverwrite方法)。
  2. 当应用程序运行时,我需要最大的性能-我只使用可脚本对象资产。 这些资产在应用程序运行时或在后台始终存储数据。
  3. 当您需要保存数据时(例如,在应用程序终止时或工作时),我将SO序列化为json(ToJson方法)并将其保存到磁盘。

这种方法有一个(明显的)缺点-您不能仅将一个更改的参数保存到磁盘(如果SO中有多个参数),则必须始终保存整个json文本文件。


但是许多数据不需要保存到磁盘上(例如,当前正确答案的数量),因此SO是一个功能强大的工具,可让我大大简化工作。


在下面的视频中,我演示了一个使用UnityEvent(事件-正确答案的数量是否发生了变化)对正确和错误答案进行解释的示例实现方式+侦听器(如果侦听器听到收到正确的答案,侦听器会做一些工作,并且订阅该事件的侦听器的逻辑也是在SO上实现)+ SO(保留正确答案的数量):



因此,我不仅可以用手输入正确和错误的答案,还可以通过移动滑块,生成新示例并测试应用程序的逻辑来简单地进行操作。


Anima2D,角色和抽搐的微笑


上面的视频显示,当新的便士掉落时,其他便士开始大笑,当便便掉下来时,便士感到恐惧。


很长时间以来,我无法克服毛刺,当从一种微笑转变为另一种微笑时,变化并不会立即发生,而是会眨眼(从一种状态变为另一种状态)。 此外,我将告诉您我是如何意识到这一点以及如何克服这一故障的。


使用Sprite Mesh Animation脚本可以实现面部表情的更改,该脚本是功能强大的Anima2D插件 (Unity最近购买并免费提供)的一部分。 这个脚本实际上只是使用“ 帧”滑块切换嘴的精灵(微笑,张开微笑,嘴巴害怕):


Sprite Mesh动画使用Sprite切换面部表情


整个埋伏是无法直接从脚本更改“ 帧”滑块的值,而只能通过动画系统更改。 因此,我以加法混合模式创建了一个新的OpenSmile动画层(下图中的箭头1),权 = 1,并在其中添加了恐怖动画( Coin_scared )和笑容( SmillingWide )。


顺便说一句,您是否注意到我设置的动画名称不好的例子? 我仍在将名称统一为一种样式。 将Coin_scared更改为A_CoinScared是正确的(为什么只需在“我后悔”部分中阅读)。


我创建了一个新层,并且不使用旧层,因为我不想覆盖口动画 。 我所要做的就是改变的精灵 (从微笑变成宽阔的微笑,或者从微笑变成恐怖),以便使嘴的动画从基础层开始。 这就是为什么我选择“ 添加”混合模式的原因- 新动画添加到现有动画(而不覆盖它)。


本质上讲SmillingWideCoin_scared动画分别是“ 帧”滑块在位置1和2处的动画。


设置面部表情动画之间的过渡


整个问题是从任何状态到恐怖状态的过渡(当您单击过渡时(上图中的箭头2),检查器打开了该过渡的属性(上图中的箭头3))不是立即发生的,而是在在过渡持续时间 (上图中的箭头4)期间,默认情况下不为null。 因此,“ Frame”滑块的值无法正确更改,因为只有整数,这意味着在0到1之间没有中间值。 因此,为了消除闪烁的毛刺,只需重置“ 过渡持续时间”值。


好吧,触发器isScared上图中的箭头5)用作进入恐怖状态的条件。 我使用以下对Animator组件挂在其上的对象的调用(使用上面显示的控制器层)在代码中激活此触发器:


...GetComponent<Animator>().SetTrigger("isScared"); 

我如何将应用程序翻译成不同的语言


在Habré的某个地方,我读到您需要在创建应用程序之初就考虑本地化,并且……在经过一年半的开发后(我决定将Math4Ami公开),我立即遵循了这一建议。


为什么我选择精益本地化 (除了插件免费的原因)我不记得了,但是我记得我选择了很长时间很辛苦。


事实证明,使用它非常简单。 您可以手动设置语言或使用自动语言检测。 我决定进行自动语言检测(以下是其他儿童应用程序的示例)。


该插件可以翻译所有内容(从文本到声音和图片)。


但是我仍然对本地化犯了一个错误(尽管我故意这样做,因为我想尝试不同的方法)。 错误是我没有将所有短语都放在文本文件中(在下图的左侧)。 “精益本地化”部分(下图右侧)中还保留了一些短语。 所以现在,当我将此文件交给日语翻译时,我必须手动进行工作(将所有内容传输到文本文件)。



尽管某些内容无法用文本文件转换(例如,空格“”,我将其用作数千个分隔符),但您仍然必须使用该组件。


多汁的iTween


曾几何时,我观看了一段精美的Juice视频, 无论它是如何消失的,都是关于各种微小的微运动和动画的细微差别如何帮助您在无聊的游戏中做出令人叹为观止的动作。 甚至在此之前,另一个录像带就进入了我的灵魂-屏幕震动的艺术 ,这实际上不仅是屏幕震动,而且也不是那么重要。


在我创建Math4Ami的所有时间中,我都牢记上述视频中的概念,以及所有这些附加动画应尽可能短并且对潜意识比对意识起作用的想法。 有时,我花更多的时间来添加“多汁”而不是添加有用的功能。


只有一个地方非常困扰我-所赚钱的最终数目(您可以在上面我的视频演示的结尾看到这一刻)。 我尽快将其缩短,但仍然需要4秒多一点的时间(键盘消失,出现题字胜利,kopeks正在计数,记录表已退出,显示名称牌“ New Recorder”,并显示“ More”按钮)。


对我而言,最好的“果汁来源”是免费的iTween附加组件。 我什至无法想象如果没有Unity,您将无法做任何事情。 我在至少需要某种动画的地方使用它(无论是按钮的动画还是菜单项的外观或计数分的动画)。


我尝试根据协程和Mathf.Lerp或Mathf.MoveTowards自行实现类似的功能,但是它不灵活且不通用(有时在编辑器和设备上的工作方式有所不同)。 因此,现在我不打算重新发明轮子,我只是喜欢iTween。


在这个动画系统中存在陷阱,我最初不正确地使用了这些陷阱:


  • 如果在iTween工作期间隐藏对象(例如,通过SetActive(false) ),然后再次显示该对象,则iTween将继续从被中断的位置执行。
  • 如果在一个iTween的操作过程中启动另一个(影响相同的值),则在两个iTween的执行结束时,对象可能不会返回其原始位置。
  • 您需要跟踪哪个GameObject可以启动iTween,以及可以运行的动画。

例如(根据最后一点),对象A启动iTween以便可以在对象B上运行。要停止iTween动画,您不能仅在对象A上启动iTween.Stop()。您需要启动iTween.Stop(对象B)。


iTween的优势在于其使用不同类型的缓动的能力。 Ising是使运动柔和的参数(这样它就不会突然开始并且不会愚蠢地结束)。


对我来说很棒的发现是ising的类型:


  • 春天
  • easeOutBounce
  • easeInBack
  • easeOutElastic

为了找到正确的位置,我使用了可视化的Easy Demo (我需要闪光灯)。 在这里,我将获取所有类型的iTween动画文档


Apple和Google的统计数据不错,但Unity Analytics更好


即使从过去的游戏经验中,我也知道拥有自己的统计数据非常酷。 最初,我想创建某种日志系统,但是后来我想起了Unity Analitics 。 当我发现我的案例的功能的免费版本不受任何限制时,我感到惊讶。 如果我能通过某种货币获利,那就更糟了,那么分析工具仅适用于Pro订阅者。


通过简单地将Analytics.CustomEvent嵌入到代码中的正确位置,我可以跟踪哪些示例更受欢迎,在头几天或一段时间后有多少孩子解决示例,等等。


我可以在一处比较来自不同平台(iOS和Android)的数据。


那里有多少有趣的事情,我想尝试一下,但是所有人都无法达到。 键入远程设置 (无需更新即可更改应用程序的内容)或A / B测试教程管理器


像Sublime一样的Visual Studio


过去,当我需要编辑一些代码(例如python,html或node.js)时,我使用了Notepad ++ (完全免费,但仅在Windows上)和Sublime Text (为所有操作系统付费),但是您可以免费试用)


在Unity中,我当时坐在MonoDevelop上,但是他对自己的毛病(例如无法在布局之间切换或无法粘贴复制到Mono之外的东西)感到厌烦,以至于我决定是时候该下沉了,爬上Visual Studio Community 2017 (很好,对于像我这样的单一开发人员来说是免费的)。


对于Unity 2018上的开发人员来说,这现在不相关,因为2018年版本中包含了多平台Visual Studio Code 。 但是我想让我的应用程序在iOS 7下运行(因为我女儿的iPhone与此iOS兼容),所以我必须使用任何早于2018年的Unity版本。


它帮助我过渡到VS视频。 如何使用Unity设置Visual Studio


从包装盒上看,VS并没有我在其他编辑器中惯用的所有好东西,因此我简化了我的生活:


  • 打开小地图,而不是简单的垂直滚动:

如何在Visual Studio中启用迷你地图,而不只是滚动


  • 添加了扩展名SemanticColorizer ,它允许更灵活地自定义代码颜色。 具体来说,我需要它通过颜色区分全局变量和局部变量。
  • 已安装的Match Margin扩展名,该扩展名将根据代码文本选择笔架下的单词及其所有副本,并在小地图上执行此操作。 这对于快速的代码导航非常方便,可以找到使用某些方法或变量的所有位置:

Visual Studio中的代码设计和改进的小地图



为此应用程序编写的脚本在GitHub上。 只有我的脚本 ,而不是整个Unity项目-很抱歉,如果这使它们无法理解。 直到最后一刻,我还没有计划提供到源的链接,因为我认为我的代码不值得关注。 但是后来他改变了主意,因为更有经验的开发人员可能会指出我的错误。


这是第一部分的结尾。 继续阅读第二部分 ,我将告诉您:


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

参考文献


文章正文中按其提及的顺序列出的链接列表:


+ 简单的C#FTP类。
+ iOS的会话ID。
+ 我们为Unity正确编写了插件。 第1部分:iOS
+ 在JSON中序列化对象的方法 (官方帮助)。
+ ScriptableObject (官方帮助)。
+视频教程具有可脚本化对象的游戏架构代码 )。
+ 在光荣的可脚本化对象革命代码 )中推翻MonoBehavior暴政的工作坊。
+ 我在编辑器中的应用程序的视频演示
+免费的Anima2D插件,用于2D角色的骨骼动画
+用于应用程序本地化的免费库- 精益本地化。
+有关技巧的视频,可以改善游戏的感知或输掉游戏。
+有关动画潜意识表演技术的视频。
+免费但功能强大的iTween动画系统
+可视化显示ising类型 (需要闪烁)。
+ iTween (官方帮助)。
+ Unity Analitics
+文本编辑器Notepad ++Sublime Text
+ Visual Studio Community 2017Visual Studio代码
+视频教程如何使用Unity设置Visual Studio
+插件SemanticColorizer (用于代码颜色设置)。
+ Match Margin插件(选择笔架及其所有副本下的单词)。
+ Strip'em插件(行尾的自动更正)。

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


All Articles