18.Unity2D 横版 骨骼动画 之 可扩展简单角色换装

骨骼四部曲


15.Unity2D 横版 骨骼动画 之 单张切片图骨骼动画+Aseprite像素画软件_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客骨骼动画的原图主要有三种1.直接单图片骨骼动画绑定(最简单,直接绑定就行,本教程后面涉及)2.部件切片图骨骼动画绑定(本教程主要讲述)3.部件多图层骨骼动画绑定(Aseprite像素画绘图没有psd文件类型,本次教程不讲解)Aseprite1.下载Aseprite,CSDN搜索,自带压缩包,教程和中文汉化方法2.Aseprite简单教程;3.绘制骨骼层,每一个骨骼作为一个图层先新建几个骨骼图层,右击图层,新建图层就可以,我新建了三个骨骼,并重命名为花,茎,叶,三个骨骼。。。。https://wulang.blog.csdn.net/article/details/12679496216.Unity2D 横版 骨骼动画 之 单张PSB图+PS像素画软件_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客上一节课我们学习了单张的切片图,是最简单的一种骨骼动画,但是过几天我发现一个很大的问题--切片间的骨骼没有相连,就导致一个BUG:当你通过代码移动骨骼位置或者旋转的时候,另外一个相邻的切片图骨骼不会跟着上去,因为是切片图分别给每个骨骼做的动画。所以我们要回到单张不切图(多图层图)上来解决这个问题,骨骼相连问题就是IK动力学。我们要最先学习一下基础psd图片的骨骼动画的创建https://wulang.blog.csdn.net/article/details/12698797117.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击。动画中不能调整二级骨骼旋转?想要做到两个动画融合?今天要讲述一个非常重要的功能,骨骼动画比起帧动画来说它有一个非常重要的优点,中间值是无限插值生成的,也就是说可以通过多层动画器叠加来完成一个动作。举个栗子,在骨骼动画中你有一个走路动画,和一个跑步动画,但走路到跑步之间过度动画要怎么完成?用多层动画器并给俩层动画赋权重!这也是3D动画常用功能,当然我们现在只讲2D。https://wulang.blog.csdn.net/article/details/127034939

承接上节课

PS

1.PS画出每个骨骼图层的装备

我们找到第16节课制作的原图,用Ctrl+C/V复制到新的PS文件里面,通过各种工具在原有的多图层上来画装备,最后成果:

2.点击 文件---存储为...---大型文档格式   PSB

3.拖入到Unity的资源文件里

Unity

1.复制“石精灵”的骨骼到“石精灵-火”

 

注意:图片完全一致大小mesh网格才会粘贴,一般都是像下一步手动生成

2.自动赋权重以及取消不必要骨骼影响

详见上面第16节课

3. 为上一节课做的角色物体添加 系统脚本Sprite Libiary

 

 

 可以看到需要拖入一个人Sprite Library Asset 精灵图库

4.在文件夹里右键,新建Sprite Library Asset,为每一个部位创建一个集合,在每个集合内,拖动自己的原图和装备图片

 5.将Sprite Library Asset库拖动到角色的Sprite Libiary脚本中

6.为每一个图层物体(注意不是骨骼)添加系统脚本Sprite Resolver,选择自己创建的身体组

7.现在更换标签或者点击图片就可以实现换装了!类似,不断扩展图片库资源就可以无限扩展装备。

 

 注意:如果部件大小相差较大,换装可能不会很好的融合,可以更改图片的锚点位置相同解决

 8.通过脚本来实现换装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.U2D.Animation;

public class ArmourController : MonoBehaviour
{
//获得所有的SpriteResolver脚本列表
    public List<SpriteResolver> spriteResolvers = new List<SpriteResolver>();
    
    void Start()
    {
//获得所有的SpriteResolver脚本
        foreach (var resolver in FindObjectsOfType<SpriteResolver>())
        {
            spriteResolvers.Add(resolver);

        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            foreach (var resolver in FindObjectsOfType<SpriteResolver>())
            {
                //在SpriteResolver脚本中设置组为当前组resolver.GetCategory(),标签为"fire"
                resolver.SetCategoryAndLabel(resolver.GetCategory(), "fire");
            }

        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_54263076/article/details/127097199