文章

安卓模拟器、HAXM、Hyper-V

刚才打算用 Android Studio 配套的模拟器测试一个 apk,谁知启动虚拟设备的时候遇到 “Unable to open HAXM device: ERROR_FILE_NOT_FOUND” 这样的报错。

有人在 Windows 10 上通过禁用 Hyper-V 并重装 HAXM 解决了该问题。此法在我的环境中有效。简单查了一下,Hyper-V 和 HAXM 都是虚拟化技术。前者是微软提供的,Windows 10 自带。后者是英特尔提供的,专门用于加速安卓模拟器。看上去这两者不兼容。如果不禁用 Hyper-V,直接重装 HAXM 的话,在安装过程中就会报错。

然而我将 Hyper-V 禁用之后,Docker 又用不了了。

各种软件之间的兼容还真是个问题。

东京电玩展2018(多图)

虽说我是个老玩家,进入游戏行业也有几年了,但从未参加过游戏展会。在国内那么多年也没参加过 China Joy 。不过来到东京将近一年之后,托公司的福,竟第一次有机会参加游戏展——而且还是全球游戏行业知名游戏展东京电玩展(Tokyo Game Show)。

公司为我买的门票

这次展会最让我开心的是很多知名老牌日系厂商都有出展。像卡普空、万代南梦宫和史克威尔艾尼克斯这些一线日本大厂就自不必说,连 Falcom 和工画堂这两个我很喜欢的虽然已不活跃但却是 “百年老店” 的小厂商也有参展。

卡普空的展位

因此我也得以试玩到很多小时候就玩过或是虽没玩过但时常耳闻的经典作品系列,这让我非常期待。目前为止我最喜欢的日本游戏是 Falcom 的《双星物语》,可是 Falcom 的更为经典的轨迹系列却一直没玩过,不得不说是一个遗憾。于是当我看见 Falcom 的展台时恨不得马上就奔过去玩一把。

Falcom 的展台

继续阅读东京电玩展2018(多图)

权限问题导致 git 服务器无法使用

这两天在公司的 Synology NAS 服务器上搭建了一个 git 服务器。其实 Synology NAS 服务器是自带 Git Server 包的,可以一键安装,非常方便。但是我没有将权限设置好,这就导致 git 服务器一直无法使用。

先是按照 NAS 文档的说明,我需要 ssh 到服务器上创建一个 git 仓库文件夹。然而我 ssh 登录之后却被提示 Could not chdir to home directory: Permission denied。尝试 cd 到任何一个文件夹都被提示没有权限。可是 ls 打印出的文件夹权限明明都是777。最后发现原来是在 NAS 的 管理系统中,我将用户组对文件夹的访问权限设成了 No Access。原来管理系统设置的权限优先级比操作系统层面的文件夹权限还高,也不知是怎么做到的。

git 仓库创建好后,能够正常 pull。但是 push 的时候一直在 writing objects 这一步卡住。依然是因为权限问题。这回就是操作系统层面的文件夹权限没设置好——我的 git 用户账号对 git 仓库文件夹没有写权限。后来我在用户主目录下重新创建了一遍仓库才解决了该问题。

顺便吐槽一下 Synology NAS 的 Git Server 文档。原文档让我在 /volumeX 目录下用 git init  创建 git 仓库,并且在客户端用 ssh://用户名@服务器地址/git仓库文件夹名  形式的 URL 访问 git 服务器。然而实际上要用  git init --bare --shared 命令来创建仓库, 用  ssh://用户名@服务器地址/git仓库绝对路径 形式的 URL —— URL 末尾应该是 git 仓库的绝对路径,而不是 git 仓库文件夹名。

List<A>转型为List<B>

假设现在有两个类—— A 和 B ,其中 A 是 B 的子类。将 A(子类)的引用转换为 B(父类)的引用是很普通的事,在任何编程语言中都不存在问题。但是将 List<A>(子类的容器)转换成 List<B>(父类的容器)就不是那么简单的事情了,因为List<B>并不是 List<A> 的父类。

不过从 .NET 4.0起,我们已经可以在 C# 中写

这样的代码了。这是因为 .NET 4.0 支持 C# 的变体范型(variance for generic type parameters)特性。关于其具体信息可以在网上搜索 “C# 协变 逆变” 。协变的英文是 Covariance,逆变的英文是 Contravariance。

如果想在 Unity 中使用这个特性的话,就要将 Unity 用的 .NET 运行时改为4.0以上。方法是将 Project Setting -> Player -> Scripting Runtime Version 改成 Experimental (.NET 4.6 Equivalent)。

Unity 实现文字过长显示省略号

需求:假设有一行文字由于界面空间不足只能显示一部分,那么剩余部分需要被截断,并且显示出来的文字末尾需要添加省略号“…”。比如“一二三四五六七八九十”,最终显示出来的样子是“一二三四…”。

这个需求在 CSS 中倒是挺好实现的。(题外话:这只限于显示出来的文字只有一行的情况。多行的情况下还是没那么容易,除非采用 WebKit 的 CSS 扩展属性 -webkit-line-clamp,不考虑兼容 W3C 标准。)但是在 Unity 中则需要摸索一下。目前已知的有两种方案。

方案一:使用 TextMesh Pro

当前的 Unity 2018 已经集成了 TextMesh Pro 插件(未确认之前的 Unity 版本是否集成)。这个插件非常强大,自然也包含了文字溢出时显示省略号的功能。使用时只要将 TextMesh Pro UGUI 组件中的 Overflow 选项设为 Ellipsis 即可。这个插件甚至能够很自然地实现多行文本的省略号截断。

继续阅读Unity 实现文字过长显示省略号

EMwI更新:版本1.1 支持批量添加

使 WordPress 媒体库支持外链图片的 External Media without Import 插件自发布以来,就收到了好些用户的反馈。其中相当一部分用户希望插件可以支持批量添加的功能,也就是一次性可以添加多个 URL 。非常惭愧的是,虽然我大约一年前就收到了这样的建议,并且自己也觉得应该添加这个功能,但却一直没能抽出时间做这件事。两个月前本想利用自己睡前或是上学前的零碎时间一点点把代码给写了,但途中又因为各种事情中断了。

直到这几天终于把批量添加的功能实现并发布了出来。当前最新版本更新到1.1。该版本将原本只能输入一行的文本框( <input> )改成了可输入多行( <textarea> )。用户可在文本框中输入多条 URL,每条 URL 占一行。点击添加按钮就会一次性将文本框中的多条 URL 添加进媒体库中。

其实现在因为我个人网站的主机搬到了 Vultr,配置比以前好了不少,所以我自己已经(至少是暂时)用不上 External Media without Import 这个插件了。但是插件自发布以来陆续收到好些用户的肯定、期待和反馈,甚至连给我差评的都会跟我说声 sorry,并肯定我的想法。再加上插件在 WordPress 官方上的主页也显示插件有1000多个活跃安装。这些都是对我莫大的鼓励,也让我感到做好这个插件不仅仅是为了我自己。大家的反馈也让我有点找到了自身的价值。因此现在基本是怀着不愿辜负这批用户的心情继续改进着这款插件。

昨晚发布版本1.1之后,我就开始一条条地回复那些曾经提出希望支持批量添加功能的用户留言。然而有点让人难过的是,WordPress 官网上有的留言太旧,都被系统自动关闭,无法回复了。这让我感到更加惭愧。

不过只要还有用户在期待,我还是会继续维护改进这个插件的。这款插件还有很多可以改进的地方,除了批量添加的功能外,用户们也提出了不少其它问题。版本1.1发布之后可能也会有新的 bug。只要我能抽出可支配的业余时间,都会优先处理 External Media without Import 插件的问题的。希望我做的东西可以继续为大家带来价值。

小游戏01:一名普通上班族的故事

这是今年三月份的时候,我们公司的几个人利用各自零散的业余时间,在累计十几个小时内构思、设计并制作的一个小游戏,算是公司内部的一次 Game Jam 练习。因为是一款非常不正式的习作,所以肯定有很多不完善之处,还请多多海涵。原本是用 Unity 做的。最近我用 Cocos Creator 将它移植到了 Web 上。

这是一个对工作和老板满是嘲讽的小游戏(老板看后表示尴尬,哈哈哈)。玩家能做的所有操作就只是点击按钮。游戏画面左侧垂直的红色进度条代表主角的理智值(俗称 SAN 值)。根据理智值和玩家做的选择,游戏可能会导向不同的环节和结局。不到5分钟就能玩通所有结局。

请点击以下链接开始游戏。

桌面版          移动版

注意游戏有声音。不过似乎在部分 iOS 的手机上要点击游戏画面之后才会出声。在 Cocos 论坛上也有人遇到类似的问题,可能很难解决。

我们公司平常在商业项目之余,各人会根据自己的可支配时间,不定期地做一些小游戏。可能是合作做,也可能是一个人做。每个人都可以是策划、美术或程序。每款游戏的制作成本都尽量控制在一次 Game Jam 的范围内。大家在这个过程中可以尝试自己在游戏设计上的想法,以及学习未曾用过的技术。这也算是我们在商业项目之外对游戏设计与制作的探索,也是对自己的一种训练。

比如在《一名普通上班族的故事》这款小游戏中,我除了负责程序部分以外还贡献了一张素材——其中一个结局是我画的 😆 。在这个过程中,我也学习了一下 UGUI 的 Slider,也重新学习了锚点的使用。之前写的两篇博文《用UGUI Slider做血条时遇到的一个小问题》以及《Aspect Ratio Fitter 和 Image》就是在这个过程中学到的知识。当然,最近借着移植这个游戏的机会,也初次学着使用了 Cocos Creator。Cocos Creator 的确有自己的特色,不过和 Unity 也有很多相似的地方和共通的概念。感觉现在游戏引擎之间都越来越像了,UE4 的也是。

《一名普通上班族的故事》是我们公司内部 Game Jam 训练做的第一款小游戏,其实也是公司仅有的几个人第一次合作从头做一款游戏(尽管很小也很不正式)。从三月份至今其实已经做了有几款游戏了,但是目前只有这款移植到了 Web 上。我们希望能将这种训练长期坚持下去,不断积累自己在游戏设计与制作方面的经验和能力,有朝一日做出自己心目中理想的游戏。

改名啦改名啦~

有的朋友可能知道我有另一个网名——纸箱猪。我现在越来越喜欢这个名字,所以决定将这个名字用作自己常用的中文网名。“子子翔的技艺空间” 也会改名为 “纸箱猪的技艺空间”(不过我的独立站点的名字倒是早就改了)。英文网名嘛,还没有。不过我觉得 Box Pig 也不错。

顺便再给自己的各种个人空间打遍广告:

我的个人独立站点:http://zxtechart.com/

我的 CSDN 技术博客:https://blog.csdn.net/zzxiang1985

我的 github:https://github.com/zzxiang

公司的主策云海发挥了他许久没捡起的像素画功,友情为我画了一张纸箱猪御用 Logo:

其实我原来用的头像也是原创的。那是我在学素描的时候,用 Blender 观察研究阴影时渲染出来的一张图:

最近有两个月没打理个人空间,都要长出杂草了。其实近来收获和感想都不少,憋了挺多东西想写的。无奈实在是忙得不可开交。在学校上学的同时还做着三份工作,参与教会服侍,最后挤时间写自己的小项目。于是时间和精力管理成了我现在的最大课题。

说起来前段时间我个人做的 WordPress 插件收到了第一个差评,也陆续堆积了很多用户反馈,但是一直没来得及处理,心里也有点愧疚。果然开源项目一做起来,支撑着自己做下去的不但有兴趣,还有责任。

修炼之旅还在继续,我会加油。虽然来我空间做客的朋友少之又少,但是你们的一点点关注也让我的修炼之旅不至于那么孤单。谢谢你们 ^_^

将 Excel 表格导入 Unity 项目

在游戏开发过程中,策划往往会在 Excel 中配置游戏数据,比如物品、技能和 NPC 的属性等。因此如何将 Excel 里的数据导入到游戏中是游戏开发的重要课题。

朴实的方法:另存为 csv

比较朴实的方法是将 Excel 文件另存为 csv 文件,然后程序员写代码解析 csv 文件。可以将 csv 转换成游戏程序可以识别的格式,比如 Unity 的 ScriptableObject 或是一个硬编码的 C# 数组,即一份 cs 文件。甚至也可以在游戏运行时才读取 csv 文件。

这种方法的优点是要解析的文件格式(即 csv)很简单,不用引入第三方库,程序逻辑也就比较简单。缺点是每次编辑完 Excel 文件还要另存为 csv ,这对日常工作来说颇为繁琐,而且每次“另存为”也只能导出一份 Excel 文件,无法对多份文件执行批量导出。

继续阅读将 Excel 表格导入 Unity 项目

用 Animation 实现匀速旋转

年初参加 GGJ 的时候,我曾想偷懒用 Animation 实现物体的匀速旋转。思路很简单,只需要0度和360(或-360)度两个关键帧,然后将动画设为循环播放。当时以为这样事情就成了。谁知做出来的效果是下面这样,物体转完一圈后会停一下:

我知道问题就在动画曲线上:

只要把曲线弄成一条直线就行。

但是当时折腾了一会儿也没调出一条漂亮的直线,因此还是改用代码来实现匀速旋转。今天发现其实根本不用手调,只要右键单击,把起始关键帧的 Right Tangent 和结尾关键帧的 Left Tangent 改为 Linear (线性)就可以了:

完美:

其实以前也知道 Free、Linear 和 Constant 这几个选项,但从来没用上也没真正理解它们的用处。如今才知道是怎么回事,至少理解 Linear 了。

Unity 版本:2017.3.1f1