Unity自带图集打包及Animator

10、Sprite Packing合并到图集

目的:减少draw calls提高游戏性能

Project视图中找到cat.png并打开Import Settings,这里注意名为Packing的标签属性. Packing标签用来定义精灵加入到纹理图集后的名称,可以是任何你想要的字符串.
Packing标签中输入它的名字”toons”:

然后点击应用按钮保存设置,用同样的方法将enemy和zombie也命名一下.
然后从”Window\Sprite Packer”菜单中打开”Sprite Packer”,如果是4.3.2版本,有可能是” Window\Sprite Packer (Developer Preview)”这样的菜单,那么将会显示下面这样的错误提示:

 

正如你所见默认是禁用Sprite packing的,我们到”Edit\Project Settings\Editor”中把Sprite Packer的模式选为”Always Enabled”,像下图这样:

当选择”Always Enabled”后,你可以在build时候看到一个”only packing your Sprites for builds”选项.

再次从”Window\Sprite Packer”菜单打开Sprite Packer窗口,如下图:

黄色的文字是提醒你用的是一个功能的预览版.以后正式版就不会看到这个提醒文字了.

在这个窗口的左上方点击Pack按钮,你会看到精灵都排列在窗口里了,如下图:

再次运行游戏到游戏视图查看运行状态信息,你将看到现在只用了两个draw calls,比原来省了两个.

这样做的好处是显而易见的,精灵共享使用了材质球,优化了性能,同时做这个优化如此简单,何乐不为.

Sprite Packer的选项和问题:

Sprite Packer窗口顶部包含一个控制栏,如下图:

1:视图中看到的是目前的图集.第一个下拉菜单是你使用过的Packing标签名称.可以选择它查看它的内容.
2:如果Sprite Packer帮你整合图集超过一张图,你需要通过第二个下拉菜单切换其它图集.
3:默认精灵在图集中的分配方法是按照DefaultPackerPolicy进行的,可以通过调整DefaultPackerPolicy来自定义分配方法,不过这个高级功能本教程就不介绍了.

有时候Unity会将我们本来要整合到一个图集拆分创建成多个地图集,并把名字加了序号.造成这个问题的原因是精灵纹理压缩格式不同.

例如:zombie.png我们设置的是16位颜色(16 bits),而enemy.png和cat.png是用的压缩格式(Compressed),那么Unity整合图集时,将会创建出两个图集,名称分别是”toons (Group 1)”和”toons (Group 2)”:

尽管这三个精灵有相同的Packing标签,但Unity仍旧创建了多个图集.为了确保图集最优化,我们要确保准备整合到同一个图集中的精灵的压缩格式相同.

正常情况下,将尽可能的减少精灵图集的总数,除非精灵太多,一张图集存不下,Unity会再次自动拆分图集,我们要用Packing标签合理安排精灵归属,尽可能做到精灵图集的最优化.

这里有个合并图集插件:https://www.codeandweb.com/texturepacker

一个人家自己写的插件教程:https://www.youtube.com/watch?v=nDzZ_5cOFR0

11、Animation动画

沿着时间轴顶部,你可以看到由秒数、冒号帧数组成的标签。

数值从零开始计数,所以0:02表示动画的第一秒的第三帧。我想用1:02做为示例,但是我怕“第二秒的第三帧”的说法可能会让人困惑。

Samples字段定义了一个动画剪辑的帧的速率,它默认值是60FPS。修改这个值为10,然后你会就注意到时间轴从之前的1:00变为了从0:00到0:09:

如果你在Project浏览器中简单选择一组精灵,然后把它们拖拽到Scene或Hierarchy视图,Unity会和之前做的一样,去创建动画剪辑、动画片绘制者和动画控制器。不过,它也在场景中创建了一个游戏对象,并把所有一切与它连接了起来!

12、Animator

1.      开始和结束标识:这些图标表明了过渡的开始和结束点。它们看起来和>|和|<很像。

2.      一段高亮的蓝色区域清楚的表明了动画片段中和过渡的相关的部分。

3.      一个指示器,标明了当前位置,当你在预览面板预览过渡效果时,在Inspector的底部(图中没有显示)。

4.      矩形块展示了与过渡相关的动画片段。如果其中一个片段循环了,它可能会出现很多次,如果需要覆盖过渡期间。蓝色高亮的区域示意了片段的那一部分和到哪种程度,这2个动画在任意时间点会如何影响。

5.      我不确定这个是什么意思。它看上去好像是是个图形,显示了动画片段是如何影响最终的弯曲值,但是我不确定。不管如何,我一般忽略它,也没有任何问题。

Exit Time:就是当特定比例的第一个动画播放完后触发才去触发过渡。

改变这个Exit Time到0.0.1,Exit Time的值域是0到1,所以0.0.1指在播放到1%的上一个动画后开始进行过渡。

Trigger参数和Bool类型很像,除了当你设置一个Trigger时,当它触发一个过渡后,这个Trigger会在过渡结束后自动重设它的值。 

AnyState:

 这个其实并非一个状态,他是一个特殊用来创建个可以随时随地发生的过渡。

例如,假定你在写一个游戏,在这个游戏中,玩家总是可以有一个能力,可以使用一个武器,不管当前玩家处于什么动画状态,都可以尝试开火,然后调用他的开火动画FireWeapon

不用创建一个从所有状态过渡到FireWeapon的状态,你可以只需要创建一个从Any State到FireWeapon的过渡。

然后,当这个过渡的条件满足后-在这种假设的情况下。可能当FirePressed Bool类型参数为True-然后当这个过渡被触发,不管当前Animator控制器在所在何种状态,这个过渡都会被执行。

SubState:

除了动画片段之外,Animator控制器中的状态可以是一个子状态机。子状态机可以让复杂的状态机更加结构简化。也就是通过将某一分支的状态包含在一个单一的状态节点内。

例如,想像一组动画片段,组成一次攻击,例如瞄准和开火。不用将他们全部呈现在Animator控制器中,你可以将他们包含在一个子状态机中。接下来的图片显示了一个假定的僵尸的Animator控制器,,它可以从走动变为攻击状态:

你像使用普通状态那样连接或者连接到子状态机,除了每次会弹出一个需要你指定特定状态的对话框。

Blend Trees: 

Blend Trees是一种特殊的状态,你可以添加到Animator控制器。他们通常将多个动画融合在一块来创造一种新的动画。例如,你可能需要一个走路和跑动的动画,你可以通过使用Blend Tree来创建一个新的动画,基于速度。 

Blend Trees是非常复杂,需要专门的教程来学习。为了让你有一个理解,Unity的2D Character 控制器课程包含了很多使用Blend Tree来选择合适的Sprite用来作为2D任务,基于这个人物特性的速度。

Layers:

 

你可以使用Layers来实现3D人物中的复杂动画。例如,你可以有一个层用来控制一个3D人物的脚来实现走动动画,通过另外一个层来实现这个人物的设计动画,然后通过某种规则来混合这种动画。

例:在一个角色控制器的Base Layer层有一个默认的qigong动画,动画效果如下:

现在我们在新添一层,命名为Stopfoot,此层有一个walk动画(如下)和一个新创建的动画,当然这个动画什么也不播放,设置一个参数bool值,根据此值来重定向到walk动画,然后给此层添加一个遮罩,遮罩设置如下:

  

当bool值设置为真,并且Stopfoot层的Weight权重值为1时,播放的效果如下:

 

可以看到,人物手的动画,已经完全被Stopfoot层的walk动画给控制了,而脚的动画却还是由BaseLayer层控制,这就是Layer的用法!

当Weight权重值越接近0的话,Stopfoot层对于手的控制将会变得削弱,0的时候就完全没有控制权了!

层设置权重代码:Animator.SetLayerWeight(int layerIndex,float weight); //Base Layer层的layerIndex为0

Overrider:会覆盖其他层的动画

Additive:不会清除其它层的动画,而是在其它层的基础上再新加入自己的动画曲线

脚本:

Animator anim = GetComponent<Animator>();
anim.SetBool("InConga", true);
bool isInConga = anim.GetBool("InConga");

最好的方式是缓存Animator的组件在一个类成员变量中,而不是每次都去读取它。此外,如果速度很关键,可以使用Animator.StringToHash来生成一个int,从string类型的”InConga“,然后使用这个方法系列中接受int的版本。如下:

  int i = Animator.StringToHash("InConga");
  animator.SetBool(i, true);

子状态机相当于把相联接的动画放在一起,组成一组!对动画进行分组的话,条理比较清晰!

混合树主要是使多个动画之间可以进行融合播放   http://docs.unity3d.com/Manual/class-BlendTree.html

的作用主要是控制身体不同部位进行动画播放   http://docs.unity3d.com/Manual/AnimationLayers.html

官方Animator教程地址:http://unity3d.com/unity/animation

posted @ 2015-01-05 21:37  MrZivChu  阅读(939)  评论(0编辑  收藏  举报
分享按钮