Utage3 开发 Galgame 之使用 dummy 文件来防止资源报错

在 开发 或者 测试发布 游戏时,有时候会因为素材还没有准备就绪,但是需要进行 test play 的情况,这时候打开 dummy 文件功能,可以来避免资源卡住加载问题。

开启方法:

  1. 打开游戏场景,比如 Utage 示例的 Sample.scene。

  2. 在 Hierarchy 窗口展开定位到 Managers > FileManager。

  3. 在 Inspector 窗口中找到 AssetFileManager 组件,鼠标滚轮滑到 Dummy Files 部分。

  4. 勾选 Is Enable,设置好 Texture Sound Text Asset 的 dummy 文件。

  5. Ctrl + S 保存场景,完成。

设置完毕后,点击 Play 按钮运行游戏,遇到缺素材文件的时候就不会弹出资源加载错误弹窗了,而是使用 dummy 文件来替代不存在的资源。

Utage3 在 3.11.1 之前版本存在的内存泄漏问题记录

在使用 CaptureImage 指令和 RuleFadeOut 指令组合进行 Transition 的演出时,使用 Ctrl 来 skip 之后,多跑几遍就会内存上涨到爆炸。

详细汇报可看 谷歌论坛帖子地址

在 Report 给开发者之后,过了几小时就回复放出了补丁,效率还是很不错的。

以前的项目里很少用这个组合,目前开发的游戏使用了很多次这个指令在测试运行的时候发现了这个问题。(用 Utage3 的开发者还是少啊,都这么多年了,没人汇报 >_<,不过现在解决 了,可喜可贺,可喜可贺。)

用 Unity 来制作 GALGAME 的坑真不少,Unity 版本升级得踩坑,Asset 导入又慢管理又麻烦,Utage3 也用了这么久,整体来说还是很棒得,但是也有很多令人不爽的地方,但,GAL 开发没有银弹,游戏制作还得继续,踩着开发工具的版本更替,在制作的道路上越走越远。

Python 在 Galgame 开发中的应用

看了下 bitbucket repo 记录,第一次使用 python 来写脚本处理文件是在 2017 年左右。当时是为了将翻译后的英文 txt 经过一些处理,导出为 csv 格式,以便校对后导出多语言演出脚本,也不是什么复杂的处理,就用 python 写了个脚本,应该是第一次实际使用 python 的样子。

之后,由于在开发游戏的过程中,会遇到一些比较繁琐,具有重复性,又有一定规律的需求的问题需要被解决,我也化身成为捕蟒人(python hunter)写了不少脚本。这里记录分享一些比较有意思的需求和解决思路仅供参考。

制作体验版时剔除未使用的素材资源

在制作游戏体验版时,往往需要把正在开发的项目中未使用过的资源给删除掉,再打包制作出来一个试玩版发布给玩家体验游玩。这个时候有 2 种思路

  1. 将使用过的资源导出一份作为体验版项目的资源。
  2. 删除未使用的资源。

解析演出脚本,将演出中使用过的图片,音乐素材给提取出来相对来说更不容易出错。

这边写的脚本也是这样子去做的。

  • 核心代码在于使用 shutil 标准库里的 copy 方法来复制文件。
  • csv 操作可以使用标准库里的 csv module

操作 Photoshop 导出立绘表情差分图片

可以使用 win32com 接口来操作 PS 来隐藏,显示图层后导出图片,示例可参考 Photoshop scripting with Python 这篇文章

创建 CG 鉴赏配置 cglist.csv

krkr2 的 kagex cg 鉴赏配置是一个 csv 文件,里面需要填写每个 cg 文件名。

由于 cg 鉴赏里配置的文件分辨率都是和游戏分辨率大小一致的,并且文件名大多数都是类似 EV01_1 这种,那么按思路来说可以将 data 文件夹里的所有 jpg png 文件都遍历一遍,将需要写入到 cglist 的文件名分组后,就可以导出为 cglist.csv 了。当然最后还是需要人工调整差分显示顺序,删除不需要的)

  • 判断图片分辨率大小,需要使用 Pillow 库 里的 Image

转换 KAG 脚本到 UTAGE3 脚本

三色绘恋在做手机版移植的时候,最后选择了使用 UTAGE3 这个 Unity Visual Novel Tool 作为系统框架,于是就需要先将 krkr 的 kag 演出脚本转换成 utage3 可以运行的演出脚本。

处理思路很简单:

  1. 解析 kag 脚本的指令
  2. 转换到 utage 对应的指令(这个过程可简单,可复杂)
  3. 生成 utage 用的 excel 演出脚本文件

但写起来挺难受的。

因为 utage3 的指令和 kag 指令的设计差别实在是太大了,再加上 kagex 的 world 功能提供的简单语法,又需要转换为新的指令。

移植这工作,做起来是一堆问题需要处理。

  • python 操作 excel 的库,可以使用 openpyxl
  • 遇到 excel 文件特别大,在 load_workbook 时设置 read_only=True 来处理。参考 Read-only mode
  • 新建 excel 时,写入数据量大时可以在新建 Workbook 时,设置 write_only=True 。参考 Write-only mode

转换剧本到 cv 台本文件

解析剧本人名和台词后

  • 将非当前角色的台词设置为淡灰色,字号变小。
  • 将当前角色的台词设置为黑色,加粗,加大。
  • 人名 和 台词 使用边框进行区分。

样式设置参考 openpyxlstyles

升级 Ubuntu 14.04 LTS 到 20.04 LTS 记录

上一次折腾 vagrant vituralbox 和 ubuntu 还是 2016 年搭建了个 svn server,之后就没怎么动过,Mac mini late 2012 也成了 svn 服务器专用机,这差不多 5 年间,用坏过一次 SanDisk 的 256G 的 ssd,后来换成了镁光的 MX500 500GB 一直用到现在。

由于 svn 版本是 1.8.X 想升级下版本发现还是直接升级系统算了,毕竟 14.04 LTS 2022 年也到 End of Support 时间了,不过谨慎点还是先升级到 16.04 LTS 好了。

升级到 16.04 LTS

移除第三方 source.list

    • How to Remove PPAs from Ubuntu

    • 这边是因为曾经为了尝试 gitlab 所以添加过 gitlab 的 source,在升级系统的时候报有兼容性问题,于是需要先移除。

    • 另外在尝试自建 gitlab 后,发现 gitlab 还是太占资源了,就没继续用了。对于美术和演出人员来说还是 svn 操作更简单方便。

更新 ubuntu distribution

do-release-upgrade
  • 出现的选项都保持默认,OK,y

  • 升级结束后重启系统,进入之后 netstat -lntp 查看启动的端口发现 nginx 启动了,不过这边需要的 webserver 是 apache2 所以需要关闭 nginx 服务和自动启动

sudo service nginx stop
sudo service apache2 start

Nginx – disable autostart

sudo update-rc.d -f nginx disable

sudo systemctl disable nginx

sudo systemctl stop nginx
  • 当然也可以选择 uninstall nginx What is the best way to uninstall nginx
  • 也许偶尔需要配置学习下 nginx,我就没卸载了。
  • 访问 svn web server 后查看版本已升级为 1.9.3

备份 vagrant box

升级到 18.04 LTS

sudo dpkg -l|grep intel
sudo apt-get purge intel-microcode
sudo update-grub
sudo reboot```
    • 升级完毕后,查看 svn version 到了 1.9.7

升级到 20.04 LTS

    • 直接执行一个 do-release-upgrade

    • 启动时发现又是卡在 smp 那里,看来新的内核都有加 intel 漏洞的补丁?,但是我这边就一个内网服务而已,也不需要管安全,直接进行一个 apt purge intel-microcodeupdate-grub 然后重启

    • 本身就是一个老旧的 cpu,再打降性能补丁,或者限制单核运行,怎么想都不划算,用到报废换新电脑多好。

    • 升级完毕后,查看 svn version 到了 1.13.0

结尾

    • 升级系统看着一行行日志文字不停的滚动过去,不出问题整个过程还是挺爽的,颇有动画里 hacker 的感觉,然而实际就是在升级系统罢了。

    • 启动停在 smp 这个问题真是蛋疼,不然整个过程应该挺顺利的。

    • 整个系统就一个内网 svn 服务器,只要能保证 svn 正常工作就行。

git or svn?

    • 尝试过好几次用 git + git lfs 来测试当 galgame 项目的 source control 系统,最终都以图片,音乐,binary 文件 add commit push 耗时比 svn 长放弃。

    • git repo size limit 比较严格,GitLab 似乎时单个 repo 最大 10GB,而用 svn 就不用考虑 size 这个问题。

    • 我个人是用 git 来同步代码比重大的 project 的。

    • 但是像图片,音乐为主的 galgame 项目,还是用 svn 更方便合适些。

    • 不过 svn 需要手动创建 repo,手动添加用户还是挺麻烦的……

renpy web updater

最近因为一些原因,开始研究 renpy 这个 Visual Novel 框架了,把折腾的东西顺便写个教程分享下。

这个教程是有关 renpy 使用 web updater 功能来更新游戏内容的。

更新设置

Building an Update
Updates are built automatically when distributions are built. To build an update, set build.include_update to True in options.rpy. This will unlock the “Build Updates” option in the “Build Distributions” section of the launcher. Check this option, and Ren’Py will create the update files.

开启生成更新按钮

  • 打开 options.rpy
  • 在 init python 下面的 build 部分新增一个下面一行代码
build.include_update = True
  • 切换到 renpy 开发窗口,点击生成分发版,此时可以看到 生成更新 选项已经出现。

给主菜单添加 check for updates 按钮

  1. 打开 screens.rpy 定位到 main_menu 方法
  2. 在 main_menu_version 组件下新增 textbutton
## Updates via this button are for PC only
textbutton "check for updates":
    action updater.Update("http://127.0.0.1/TestChsGame/updates.json")

制作与测试游戏更新包

  1. 首先生成一个 1.0 版本的游戏包。(不勾选 生成更新)
  2. 修改下剧本文本内容和游戏版本号 1.0.1,勾选生成更新选项,生成下 1.0.1 版本的更新包内容


    1.0 和 1.0.1 的 build 包
  3. 上传 1.0.1 文件夹里的所有文件到本机 Web 服务器 TestChsGame 目录,上传完毕后,在浏览器里输入 http://127.0.0.1/TestChsGame/updates.json 可看到 json 文件内容
  4. 打开 1.0 build 运行游戏,点击 check for updates 按钮,可以看到有 1.0.1 版本更新提示

点击取消,Start 游戏,查看下第一行对白是显示 v1.0

返回到 Title,再次点击 check for updates 后,点击继续运行 updater 更新游戏

更新完毕后,会自动重启游戏

在 1.0.1 游戏启动后,点击开始游戏可以看到,剧本第一行对白已经显示为 1.0.1 了

至此,renpy web updater 测试游戏版本更新功能完毕。

测试用 Web 服务器

  1. 【推荐】系统有安装 python3 的话可以打开 cmd.exe 进入一个空目录后,使用 python -m http.server 来启动一个 web server

    默认端口是 8000,所以地址会变成 http://127.0.0.1:8000

  2. Windows 下可以安装个 wampserver
  3. 或使用搜索引擎跟着教程搭建一个 web server

Reference:

  1. 官方文档地址:Web Updater
  2. [Help] About the Web Updater

Unity 导出 Mac 游戏上传到 App Store Connect

Unity Player Settings

Resolution
Default Screen Width: 1600
Default Screen Height: 900

Mac App Store Validation: True

Build 窗口里设置:
勾选 Create Xcode Project,导出一个 Xcode 项目包。

然后使用 Xcode 打开 build 之后的项目。

Xcode

在 Project 栏选中项目,修改 Info 里的
Deployment Target 为 Unity 2019.4.18f1 支持的最低系统版本 10.12

切换到 Build Settings

Architectures:
Build Active Architecture Only 修改 NO 为 YES. (Unity 2019.4.18 不支持 ARM)

打开 Targets 的 Sign & Capabilities

Sign 方式 Automatic manage signing

新增 App Sandbox,勾选下面的权限

  • Outgoing Connection

使用 Xcode Archive 功能 Build 发行包。

在 Distribute App 的时候,需要先在 App Store Connect 里建好 app 需要的 Identifiers 和 导出 App Store App 需要的 Profiles。

使用 Steamworks 添加 DLC/Soundtrack 应用时需要注意的地方

Steam Soundtrack

Steam 推出了原声带功能来分音乐专辑的羹,可以在不购买游戏本体的情况下,只购买 Soundtrack 专辑,来满足只听音乐不玩游戏的那群人。(真的会有这种人吗?)

废话不多说,实际操作过程中还是出现了几个需要特别注意的地方:

  1. 在添加原声带之后需要将 商店程序包,Developer Comp,Beta Testing 这 3个地方都需要将新增的 Depot 给添加进去。不然会出现使用 steamcmd 上传了 depot 但是打开 Steam 应用自动下载后是空文件夹。
  2. 可以为无损音乐新建一个 Depot 作为可选的高品质音乐下载包。
  3. mp3 和 flac 的 IDv3 标签信息尽量填全。
    1. Track No. 需要加 0 前缀,01 02 03 这样。
    2. Total Track 和 Disk No. Total Disk 也填下。
    3. wav 格式的无损文件一言难尽,可能会出现无法读取/写入 ID3 信息。(Steam 可以直接右键定位到 flac 文件。)

 

Steam DLC

在添加 DLC 之后,需要在管理 Depot 里把 DLC 于主 depot 关联起来。不然会出现上传时权限错误。

 

使用 吉里吉里2 和 Unity 开发 Galgame 的体验

在分别使用 吉里吉里2 / krkr2 和 Unity 开发过完整的作品之后,现在可以分享对比下我的开发体验结果了。

吉里吉里2 / krkr2 + KAGEX

krkr2 在开发纯文字冒险游戏,体验很好。

  • 硬件配置要求低。
    • 不管是开发硬件要求,还是用户运行硬件要求。
  • 资源性能高效,简单,方便。
    • Image,Sound,Video 放到对应文件夹后,立马可以开始进行脚本修改。
  • 演出脚本调试体验很棒。
    • 修改当前行之后使用重载,可以在不重启游戏的情况下即时预览修改后的当前行演出效果。
  • 打包发布文件体积小,打包步骤简单又快。

Unity + Utage3

在制作 Galgame 之外,有额外的游戏系统和需求的情况下,体验很好。

  • 使用 Unity Editor 开发 UI 简单又方便。
  • Utage 使用 Excel 作为演出脚本,多语言支持很方便。
  • 支持跨平台。
  • Unity 引擎很强大,第三方插件丰富。
    • DOTween 可以很方便的支持各种 Tween 动画。
    • TextMesh Pro 文字显示效果很棒。(切换高分辨率屏幕文字依然清晰锐利。)
    • Colorful FX 的镜头滤镜效果很好用。
    • SoftMask 遮罩效果好用。
    • 支持 Live2D 插件。

虽然 Unity 很强大,但是整体开发体验很差,为什么这样说呢?

  • 资源管理体验很糟糕,耗时。
    • 导入大量 Assets(Texture,Sound)时需要等待(Hold on)很长时间才能开始工作。
    • 你会说这不是等待一次就好了吗?但是,在你切换平台之后,又会进行 Hold on。
    • 那你不会用 Cache Server 吗?用了,效果不好,没节省多少时间,甚至在测试的某些情况下切换平台耗时更多。
    • 能理解 Unity 要对 Asset 进行转换来缓存成 GPU 读取的格式,但是 Hold on 的体验实在是太糟糕了。
  • Asset Bundle Build 很耗时。
    • 有很多人都在抱怨,但是目前并没有很好的解决方案。
  • 内存占用很难优化。
    • 这个一方面是程序员自身的技术能力问题,一方面引擎本身也要背个锅。
  • 开发硬件要求,运行硬件要求高。
    • 导入耗时怎么办?CPU SSD 配置拉满,设备成本飞起来就对了。

以上,就是在使用 吉里吉里2 开发 Tricolour Lovestory 和 Unity 开发 Sunnyrain Lovestory 之后的体验了。

Utage 分章节加载 Galgame 演出脚本时需要注意的地方

Utage 支持对章节进行拆分演出脚本,这样可以让多位写演出的人同时进行工作,来提高开发效率。游戏后面需要通过更新来修复错别字,或者演出脚本错误的话,也可以进行小文件 patch 更新。(经过压缩的脚本大小都在几百kb 左右。)

当然,有分章节需求的,大多数是有需求从服务器(Server)加载章节和资源,来达到缩小游戏安装大小,然后在启动后下载演出资源。Utage 官方也有这个教程,传送门:任意のチャプターのみロードし、最小限のリソースだけダウンロード

不过他的教程里只写了从 Server 加载时需要进行的设置,没有提使用 StreamingAssets 加载时需要注意的地方。

使用 StreamingAssets 加载方式时:

  1. 记得在 AdvEngineStarter 里勾选 Separate Chapter,并将 Chapter Names 填好。
  2. 使用 Resource Converter 的时候也记得勾选 Separate Chapter。

使用 Server 加载方式时:

基本按照官方教程里设置就可以,示例脚本人家也有提供,有自定义需求的需要自己更改实现。

说自定义需求,大概也就是将 Server 和 Chapter asset 的 url 弄到 json 配置里,在启动游戏的时候从服务器下载最新配置,然后将对应 Runtime 平台的配置下载后加载。

Unity 开发 Galgame 时遇到的问题2 内存占用

最近在游戏开发最后阶段,需要在真机上进行测试,内存占用这个问题在 PC 上基本不存在(目前主流玩游戏的 PC 内存容量都在 8GB 以上。),但是在移动设备上,这个情况就不一样了,iPhone 8 发布于 2017年,身边的人有不少还在使用,这个设备是得考虑到兼容列表里的,然而 Apple 给 iPhone 8 的 A11 Bionic 配备了 2GB RAM,不愧是你(Apple)。

吐槽归吐槽,2GB RAM 第三方 app 能使用的安全范围在 1.2GB 左右,峰值超过这个数字,大概率会闪退。

在测试的时候,没经过对 Unity Asset 进行手动压缩设置的情况下,iOS 版本最高内存能跑到 2.X GB,这一看就不行嘛,怎么玩。

该 Google 老师的出场了,在参考下面几个有用链接里的内容之后,开始尝试对素材进行设置

iPhone 6s 之后的机型都支持 astc 图片压缩格式,iOS 就使用这种压缩格式了。

  • 背景使用 astc 8×8
  • 带人物立绘的使用 astc 6×6(需要 Alpha 的选择对应的。)
  • Live2D 贴图,Dicing Sprite 调整 max size 为 2048,压缩格式为 astc 6×6。
  • BGM 设置加载方式为 Compressed in memory。(使用 Decompress on Load 时,占用内存 20MB 以上,调整之后占用 8MB 左右。)

调整完 Import Settings 之后,重新 build AssetBundle 之后,查看 StreamingAssets 占用磁盘空间大小也减少了很多,内存占用也减少了,效果还是非常显著的。

看 Unity 的文档里的说明,能理解为什么这样做,但是现在这样做之后,产生的问题也很烦人,Library 文件夹巨大,切换平台速度巨慢,让人又爱又恨的 Unity。