文章

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

《游戏设计梦工厂》练习1.3 把你的生活做成一个游戏

列出你生活中的五个可以作为游戏的领域,然后简要地形容每一个可能拥有的游戏结构。

我想这里说的游戏结构应该是指第2章和第3章所说的组成游戏的“正规元素”,即玩家、目标、规则和资源等等。

人生

这就是一个每个人都24小时在线玩的MMORPG,名字可以叫做《地球Online》——当然这里我不是指维基百科收录的那个真的叫做《地球Online》的国产游戏,而是指萌娘百科收录的那个70亿玩家同时在线的世界上规模最大的MMORPG。不过这个游戏的边界(就是将非游戏内容与游戏分开的东西,见书中第3章)太大,不如将范围缩小到我的人生,或者是我的日本生涯。这样这个游戏的时间边界就是我在日本生活的期间,地理边界就是日本,玩家就是我本人。

《模拟人生》移动版

这是一个自由度极高的开放式游戏,最接近的电子游戏应该是GTA和《模拟人生》。不过现实人生的游戏规则就是自然法则与社会规则,而GTA没有那么多社会规则。人生游戏本身没有目标,也不存在通关或输赢一说。玩家角色具有智力、体力、职业技能等属性或是技能天赋,从而决定了角色的行为能力。食物、水、空气等是游戏中的资源。随着时间流逝或是由于玩家的行为,一些事件或是剧情会被触发,玩家就需要和系统或是其他玩家交互。人生游戏内部还包含很多自成体系的大中小型游戏。这些游戏又具有自己的游戏结构,比如:

继续阅读《游戏设计梦工厂》练习1.3 把你的生活做成一个游戏

EMwI插件启用失败的问题

有几名External Media without Import的用户向我反馈说插件启用失败,提示语法错误。其中还有一名用户就此问题在github上向我提了一个issue。具体的错误提示是Parse error: syntax error, unexpected T_STRING in …….external-media-without-import.php on line 25。

然而external-media-without-import.php的第25行仅仅是一个名字空间定义:

经过调查与沟通,发现原因是用户使用的PHP版本低于5.3.0,而PHP到了5.3.0才引入名字空间的特性,见PHP 5.3.0 Release Announcement。起初用户以为自己的PHP版本是5.6.30,但依据经验我猜测对方机器上可能有多个PHP版本,并且WordPress使用了较老的PHP。后来用户在自己的WordPress上安装了Display PHP Vesion插件,果然发现WordPress用的是PHP 5.2.17。

因此各位用户如果遇到这个启用失败的问题的话,请用Display PHP Vesion插件查看一下WordPress所用的PHP版本,确保PHP是5.3.0或更高的版本。

想不到那么老的PHP版本都还是有很多国内外用户在用啊。

用UGUI Slider做血条时遇到的一个小问题

前段时间想在小游戏中做一个血条UI,自然而然地想到了用UGUI的Slider。

在Unity中可以通过编辑器菜单一键创建一个Slider。这样的一个Slider里会包含Background、Fill Area和Handle Slide Area三个部分。其中Handle Slide Area就是滑块。血条不需要滑块,因此要将它删掉。

刚用编辑器菜单创建的Slider。需要将Handle Slide Area也就是滑块删掉。

我以为将滑块删掉就万事大吉不用改了,谁知却遇到一个问题。Value为0的时候,血条在表现上还有残留的血量:

Value为1的时候,血量却还没填满整个血条:

后来发现要将Fill Area及其孩子Fill的Left和Right都调成0才行。这样问题就解决了。

这里Left是指UI控件的左边缘相对于Anchors Min X的距离,Right是右边缘相对于Anchors Max X的距离。