Emote小记

最近工作很忙,前一个还没完又来了一个需要持久战斗的,这是导致猫娘壁纸的持续拖更的最重要原因。但是其实还有一个原因,就是M2在二月更新了Emote的SDK,由于之前用旧版SDK时遇到了一些瓶颈,因此好不容易看到有新版出现就决定立即升级了。不光Emote,我也顺便迁移到了最新的Unity和VS2017,整个项目全部换血。然而迁移到新版Emote过后,项目立马崩了,于是花了很长时间去调研……

 

Emote 3.8增加了哪些东西?

根据API文档,3.8版本主要增加了(以下是结合使用经验瞎写的,翻译可能不准确):

  • 编辑器中可像Sprite一样显示EmotePlayer的边界
  • 可以对EmotePlayer使用GameObject的transform,改变GameObject的transform也能生成Emote的物理动作(类似于把猫娘Player装在GameObject盒子里,晃盒子也会引发胸部摇动等)
  • 可以用Clip和Margin限定绘制范围以加快绘制速度(对于我们这种要全部显示的没用)
  • 根据设定的角色身高在Unity中按比例调整大小
  • 可以取得角色眼、口、胸的(纵)坐标(喜出望外结果被文档骗了,其实只能取得纵坐标,而不是之前给猫娘专用的摸头黑科技。感觉M2之所以不开放这个功能,有点防止暴露实现的意思)
  • 可以根据音频(AudioSource音量大小)生成口型(其实这个完全是Unity方面的东西,没什么技术难度;而且事实上也就是控制口开合,没有也不可能有元音的口型区别)
  • 增加了WebGL API和VR模板
  • 具体有多少性能优化就不知道了

总体来看是个不大不小的更新,不过取坐标这个功能还是有点用处的,在猫娘壁纸中,是用它来限制拖动范围,防止你们看断腿。

之所以旧版模型一导进新版API会崩(事实上可以使用官方提供的legacy模式兼容旧版,但这也就丧失了新版的许多特性),无非是模型格式变了,新版多了一些东西。(不得不吐槽,你读个旧版模型自动切换到兼容模式就好了啊,竟然直接把Unity搞崩溃……)经过对比研究,最关键的增加是Character Profile这一项,其他的不添加也不影响。Character Profile中记载了上面用到的模型身高以及眼、口、胸、上下左右边界等一维坐标(是的,只有一维,因此我们即使知道了头xiong的纵坐标,还是无法判断范围从而实现摸头)。文档中请各位模型制作者到编辑器中调整并加入此功能,而没有原工程文件的我们是不可能去编辑器加的。不过我们可以发现,这些参数都不是必须要在编辑器中才能确定的东西,所以我们完全有机会能确定它们。随后就有两种方案了:

  1. 在Unity一侧修改Emote API,使之能从外部接受Character Profile作为参数
  2. 强行修改旧版模型,制作出符合新版规范的模型

难度上不言而喻,1方案实现起来比2简单很多。而且1方案其实还有一个好处,那就是如果你对模型内置的Character Profile的参数不满意,还可以自己再次设置,而2方案就只能按照模型制作者的意思来了。不过2方案遵循规范,因此方便传播和今后的版本迁移(升级)。不过两种方案也可以结合使用。事实上这两种方案我都已实现了,目前的猫娘壁纸是使用的方案2,而且猫娘们的身高是严格按照设定集的记录去加入的,请诸位放心。(不过由于没有全身模型,我对绘画也一窍不通,未显示的腿的相对比例很难确定……)

 

获取模型的眼口胸坐标参数

很简单,自己去量就可以了……

 

AZUSA.Unity.Emote API

也就是上面提到的方案1。预定近期内开源。(届时请回来查看地址及更多说明。)效果如图所示:

 

关于Emote Unity API的两种Type

只有Unity版API有两种。Type1完全交给原生代码计算并渲染到RenderTexture,Unity只是负责显示;Type2中原生代码则只是负责计算,渲染由Unity执行。由于不需要考虑图形后端,因此Type2可跨的平台更广。Type1突出一个运行效率快,不过只有在渲染压力大的时候才能看出差别(在1366x768全屏渲染时感觉二者差别不大,但在2736x1824高分屏全屏渲染下Type2还是达不到满帧);Type2虽然跨更多平台并支持WebGL和VR,却需要暴露给Unity(也就间接地暴露给用户)更多东西,这点上M2可谓是做了很大的让步。不过Type2一方面不支持贴图mipmap,另一方面也确实会把贴图暴露给现在遍地都是的资源提取者,所以贴图方面Type1确实会更好一些。

本来我计划本次直接将猫娘壁纸迁移到Type2以确保各种平台的代码统一,但是最终测试效率还是有差距,于是发布版本又连夜换回了Type1。不过下面的在线演示版本还是得益于Type2。

 

WebGL & VR

猫娘壁纸的WebGL在线演示版本已在本站上线:点此体验

由于我的小霸王每月流量都有限,所以在线演示随时可能暂时下线。

使用WebGL需要注意的几点:

尽可能不使用三方库,纯托管的还可能能用,原生本机代码的一般是别想用了。

建议使用官方页面模板的css,能实现铺满窗口显示的效果(但是不会随着窗口大小改变拉伸,这点如有好的办法请告诉我)。

编译巨慢,毕竟是先经过IL2CPP再上LLVM搞成js。

WebAssembly目前貌似还有问题,测试未成功。(编译太慢了也懒得多试了)

Unity WebGL不支持多线程!(可以用协程,但我一直是用线程的,无奈只能砍了一些东西。)

如果用targetFrameRate锁帧,会报warning建议你取消,这个视具体情况而定。如果你的渲染本来就压力不大,锁帧可以保证效果。不锁帧通常会自动降帧。

尽可能减小体积,既为了用户下载时间考虑,也为了自己部署服务器的流量考虑。

 

VR模板看起来挺有意思,但是除了官方刻意在项目里给的全身模型外,现在绝大部分模型都不是全身的,一低头就看到断腿……另外弄个广告板再加点扭曲就敢叫VR?这种态度比起隔壁已经花了两年研发的2D投影3D自生成的Euclid技术差太远了。(补记:然而隔壁Euclid也是吹大了结果现在很多坑……)目前还没有太大的应用场景,所以没有进一步开发的计划。(不过其实并不一定用在VR上,3D场景都可以用,可以再考虑有没有什么比较好的表现方式。)

 

FreeMote

用过Emote任何一种SDK的朋友都会知道,Emote的版本隔离机制还是很严格的,在编辑器中导出的一个DX版的模型,是不能用在Unity上的,反之亦然;对于两个不同公司的模型也是同理。原因谁都能想到,M2给每个版本、每个公司都使用不同密钥。

所以说Emote是不可能超越隔壁更开放的Live2d的……隔壁已经给中小用户免费用引擎和基本全功能的编辑器了,而故步自封的M2还只会用它最擅长的krkr做Emote编辑器(收费),结果自然是相当的难用,真以为一个galgame引擎能做设计软件啊?

FreeMote 是一系列关于Emote的类库。地址:https://github.com/Project-AZUSA/FreeMote

部分PSB格式参考了number201724大触的krkrpsb。其中FreeMote.Purify(暂未开源)是我原创的解密PSB的解决方案,它的作用自动推算模型的key并可转化为Player兼容版本,用户甚至不需要知道密钥。目前应该已经能支持绝大多数模型。这个“推算”不需要用到PSB文件自身以外的任何内容,也不是使用现在已知的Key去尝试,更不是爆破(但可以通过小范围爆破进行验证以确保准确)。

 

添加评论

Loading