U3L16-1-e——2D Animation 换装

同一文件和 不同文件 制作换装资源两种方案

换装有两种情况,一个是在 同一个文件 内,一个是 不在同一文件 内

  • 换装较少的游戏,比如只有面部表情更换,可以使用同一 psb 文件方案
  • 换装较多的游戏,比如各部位有 n 种装备,可以使用不同 psb 文件方案,不同 psb 文件的拓展性更强

一切根据需求而定使用何种方案


换装资源在同一个文件中

本章代码关键字

1
2
3
4
UnityEngine.U2D.Animation                //SpriteResolver所需要的命名空间
SpriteResolver //精灵解算器类
spriteResolver.GetCategory() //获取当前部位默认的类别名
spriteResolver.SetCategoryAndLabel(,) //设置当前部位想要切换的图片信息

如何在同一个psb文件中制作换装资源

  1. 在 PS 中制作美术资源时,将一个游戏对象的所有换装资源都摆放好位置
  2. 当我们导入该资源时,要注意是否导入隐藏的图层

编辑换装资源的骨骼信息以及分组类别

注意事项:每个部位,关联的骨骼要明确设置,为同一个部位的不同装备分组

注意!

2021 版 Unity 以后,Skinning Editor 右侧面板的 Sprite 不能再进行分组,
因此编辑换装资源的骨骼信息以及分组类别和如何换装的部分较课上发生了较大的变化,下面会重写如何换装的部分

如何换装

  • 两个关键组件

    • Sprite Library —— 精灵资料库,确定类别分组信息
    • Sprite Resolver —— 精灵解算器,用于确定部位类别和使用的图片
  • 一个数据文件

    • Sprite Library Asset —— 精灵资料库资源,具体记录类别分组信息的文件

2021 版 Unity 的 编辑分组类别 以及 换装方法

如上文所述,2021 版 Unity 以后,Skinning Editor 右侧面板的 Sprite 不能再进行分组
因此 编辑换装资源的骨骼信息以及分组类别 和 如何换装 较课上所讲内容 发生了较大的变化

这里重写一次 编辑分组类别 和 换装 的具体流程

  1. 编辑分组类别

    首先,需要完成 PSB 文件下所有小图的骨骼绑定,每个部位所关联的骨骼要明确设置,完成以上步骤,保存并退出
    然后,在 Project 面板下右键新建一个 Sprite Library Asset(精灵资料库资源)文件,进行手动分组

    ​​image​​

    • 首先,为每个要换装的部位都创建一个组(按右下角的 + )并为其命名
    • 然后将每个部位的各个小图拖入对应的组内
    • 按 Apply 保存

    为同一个部位的不同装备分完组后,就可以换装

  2. 换装方法

    由于 PSB 文件内无法内置 Sprite Library Asset 文件,因此换装的流程相对于课上所讲的内容会更繁琐一些

    首先,在场景上创建一个空物体作为根对象,将PSB文件拖到空物体下作为子对象
    然后,在空物体或者 PSB 父对象上添加 Sprite Library(精灵资料库),并将上一步完成的 Sprite Library Asset 文件拖进去(如下图)

    image

    完成上一步后,将所有要换装的部位下的多余贴图全部失活,只留一个贴图 (如下图所示)

    image

    接下来,对所有要换装的部位下唯一激活的贴图添加Sprite Resolver(精灵解算器),并打开 SpriteSkin 的 Auto Rebind(以防止出现渲染错误)

    image

    对所有要换装的部位完成以上步骤后,换装部分就完成了,之后可以在代码里调用他们

代码换装

获取各部位的 SpriteResolver​(需要引用命名空间)

1
2
3
4
5
6
7
using UnityEngine;
using UnityEngine.U2D.Animation;

public class Lesson40 : MonoBehaviour
{
public SpriteResolver spriteResolver;
}

使用 SpriteResolver 的 API 进行装备切换

获取当前部位默认的类别名

1
spriteResolver.GetCategory()

设置当前部位想要切换的图片信息

1
spriteResolver.SetCategoryAndLabel(spriteResolver.GetCategory(), "CASK 3");

利用 API 获取所有的部位,并通过封装方便切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D.Animation;

public class Lesson40 : MonoBehaviour
{
private Dictionary<string, SpriteResolver> equipDic = new Dictionary<string, SpriteResolver>();

void Start()
{
SpriteResolver[] srs = this.GetComponentsInChildren<SpriteResolver>();
for (int i = 0; i < srs.Length; i++)
{
equipDic.Add(srs[i].GetCategory(), srs[i]);
}

ChangeEquip("cask", "CASK 4");
}

public void ChangeEquip(string category, string equipName)
{
if (equipDic.ContainsKey(category))
{
equipDic[category].SetCategoryAndLabel(category, equipName);
}
}
}

换装资源在不同文件中

如何在不同psb文件中制作换装资源

  1. 保证各部位在 PS 文件中的统一
  2. 基础部位可选择性隐藏

编辑换装资源的骨骼信息

注意事项:不同文件的骨骼信息必须统一,所以我们直接使用复制的方式

手动添加关键组件和数据文件

  1. 首先创建 SpriteLibraryAsset​ 数据文件
  2. 为跟对象添加 SpriteLibrary​ 并关联数据文件
  3. 为换装部位关联 SpriteResolver

步骤直接参照同一文件换装下的 2021版换装方法 即可,区别在于:

  • 不同文件的不同部位都关联到一个 SpriteLibraryAsset数据文件内,
  • 如果 PSB 文件要换装的部位只有一个 Sprite 还可以省去隐藏其他 Sprite 的步骤
  • 仍然要打开 Sprite Skin 的 Auto Behind!否则可能出现渲染问题(错位或者撕裂)

代码控制

和上文的相应内容完全一致