关于2D骨骼

目录

正常骨骼编辑

方法一:单张Sprite去编辑,打开Sprite Editor 选择Skinging Editor开始创建骨骼

方法二:在Sprite图集 图片中去编辑,打开图集图片的Sprite Editor,选择Skinging Editor

骨骼编辑中的反向动力学

在同一个psd文件中的骨骼换装问题(切换武器,装备啥的)

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);
        }
    }

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值