目录
方法一:单张Sprite去编辑,打开Sprite Editor 选择Skinging Editor开始创建骨骼
方法二:在Sprite图集 图片中去编辑,打开图集图片的Sprite Editor,选择Skinging Editor
1.首先在Project中创建Sprite Library Asset
正常骨骼编辑
方法一:单张Sprite去编辑,打开Sprite Editor 选择Skinging Editor开始创建骨骼
方法二:在Sprite图集 图片中去编辑,打开图集图片的Sprite Editor,选择Skinging Editor
创建好骨骼后,一般情况下Auto Geomety 就行,在右下角自动生成蒙皮和权重
如果权重不合适,额可以选择笔刷改变对应骨骼所影响的权重
psd 图片的骨骼编辑也是同理
骨骼编辑中的反向动力学
在场景上创建一个空物体,将编辑好骨骼的psd 图片或者Sprite图片拖入作为其子对象,并为其附加脚本 IK Manager 2D
像是一些直立行走的人,一般是要把轴心点设置在脚下,所以可以调节左上角的对齐方式为pivot,然后选中子对象,按W切换移动模式,把人物的脚底对齐父对象的点
所谓反向动力学就是根据子对象的改变去影响父对象骨骼的变化,
IK点需要我们自己在骨骼指向的末端创建一个空对象作为其子对象
在添加的Ik组件中,选择加号,添加新的Slover,一般选用limb模式或是chain模式,limb就是会自动关联三个骨骼点,一个是你在骨骼末端添加的空物体的点(IK点),剩下两个点是沿着该点往上查找到的两个父对象点
chain模式就可以自己调整关联骨骼点的个数
有两个重点需要注意:
如果你想拖动根节点(根骨骼点)的时候让一些你添加的IK点不跟着其移动,你就可以为其创建Target
如果你创建Target后又不想要其跟着根节点进行移动,你就可以把创建的那些Slover 拖进根节点,作为其子对象跟随其移动
如果创建了一个Target后,就会在Slover下关联一个子物体:
这个就是Ik点,只要这个点改变位置,与其相对应关联的骨骼的位置就会改变
所以我们可以通过鼠标指向哪,改变Ik点的位置同鼠标位置一致,就可实现指哪打哪的功能类似
在同一个psd文件中的骨骼换装问题(切换武器,装备啥的)
当我们导入该资源时,要注意要导入隐藏的图层(这样才能进行后续的换装操作)
然后按照正常骨骼编辑的逻辑去走,创建好人物的骨骼
psd文件骨骼创建好后,想要换装,先设置各个骨骼的种类和标签:
1.首先在Project中创建Sprite Library Asset
打开Sprite Library Asset 创建好对应的类型和标签,创建的标签拖入对应类型的Sprite图片
// 两个关键组件
//SpriteLibrary——精灵资料库,确定类别分组信息
//SpriteResolver——精灵解算器,用于确定部位类别和使用的图片
//一个数据文件
//SpriteLibraryAsset——精灵资料库资源,具体记录类别分组信息的文件
然后回到Hierarchy 窗口,首先为骨骼的父对象添加Sprite Library并为其关联Sprite Library Asset,
在拖入的psb骨骼对象中,同类型的Sprite子物体只留一个,并统一为它们添加上Sprite Resolver
如果图片出现错位,可以在Sprite skin 组件中勾选 Auto ReBind
Sprite skin 是骨骼编辑好后拖入场景上自动关联的
如何通过代码封装一个供外部使用的换装的方法
//1.获取各部位的SpriteResolver(需要引用命名空间)
using UnityEngine.Experimental.U2D.Animation;
//2.使用SpriteResolver的API进行装备切换
//GetCategory() 获取当前部位默认的类别名
//SetCategoryAndLabel 设置当前部位想要切换的图片信息
//sr.SetCategoryAndLabel(sr.GetCategory(), "CASK 1");
public SpriteResolver sr;
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 1");
}
public void ChangeEquip(string category, string equipName)
{
if( equipDic.ContainsKey(category) )
{
equipDic[category].SetCategoryAndLabel(category, equipName);
}
}