木匣子

Web/Game/Programming/Life etc.

细说精灵尺寸与 Unity3d GUI

Sprite & Texture

一般而言,精灵(Sprite)是由贴图(Texture)和矩形(Rect)构成的。矩形描述了精灵使用的是贴图中的哪个部分。

Sprite = Texture + Rect

通常一张贴图只对应一个精灵,于是矩形就和整个贴图大小相同。例如一张 512 * 512 的贴图,矩形则是 Rect(x=0, y=0, width=512, height=512);但从优化的角度来说,一张贴图可以由多个 Sprite 所共享,在加载的时候只需要一次 IO,且在渲染的时候,可以共用一个 Draw Call 。在这种情况下,在同一张贴图上使用不同的矩形框就能呈现出不同的 Sprite,例如:

  • Rect(x=0, y=256, width=256, height=256)
  • Rect(x=256, y=256, width=256, height=256)
  • Rect(x=0, y=0, width=256, height=256)
  • Rect(x=256, y=0, width=256, height=256)

以上 4 个矩形把一张 512 * 512 的贴图分割成 4 个精灵。

还有一种情况是,游戏引擎在优化资源的时候,可以把原来单张的贴图自动或手动合并成一张独立的大贴图来达到同样的优化目的。

理解位图字体

位图字体即 Bitmap Font ,将预制的字符以图片的形式渲染在画面上的字体方案。由于是图像,所以支持各种静态的字体特效,例如描边、阴影、渐变等。可以使用许多第三方工具制作而成,最终生成两个文件:一个是包含所有字体图像的图集,另一个是描述字符在图集中的位置、大小以及字体信息的描述文件。

经过搜索,得知使用最广的方案是 Andreas Jönsson 提出的 bmfont 也就是常见的 fnt 格式的位图字体。在他的网站 angelcode.com 对这种格式提供了详细的文档介绍:位图字体规格说明。此外,71 Squared 还对些扩展并提供了多种格式的方案:Bitmap Font File Format

Unity3d 同步/异步加载资源

在游戏中,加载资源可以分为同步加载(sync)与异步加载(async)两种方式。同步加载易于使用,无需特别组织代码结构,加载过程会阻塞线程,好处是之后的代码可以立即使用加载后的资源:

Texture tex = LoadSync("background.png") as Texture;
image.texture = tex;

既然同步加载会阻塞线程,也就表明,如果在游戏过程使用同步加载的方式去加载较大的资源,会导致游戏掉帧,甚至卡顿,影响体验。

这时候就可以使用异步加载的方式来加载资源。异步加载有代码组织上有多种选择,一种是回调的方式:

LoadAsync("super-big-backgroud.png", (Object data) => {
    image.texture = data as Texture;
});

新手引导系统设计

经历了两个 cocos2d-x 游戏项目,在新手引导系统的设计上也有了一点经验,但经历更多的是坑。我想在这里记录一个更加成熟一点方案,并在现有的 unity3d 项目上实现出来。

微信红包分配算法

最近在微信群里抢红包,经过观察,其规则如下:

发红包时

  • 总额不得少于份数 * 0.01 元

抢红包时

  • 每份至少能够分到 0.01 元
  • 每份累加起来总是等于总额
  • 每份的数额是随机的
  • 先抢或后抢并没有明显优势

要如何实现分配算法,能够满足这一需求?

自动修改 Unity3d 导出的 Xcode 项目

在 Unity3d 导出 iOS 项目后,常常需要定制一些选项,例如指定额外的 framework,修改 Info.plist 等。

Unity3d 在导出工程的时候提供两个选项:替换整个项目「replace」和追加变动「append」。一旦使用了 replace 选项,之前所有手工设置的变更都会丢失,需要重新设置。

那么有没有一种方法可以在导出项目的时候对 Xcode 项目进行自动化配置呢?