42.2D动画-2D骨骼动画-2DAnimation-换装-换装资源在同一个文件中
42.1 知识点
如何在同一个psb文件中制作换装资源
在ps中制作美术资源时,将一个游戏对象的所有换装资源都摆放好位置
当我们导入该资源时,要注意是否导入隐藏的图层
在ps软件制作图片时,是有很多图层的。可以设置图层显示隐藏控制当前用到是哪个图。比如控制各个武器图层的显示隐藏。想换装的话可以勾选导入隐藏图层的选项并应用。
打开精灵编辑器,可以看到图片都被导入了
编辑换装资源的骨骼信息以及分组类别
打开精灵编辑器把模式调成SkinningEditor。因为导入了所有图片看起来比较乱,可以在右侧点击精灵选项,让同类型的图就显示一个。
创建骨骼,创建时假如发现原来的地方有骨骼挡着了可以切换到右边骨骼标签把挡着的骨骼想隐藏,创建好在显示刚刚隐藏的骨骼。创建好之后生成蒙皮。
由于自动生成蒙皮没那么智能,我们要切换到BoneInfluence模式下一个一个查看左边的每个精灵关联的骨骼对不对,关联多了删掉,关联少了添加
可以点击上方的SpriteSheet按钮,切换成图集模式,一个一个图查看关联的骨骼时候正确
我们可以看到右边面板上有Category分类和Label标签选项,这是Unity提供给我们换装用的。每一个同类型的图片,比如不同的头盔,都可以放到同一组。点击三角形创建新的分组,输入分组名字,后面Label标签相当于当前图片在这个分组里的名字是啥,自动是图片名可以不用改,也可以改。把多个头盔全部设置成一组。设置好后应用。
注意事项:每个部位 关联的骨骼要明确设置 为同一个部位的不同装备分组
如何换装
- 两个关键组件:
- SpriteLibrary(精灵资料库):它确定了精灵的类别分组信息。
- SpriteResolver(精灵解算器):用于确定精灵的部位类别以及使用的图片。
- 一个数据文件:
- SpriteLibraryAsset(精灵资料库资源):这是一个具体记录了类别分组信息的文件。
创建空物体,把psb文件拖进来,可以看到由于设置了换装信息和分组,PSB图片对象上添加了SpriteLibrary精灵资料库组件并关联一个数据文件SpriteLibraryAsset精灵资料库资源,这个数据文件具体记录类别分组信息。图片对象下自动生成了对应的分组对象,分组对象不仅添加了SpriteSkin组件,还添加了SpriteResolver精灵解算器组件
直接点击SpriteResolver精灵解算器组件上的图片或者下拉框切换,可以切换显示的图片,比如切换不同的头盔,实现换装
代码换装
获取各部位的SpriteResolver(需要引用命名空间),比如获得头盔的SpriteResolver,创建SpriteResolver变量并在外面拖拽关联
public SpriteResolver caskSpriteResolver;
使用SpriteResolver的API进行装备切换
//用到的SpriteResolver相关API
//GetCategory() 获取当前部位默认的类别名(分组名)
//SetCategoryAndLabel 设置当前部位想要切换的图片信息
//相当于没有设置分组,直接传入要切换的图片名进行设置
caskSpriteResolver.SetCategoryAndLabel(caskSpriteResolver.GetCategory(), "CASK 1");
一个一个设置的话其实很麻烦。可以得到所有SpriteResolver组件放到字典里封装一个换装方法方便设置
public SpriteResolver caskSpriteResolver;//头盔精灵解算器
private Dictionary<string, SpriteResolver> equipDic = new Dictionary<string, SpriteResolver>();//装备字典
//封装的设置换装方法,传入分组名和图片名
public void ChangeEquip(string category, string equipName)
{
// 判断equipDic字典中是否存在该分组名
if (equipDic.ContainsKey(category))
{
// 如果存在,则通过该分类的SpriteResolver组件,更换具体的装备名称
equipDic[category].SetCategoryAndLabel(category, equipName);
}
}
void Start()
{
#region 知识点四 代码换装
//获取各部位的SpriteResolver(需要引用命名空间)
//使用SpriteResolver的API进行装备切换
//用到的SpriteResolver相关API
//GetCategory() 获取当前部位默认的类别名(分组名)
//SetCategoryAndLabel 设置当前部位想要切换的图片信息
//相当于没有设置分组,直接传入要切换的图片名进行设置
//caskSpriteResolver.SetCategoryAndLabel(caskSpriteResolver.GetCategory(), "CASK 1");
// 获取当前对象及其子物体上的所有SpriteResolver组件
SpriteResolver[] srs = this.GetComponentsInChildren<SpriteResolver>();
// 遍历所有SpriteResolver组件,并将其添加到equipDic字典中,以便后续的装备更换操作
for (int i = 0; i < srs.Length; i++)
{
//存的key是分组名 值是当前组件
equipDic.Add(srs[i].GetCategory(), srs[i]);
}
// 对于装备分类为"Cask"的装备,更换其为名称为"CASK 1"的具体装备
ChangeEquip("Cask", "CASK 1");
#endregion
}
42.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.U2D.Animation;
public class Lesson42_2D动画_2D骨骼动画_2DAnimation_换装_换装资源在同一个文件中 : MonoBehaviour
{
public SpriteResolver caskSpriteResolver;//头盔精灵解算器
private Dictionary<string, SpriteResolver> equipDic = new Dictionary<string, SpriteResolver>();//装备字典
void Start()
{
#region 知识点一 如何在同一个psb文件中制作换装资源
//1.在ps中制作美术资源时,将一个游戏对象的所有换装资源都摆放好位置
//2.当我们导入该资源时,要注意是否导入隐藏的图层
#endregion
#region 知识点二 编辑换装资源的骨骼信息以及分组类别
//注意事项:
//每个部位 关联的骨骼要明确设置
//为同一个部位的不同装备分组
#endregion
#region 知识点三 如何换装
//两个关键组件
//SpriteLibrary——精灵资料库,确定类别分组信息
//SpriteResolver——精灵解算器,用于确定部位类别和使用的图片
//一个数据文件
//SpriteLibraryAsset——精灵资料库资源,具体记录类别分组信息的文件
#endregion
#region 知识点四 代码换装
//获取各部位的SpriteResolver(需要引用命名空间)
//使用SpriteResolver的API进行装备切换
//用到的SpriteResolver相关API
//GetCategory() 获取当前部位默认的类别名(分组名)
//SetCategoryAndLabel 设置当前部位想要切换的图片信息
//相当于没有设置分组,直接传入要切换的图片名进行设置
//caskSpriteResolver.SetCategoryAndLabel(caskSpriteResolver.GetCategory(), "CASK 1");
// 获取当前对象及其子物体上的所有SpriteResolver组件
SpriteResolver[] srs = this.GetComponentsInChildren<SpriteResolver>();
// 遍历所有SpriteResolver组件,并将其添加到equipDic字典中,以便后续的装备更换操作
for (int i = 0; i < srs.Length; i++)
{
//存的key是分组名 值是当前组件
equipDic.Add(srs[i].GetCategory(), srs[i]);
}
// 对于装备分类为"Cask"的装备,更换其为名称为"CASK 1"的具体装备
ChangeEquip("Cask", "CASK 1");
#endregion
}
//封装的设置换装方法,传入分组名和图片名
public void ChangeEquip(string category, string equipName)
{
// 判断equipDic字典中是否存在该分组名
if (equipDic.ContainsKey(category))
{
// 如果存在,则通过该分类的SpriteResolver组件,更换具体的装备名称
equipDic[category].SetCategoryAndLabel(category, equipName);
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com