文章

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

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》的宇宙

将《拳皇》做成桌游

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

格斗游戏《拳皇》

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

动作游戏也有策略元素

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

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

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

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