Blog logoJustZht

Blog logo

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 插件,目前的缩进和折叠支持都太差了。

2019.5.23

 • 

五月也过的很快。
工作闲暇之余总算是在写面向 Mac 的 Desktop Avatar / Live Wallpaper 解决方案了,这个插件本质上是一个 Objective-C 的原生插件,可以对 NSWindow 修改 windowLevel 和 collectionBehavior,外加获取鼠标位置 / 设置 NSStatusBarItem。而我也想通过这个再试试 Asset Store 的盈利能力。
买了一台 Pixelbook,拿来做一些备用机的工作还是挺有趣的,不像 iPad Pro 买了跑了几次 Swift Playground 就再也不知道要拿来干嘛了。另外我这台 Pixelbook 有一种以前拆封 Macbook 才有的特殊气味,键盘也和老款 (2015) MBP 一样舒服,心里很满足了。
有在慢慢准备后面的事情,这个月也花了不少钱报名语言考试。又是一年毕业季,而我像是在原地踏步,对于这个我倒是也没啥好改变的 -- 就当是 gap year 罢。
听了 Japanese Citypop/Funk Summer Chill MIX,看了 PUSHEEN'S VALENTINE

2019.5.17

 • 

十号左右的时候来上海呆了三天,参加了 Unite Shanghai。
B361F8A2-068F-4D5E-8C86-C84F844AD24A
听了一些 session,比如 ARCore,LWRP,Houdini 和 UIWidgets,其中 Houdini 关于程序化生成和装饰地形的 session 十分有趣。第一次参加 Unite 还是蛮新奇的,此外还有一些意外收获 hhh,等八月有眉目了再说。
在上海闲逛的时候拍了几张沿江的照片,后来查看的时候想起来之前在 twinmotion 里面渲染过类似角度的东西 hhh


今年的 Google I/O 上宣布了 Android Q 正式支持 Dark Mode,因此给 Skyline 做了下适配。Unity 在 Q beta 上有一些奇奇怪怪的问题,比如 raycast 的起始像素坐标偶尔会偏离到 Int.MaxValue 外去。此外 com.google.android.material:material 目前还是 1.1.0-alpha06 版本,在 Bottom App Bar 和 FAB 的处理上也有一些奇怪的 bug,因此适配了 Dark Mode 的 Skyline 还没有推到 Alpha Channel 里去。除此之外 Skyline 下一步还会提供一个 Slice Provider。
dark-theme-skyline


五月的前半个月感觉都在到处跑,没有安心坐下来真正写东西,因此 Node Editor 并没有进展太多,而且之前写的耦合太严重,准备重构了。


2019.5.5

 • 

banner
新版 Portfolio 上线了,更新了这一年做的一些内容,比如 Node Editor DemoVortexStarry 和一些 Hackathon 项目,此外 CetaceaChina Startup Simulator 也被归类到默认不展示的 Deprecated 类别里去,因为这两个项目到最终都没有上架,也没有后续计划了。
这版 Portfolio 是基于 Vue.js 来做的一个单页,后面加上了预渲染来处理 meta 爬虫抓不到的问题,不管如何都比之前 iframe + 手动编辑 html 静态页面体验好多了。


两周多之后终于把女神异闻录 5 的一周目通关了。说起来好久没这么对一个游戏痴迷过,上一次废寝忘食地玩还是大二的时候拿着朋友借给我的 PSV,恰巧打的也是女神异闻录 4 Golden,当时走到哪里都带着玩,甚至参加复旦 hackx 黑客松时,比赛日第二天早上还在会场里玩。曾几何时我觉得现实世界里的事情都已经足够我忙的,因此对架空世界的游戏有些抵触,认为游戏里再怎么高歌猛进在现实里仍然会面对烦心事,现在看来怕是因为当时现实的阻力还没有那么大,自己也像是游戏里的人物一样有信心解决所有事情而已,而境遇和心态不太稳定的时候,再去体验女神异闻录里面高中生的奇幻日常,倒也是能让自己安心和发现趣味的一种方式。

2019.4.25

 • 

今年没有过的 WWDC Playground 作品上架到 App Store 了,叫 Shader × Node,图标就是 Playground 里面做的一个 Shader 输出的效果,只不过不好捕捉所以在 Sketch 简单重绘了下。审核的时候又和苹果的人员扯皮了一下,因为审核人员拿条款 2.1 来压我说功能和 Safari 上的 Web App 没有太大区别。我这个软件虽然功能不多(毕竟只是为 Playground 设计的一个 Demo),但在 SpriteKit 和 UIKit Dynamics 的使用也算比较深层了,拿 2.1 来拒绝上架就很打击开发者,再加上之前关于有人买代码提交奖学金过了的事情我在 Developer Feedback 开了工单但是并没有得到有效的回复,因此当时很生气,感觉 App Store 审核团队严格得无理和莫名其妙,而奖学金审核却让人蒙混过关。我对审核人员没有特定的技术知识没有异议,但是最基础的技术常识都没有的话只会劝退开发者,更何况苹果一直想推 Pro App on iPad,而 Pro App 很多时候就像是我这个 Shader Node Editor 一样是外行很难看一眼明白的东西,只有特定的人群有需求,结果审核从 In Review 到 Reject 不到三分钟,直接以功能不足拒绝掉,那苹果对 Pro App 的定义到底是什么呢。我目前也没有太多 Cocoa 相关的个人项目在维护了,对这个平台的兴趣也在日渐下降,姑且看今年 WWDC 有什么吧。

2019.4.19

 • 

这几天看到 WWDC 有人提交不是自己的代码然后获得了奖学金的事情 Twitter Link 1 Link 2,实在是不知道要说什么了。在苹果开发者的帮助页面上开了一个工单,不过事已至此估计也没有翻盘的机会了,准备后面收拾收拾 ObjC 和 Swift 版本的 Node Shader Editor 开源并上架到 App Store 上。
提交 WWDC 的时候我在表单的 Comments 里面写“像是失去了魔力一样,而我只能接受自己并不总会有魔力的事实”。这一年来的确也是做什么什么都不顺,因此自然会有这类考虑,也变得有些迷茫了。后来和爸妈商量了下,下半年准备留学出国,如果这个阶段的时间比较轻松的话也可以再试试一些公司的面试,一边工作一边准备出国的考试。
最近玩了不少主机游戏,比如 Drive Club,神秘海域4 和女神异闻录5。听了 Velvet Light

2019.4.17

 • 

WWDC 2019 的奖学金结果出来了,结果我没有过。毕竟自认为 Shader Node Editor 这个作品的创意和完成度都是很高的,很莫名其妙了。
基于 Unity 和 UIWidgets 的 Scripting Node Editor 目前已经能运行基本的逻辑了,比如在 MonoBehaviour 内的 Update 打印 Hello World。在此之上我更新了下 UI,写了一个给 Unity 在 macOS 上的插件来修改 NSWindow 的标题属性,fullSizeContent 和 mask 从而实现了一个近似于 Chrome 的效果,这个截图里面除了 window control 以外窗口的其他内容都是 Unity 和 UIWidgets 绘制的:
Screenshot-2019-04-17-at-20.16.15

2019.4.8

 • 
Skyline

Skyline 上少数派的评测啦,欢迎围观。然后发现少数派报道过 Vortex,不过我当时应该在准备微软的面试,所以没注意 🤔。说到这个,也许六月份还会再试一次微软面试吧 hhh。

Node Editor

这几天给 Unity 上的 Node Editor 项目加了一个 Chrome 一样的多标签控件,原因是 Flutter 自带的 Scrollable Tab 会给 Tab 和 Container 都同时加上一个滑动手势识别,而作为 Container 的 Node Canvas 本身也有 Pan 的手势识别,因此就冲突了,因此自己写了一个针对桌面平台的 Scrollable Tab 控件,后期整理下也许会作为 Unity Package 开源在 GitHub 上。

2019-04-08-17.39.03

音乐

最近听了 Discogs Mix 072 - DJ MamabearMaybe It's Time

2019.4.6

 • 

这一个月几乎都在写 Node Editor,在个人写着图个好玩的 ObjC 和 Swift 的 Shader Node Editor 之后,我又在给目前参与的一个商业项目写一个通用的 Scripting Node Editor 组件,基于 Unity 和 UIWidgets,目前是这样子:
Screenshot-2019-04-06-at-01.07.23
Screenshot-2019-04-06-at-01.07.30
UIWidgets 用起来比较爽的主要原因当然是和 Flutter 相同的 API,以及对许多移动软件开发中常用但游戏开发一般很少考虑的点做了补充,比如 Navigator 可以 push 和 pop UI 层级这种东西在 UGUI 里是没有开箱支持的,而 Flutter 里是内建了很多相关的组件。除此以外 UIWidgets 还能同时运行于 GameView 和 EditorWindow,也为商业项目的内部工具开发和测试带来了很多好处。Unity Shanghai 这边对 UIWidgets 的支持力度也出乎我的意料,因此也打消了我对于项目正统性和长期支持的一些顾虑,直接用在了商业项目里(当然一个原因也是我实在用不下去 Marklight 了)

最近在考虑 Epoch 要不要先做一个 low poly 的版本,但是肯定也是没什么时间去做的,自己要做的项目排期怕是都排到明年了,目前来说个人项目中更要紧的似乎是更新 Portfolio 以及上架 Mac Live Wallpaper Toolkit 到 Unity Asset Store 上去。

有的时候在回想自己这四五年的决定,虽然很多事情干的还不错,但是很多关键的事情上还是办的太胆小了,因此逐渐把自己逼的无路可走,要是再来一次的话也许会更自信和激进一点,也不会在人情上考虑太多。当然人也是会眼界越来越高的,自然越看越觉得之前的自己是窝囊,只希望能逐渐找回之前的状态罢。