2019.5.29

Introducing Wavy

我自己也没想到又折腾了一个动态壁纸出来,而且这次特别快,差不多五天完工的。Wavy 是一个 Low Poly 海面动态壁纸,下载地址可见 Google Play
为什么会(又)做了一个东西呢,因为 Wavy 所使用的 Low Poly Shader 原本是我在编写为 Unity 的 macOS 窗口插件的时候所用的测试内容,没想到还挺好看,动态效果如可以看下面的 Instagram:

View this post on Instagram

WIP

A post shared by JustinFincher (@justzht) on

因为效果看起来还不错,我其实之前就有一份个人用的简陋版本在 Pixel 3 用着。后来想着不如拿这个来快速试下 Android 上免费 + IAP + 广告这一盈利策略,也就是说我在实现 Google Play 上大致可用的几种盈利模型。而 Skyline 就是付费无内购的高端软件,Vortex 是免费无内购的入门软件,因此这个时候需要一个免费加内购的软件来补充这个实验对照。Wavy 因此也本着求快的方式简单做了下,在 UI 和精细度上都不如 Skyline 和 Vortex,有兴趣的同学可以去下载玩下。
产品线齐了之后我估计就不做 Android 动态壁纸了(除非 Metropolis 项目可以再抢救下),接下来把在 Windows / macOS / Android 做动态壁纸的经验总结下,写一个跨平台 Unity 插件,准备授之以渔了。目前在做的 macOS 版估计是第一个实现的组件,其实 Unity 在这几个平台上做动态壁纸的原理都十分简单,难的反而是边边角角的事件处理,举例来说:

  • macOS 上的实现只是对 NSWindow 的 mask 做处理
  • Android 上的实现关键在于 unityplayer 的 constuctor 传入的 context

但是为了满足上述的两个简单的思路,有很多细碎的坑要填:

  • macOS 的 window collection 处理,不然切换 space 的时候不会跟随
  • macOS 休眠时的回调处理
  • 提供 macOS 的 statusbar menu API 给 Unity
  • Android Wallpaper Service 的回调处理
  • 一些 Unity 引入的小 bug,比如在 Android P / Q 上的宽高比问题,2018.3.7 引入的 string.xml 查找 game_view_desc 字段问题,一些原生插件获取 activity 的兼容问题(比如下文的 UIWidgets 目前就是默认 UnityPlayer 的 Context 是 Activity)

以上都是外人看来怕是毫无价值和创造性的问题,因为本质上做这个是在拿自己的时间去弥补平台和运行时的差异或是去绕过别人写的 bug,怎么看都是一个无底洞。但总会有这种吸附于大平台做细碎的事情的需求的,只能说为了好玩而做的吧,而且也是要恰饭的(

UIWidgets

把 Node Editor 里面的两个 UIWidgets 组件开源了,其实内容都挺简单的:

用的是 Unity Package Manager 兼容的格式,依赖了 UIWidgets 的 git 仓库,至于 UIWidgets 的 Asset Store 版本我还在考虑要不要也对应做一个包。此外还给他们项目提了一个关于 macOS 的 PR,后面如果说有时间的话我想给 UIWidgets 写一个 Rider 插件,目前的缩进和折叠支持都太差了。