改名啦改名啦~

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

Aspect Ratio Fitter 和 Image

UGUI 里面 Aspect Ratio Fitter 的作用是保持一个 UI 控件的宽高比。然而 Image 自身就有一个 Preserve Aspect 属性用于保持自己的宽高比。因此起初我就想 Image 是不是就用不上 Aspect Ratio Fitter 了,或者说 Image 自身的 Perserve Aspect 的属性是不是多余的。后来发现并不完全是。

前段时间遇到一种情况必须要使用 Aspect Ratio Fitter 。

在下图中,Bubble、Text 和 Text (1) 是文字冒泡的 UI 控件。为了让文字冒泡的位置始终对准背景图片中的人物头顶,我给文字冒泡的各个控件设置了锚点。

Bubble 即冒泡框相对其父节点 Image(背景图片)设置了锚点,目的是不管 Image 大小如何变化,都要让冒泡框对准背景图片里面人物的头顶。

如果只是依靠 Image 的 Preserve Aspect 属性,那么文字冒泡是无法在 Image 大小改变的时候时刻对准背景图片里的人头的:

这是因为 Preserve Aspect 虽然能保持图片的宽高比,但却并不能保持 Image 的 Rect Transform 的宽高比。然而锚点却是基于父控件的 Rect Transform 的边界来定位的。

在这种情况下就必须给 Image 挂载 Aspect Ratio Fitter,此时 Preserve Aspect 勾不勾都是无所谓的。

Image 挂载了 Aspect Ratio Fitter 后就可以保持 Rect Transform 的宽高比,从而让文字冒泡时刻对准图片里的人头。

Preserve Aspect 的意义主要在于游戏开发者不用关心图片宽高比的具体数值,以及宽高比保持的方式。毕竟使用 Aspect Ratio Fitter 的话,开发者不但要填入具体的宽高比数值,而且要决定控件要如何保持宽高比——是高度固定,还是宽度固定,还是尽可能被包含在父控件区域内,等等。

Unity版本:2017.3.1f1

被NTFS的bug困扰了一个多星期

这篇文章其实写于2012年5月2日。原文是发表在我的CSDN博客上:《被NTFS的bug困扰了一个多星期》。昨天收到一条评论说文章写得太有趣了。于是把文章又读了一遍,感觉的确是一段宝贵有趣的回忆。因此不禁想把它搬到自己的个人站点上做个备份。珍贵的东西放在别人家里总是怕不知哪天就被丢掉了。其实我的CSDN博客上还有几篇我自认为更有趣的故障排除类的日志,有空时也会一篇篇搬过来。

原文发表的时候还是Windows 7的年代。当时微软也已经就文中提到的bug发布了补丁。如今已经是Windows 10的年代,虽然我没亲自验证,但这个bug在Windows 10上估计已经不存在了吧。

// ========= 一点也不华丽的分割线,以下是原文 =========

继续阅读被NTFS的bug困扰了一个多星期

《家园》与《浴火银河3》的宇宙

我对太空类游戏一直很有好感。当舰船在太空中徜徉时,宇宙的浩瀚与孤独令我着迷。迄今为止我玩过的游戏当中,最喜欢的作品——《家园》就是以太空为背景;最近喜欢上的一款游戏——《浴火银河 3》(英文名《Galaxy on Fire 3》),也是太空题材。

虽然两者同为太空背景,世界观庞大,但从游戏类型上讲两者其实是很不一样的游戏——前者是传统的即时战略PC游戏,操作繁杂,地图边界极大,节奏缓慢;后者是飞行射击类手游,操作简单,地图边界很小,节奏明快。

这两天突然感觉,这种区别在两者对宇宙的塑造上也有很明显的体现。

家园

《家园》的宇宙给我的感觉是干净、浩瀚而空旷。舰队在航行途中难得遇到其它人造航天器,就连陨石也并不是经常能遇到。至于星球就更是只在故事开头和结尾存在(分别是故事中玩家种族的居住星球和起源星球)。虽然有时远处(天空盒)有一些绚丽灿烂的星云,但是我也只会觉得它们很美,而不会期待星云里有很多东西。

《家园》的宇宙干净、浩瀚而空旷,远处的星云虽绚丽,但仍不失平静。

继续阅读《家园》与《浴火银河3》的宇宙

将《拳皇》做成桌游

乍一听这是一件非常不可思议的事情。《拳皇》是一款考验操作与反应的格斗游戏,而桌游普遍玩的是策略、概率与谈判。这两者如何能结合到一起呢?难道要真人快打?

格斗游戏《拳皇》

前段时间身边的两位策划——云海和热心就用一个下午做了这样的练习。由于事务繁忙,我并没有参与其中,只是一边做事一边旁听。现在是凭印象写下这篇文章,因此无法将每个细节都写得很清楚。

动作游戏也有策略元素

根据云海的分析,虽然《拳皇》考验操作与反应,但其游戏性含有很强的策略成分。换个说法,要玩好这种格斗游戏,除了练好操作与反应,意识也很重要。策略性也让不同玩家形成了不同的打法风格。比如有的玩家喜欢以攻为守;有的玩家喜欢防御为主,抓住对手破绽反击;尤其有的玩家打法很“龟”很猥琐,从不正面攻击,经常后跳发波。

其实很多经典的动作游戏都蕴含着至少一定程度的策略元素。没有任何策略元素的动作游戏即便再有趣,其乐趣也很短暂,无法让玩家感觉到有持续深挖的价值,也很难带来回味无穷的感觉。一个典型的例子是打地鼠。

因此如果要把《拳皇》这种格斗游戏改成桌游,我们可以做的是把策略部分的核心机制提炼出来,用桌游来实现。

继续阅读将《拳皇》做成桌游

关于游戏的“正规元素”

在阅读Tracy Fullerton的《游戏设计梦工厂》时,我对书中提到的“正规元素”这个概念始终感到困惑。为什么这些元素是正规的?难道还有不正规的元素吗?

英文原文中这个概念应该就叫做“Formal Element”,见《The formal systems of games and game design atoms》这篇文章,里面Formal Game Elements一节与《游戏设计梦工厂》第3章所写的“正规元素”是相同的。然而知道了英文原文也无助于理解为什么这些元素是formal的,是不是还有informal的元素。

一次偶然的机会,我得知身边的策划云海竟然在《游戏设计梦工厂》成书之前曾参与过早期校阅工作,还提过一些用词建议,在成书之后也向译者陈潮提过一些翻译问题。不禁喜出望外,立马抓住他问起了“正规元素”的问题。他说,对于这个词,翻译组也很纠结,他自己也和翻译组纠结过。可能翻译为“基础元素”或“核心元素”会更好。这只是作者为了后面的讨论,先规范地定义一下这些专业词。不过“正规”这个说法确实不好理解,给人一种这些元素很正经,其它元素不正经的感觉 😆 。

这么说来,其实所谓“正规元素”也就是一个游戏所要具备的重要元素,即玩家、目标、操作、规则、资源、冲突、边界和结果。借用一篇知乎专栏的话,这八个维度是“组成游戏的部分、零件”。可能并不是每个游戏都一定包含所有这八个元素,但只要是个游戏都至少含有其中某些元素。

顺便贴一下云海在讨论这个问题时画的一张图。很多小人在抗议:“为什么我们没有被列为正规元素?!”作者表示:“因为你们不正经!”

主机无法访问后学到了一些东西

上周五突然发现我无法访问自己的博客了,但是国内的朋友可以访问。心里一惊:不会被封了吧?!

可是我的博客一向老实本分啊。关键是,我买的是香港主机,IP是新加坡的,境外主机被封的话难道不应该是国内用户访问不了,国外用户可以访问吗?怎么现在反过来了?所以很可能是主机公园——也就是主机供应商方面的原因,大概线路故障什么的。更何况经过试验,即便从国内访问也无法登陆主机的cPanel管理界面,因此服务商方面故障的可能性很大。

我试着把自己的域名解析到别的网站IP,结果是我的域名可以正常指向别人的网站。因此看来域名没有问题,是IP已经不可用了。

联系主机公园几天都没收到回复,遂决定换主机服务商,搬家。

继续阅读主机无法访问后学到了一些东西

将git工作目录的改动应用到svn

之前在维护自己写的WordPress插件时,为了能够方便地同时向GitHub仓库和WordPress官方的svn仓库提交,我只在本地维护了一个git工作目录,然后用 git svn dcommit向svn仓库提交,用 git push向GitHub提交。(详见我之前写的日志。)

但可能是因为WordPress官方的svn仓库太大,历史记录太多,而git-svn的内部实现又有点问题,所以最近几次我用 git svn rebasegit svn dcommit都毫无反应。思来想去,为了不耽误时间,我还是决定老老实实用svn客户端了。

于是现在我本地就有了两个目录:一个git工作目录,用于向GitHub提交;一个svn工作目录,用于向svn提交。由于svn里的分支和标签实际上就是目录,因此svn工作目录下还有trunk、branches和tags子目录。trunk子目录里的内容才和git工作目录里的内容相同。

一般我是在git工作目录下写代码,因此思路是在git工作目录commit之后,用 git diff生成patch文件, git log输出提交日志到另外一个文件。然后用 patch命令将 git diff应用到svn工作目录。最后 svn commit的时候利用git log的输出,这样就可以做到svn trunk分支的提交和git master分支的提交一一对应。这个过程如下图所示:

继续阅读将git工作目录的改动应用到svn