Unity2D手册翻译(四)

Sprite Packer

在设计sprite图形时,每个角色一个单独的纹理文件比较方便。然而,通常认为,sprite纹理中图形元素间的空白空间,会浪费运行时显示内存。为了优化性能,最好把多个sprite纹理紧密的打包到一起至一个地图集(atlas)。Unity提供了一个 Sprite Packer 工具从分散的sprite纹理里去自动化生成地图集。

Unity 处理生成工程并且在场景背后使用sprite地图集,这样用户不需要手动调整。地图集可以被选择性的打包在进入Play模式时,或者构建期间,并且一个sprite对象的图形可以从地图集一建立的时候就获得。

用户需要在Texture Importer里面指定一个Packing Tag,启动用此Sprite纹理的打包。

使用Sprite Packer

Sprite Paker默认是关闭的,但你可以从Editor设定里配置(菜单: Edit->Project Settings -> Editor)。sprite packing mode可选择 DisabledEnable for Builds (比如打包只在构建而不是Play mode进行)或者 Alwas Enable (如在Play mode和构建的时候都启用)。

如果你打开Sprite Packer窗口(菜单:Windows->Sprite Pakcer)然后点击左上角的 Pack 按钮,你会看到打包到地图集里的纹理的布置。

如果你在Project面板选择一个sprite,它也会在地图集里被高亮显示。其轮廓正好是渲染网格的轮廓,并且它也定义了紧密打包所用的区域。

Sprite Pakcer窗口顶部的工具栏有一批控件影响打包和显示。 Pack 按钮初始化打包操作,但如果地图集从建立起都没有改变就不强制更新。(当你实现了一个自定义的打包策略,下面 Customizing the Sprite Packer 解释,一个相关的 Repack 按钮会显示)。 View AtlasPage # 菜单支持选择哪一个地图集的哪一页显示在窗口里(单一的地图集会被切分到多个“page”,如果最大的纹理吃春里无法显示下所有的sprite)。页号码旁边的菜单选择哪个“打包策略”用于此atlas(参看下面)。在工具栏右边有两个控件放大缩小视图,并且在彩色和透明度显示之间切换。

打包策略

Sprite Paker使用一个 pcaking policy 去决定如何在地图集中分配sprites。你可以建立自己的打包策略(下面说到),但Defalut Packer Policy, Tight Packer PolicyTight Rotate Enabled Sprite Packer Policy 选项常常是可以用的。在这些策略以内,在 Texture Importer 的 Packing Tag 直接选择sprite要打包进的地图集的名字,并且所有带同一个packing Tag的sprite都被被打包到同一个地图集中。地图集之后会根据纹理导入配置排序,以便他们为源纹理配合用户设置的东西。如果可能,带有同样纹理压缩配置的Sprite会被分组到同一个地图集。

  • 除非"[TIGHT]"在 Packing Tag(如设置成"[TIGHT]Character")被指定,DefaultPackerPolicy会默认使用矩形打包。
  • 如果Sprite有紧密网格,默认使用TightPackerPolicy。如果 Packing Tag 指定了"[RECT]",将使用矩形打包(如设置了"[RECT]UI_Elements",强制使用矩形打包)
  • 如果Sprite有机密网格并且可以旋转,则默认使用TightRotateEnabledSpritePackerPolicy。如果 Packing Tag 指定了"[RECT]",矩形打包会被完成(如设置了"[RECT]UI_Elements",强制使用矩形打包)

自定义Sprite Packer

虽然 DefaultPackerPolicy 选项能满足大多数的需求,但你还是可以在需要的时候实现自定义的打包策略。要做到这点,你需要在一个编辑器脚本里,实现UnityEditor.Sprites.IPackerPolicy接口。这个接口需要实现以下方法:

  • GetVersion - 返回你的打包策略的版本。如果修改已经做进了策略脚本,并且这个策略已经存到版本控制里,版本号应该凸显出来。
  • OnGroupAtlases - 在这里实现你自己的打包逻辑。在PackerJob上定义地图集,然后从给定的TextureImporter分配Sprites。

DefaultPackerPolicy默认使用矩形打包(参看SpritePackingMode)。如果你在用纹理空间效果或者想使用一个不同的网格去渲染Sprite,那么会非常有用。自定义策略可以覆盖这个并且代替使用紧密打包。

  • 只有在一个自定义策略选择的时候Repack按钮才可用
    • 除非TextureImporter元数据或者选择的PackerPolicy版本值修改的时候,OnGroupAtlases会被调用。
    • 使用你的自定义策略的是,使用Repack按钮
  • Sprites可以自动的用TighRotateEnabledSpritePackerPolicy旋转打包
    • SpritePackingRotation是一个将来Unity版本的保留类型。

其它

  • 地图集会在Project\Library\AtlasCache里缓存
    • 删除这个文件夹然后重启Unity会强制重新打包。Unity必须在做这个事情的时候关闭。
  • 地图集cache不会一开始就加载
    • Unity重启后,当第一次打包的时候,所有纹理必须被检查。这个操作可能会消耗一些时间,根据项目中纹理的总算来决定时间长短。
    • 只有用到的地图集被加载。
  • 默认最大地图集尺寸是2048x2048
  • 当PackingTag设置后,纹理不会被压缩,以便SpritePacker可以抓取原始像素值,然后在地图集里做压缩。

原文发布于微信公众号 - 韩大(handa1740168)

原文发表时间:2016-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coding

sublime text 3在win10下中文显示为方块的解决方式

3813
来自专栏程序你好

JavaScript异步图像上传

902
来自专栏程序员的知识天地

javascript对点击事件和拖动事件的区分

1.项目中,为了更好的服务用户,经常会设计一个便捷的通道,这个通道一般都是“悬浮”的。

4133
来自专栏腾讯移动品质中心TMQ的专栏

VR中的动画就是这么玩哒

导读 大家是不是觉得VR中的动画特别神奇,其实它是基于Unity中的动画系统Mecanim实现的,Unity在5.0之后,Mecanim动画控制越来越强大好用...

2586
来自专栏FreeBuf

披着羊皮的狼:如何利用漏洞以特定图标伪装可执行文件

这个漏洞背后的图标显示bug可以深溯到Windows图像处理代码,其允许攻击者“借来”本地其他常用的图标并自动将可移植的可执行文件伪装起来,这样就更容易诱使用户...

3608
来自专栏落影的专栏

直播APP的性能优化-礼物篇

介绍 记录、总结开发遇到一些问题,大家一起交流学习。 这次带来,对直播APP性能优化的总结,以QA的形式总结。 欢迎关注文集-直播Live 实现方式 1、Q:...

3566
来自专栏微信终端开发团队的专栏

微信iOS9适配总结

每年iOS升级,都会带来一些坑,这次iOS9也不例外。本文总结了微信在适配iOS9上遇到的问题和解决方案。 一、iOS9问题汇总 1. 编译问题(B...

2395
来自专栏木子昭的博客

Python综合Web案例_在线为头像添加装饰第二步:上传头像, 并实时裁剪第三步: 生成图片,长按保存

前几天元旦, 用Python为自家公众号做了一个"革面"的活动页面,活动的效果非常好,分享一下实现过程 前端: BootStrap, Jquery, Jcro...

3116
来自专栏偏前端工程师的驿站

JS魔法堂之实战:纯前端的图片预览

一、前言                                   图片上传是一个普通不过的功能,而图片预览就是就是上传功能中必不可少的子功能了。在这...

2296
来自专栏软件开发 -- 分享 互助 成长

Altium designer总结

大概有半年没有画过PCB板了,最近突然又要画一个简单的小板子,却发现好多东西已经不是很熟练了,现在把Altium designer软件的使用中要注意的问题和一些...

23010

扫码关注云+社区