骨骼动画——2D Animation

本文介绍了2D骨骼动画的工作原理,它通过绑定骨骼到2D图片的不同部位,减少资源消耗实现流畅动画。在Unity中,可以使用2D Animation工具或Spine来制作2D骨骼动画。制作流程包括创建骨骼、蒙皮、设定权重,并在Sprite Editor中应用。对于图集图片,需先将其设置为图集模式,切片后分别建立骨骼,通过父子对象关系确保动画联动。

1、2D骨骼动画

传统的序列帧动画为了达到好的动画效果,理论上来说,图片越多,动作越流畅,往往需要较多的美术资源,虽然效果好但是资源占用较多

而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的,将一张2D图片分割成n个部位,为每个部位绑上骨骼,控制骨骼旋转移动,达到用最少的2D美术资源做出流畅的2D动画效果(用性能换内存)

2、Unity中制作2D骨骼动画

主要方式有两种

  • 使用Unity2018新加功能 2D Animation 工具制作(在Package Manager窗口 搜索 2D Animation并安装)
  • 使用跨平台骨骼动画制作工具 Spine 制作

3、面板讲解 & 骨骼动画的使用

导入工具后 在Sprite Editor窗口会多一个选项 Skinning Editor,主要步骤是:

  • 创建骨骼,但创建完骨骼后并不会对图片有影响,因为还没有建立关系。创建骨骼存在父子关系,有两种方法:(1)直接点击骨骼末尾继续创建连续的子骨骼;(2)在骨骼起点点击,然后在其他位置创建新的子骨骼。也可以创建完全不相关的两个骨骼。存在父子关系时,父骨骼移动会对子骨骼产生影响,反之则不会;
  • 蒙皮,决定了骨骼要控制哪一部分,通常是先选择 自动蒙皮,然后根据实际情况通过 Edit 进行调整;
  • 设定权重,骨骼对每个顶点的影响比重,但一般在【蒙皮】的时候就自动设置了,在设定时颜色决定了对应颜色的骨骼影响的权重;
  • 一定要在 Sprite Editor 窗口中 Apply
  • 将图片放置在环境中,可以看见生成的游戏物体下就存在了表示多个骨骼信息的子“空物体”,加载 Sprite Skin 脚本 ——> Create Bones,就会显示相关的骨骼信息
### Unity 中创建或使用 Sprite2D 的骨骼动画 #### 创建 2D 骨骼结构 为了在Unity中实现Sprite2D的骨骼动画,首先要构建角色的骨架。这可以通过多种途径完成;例如,通过Puppet2D插件来加速这一过程[^1]。 对于官方支持的方法之一——Anima2D,则是在导入了所需的精灵资源之后,在场景内创建`SpriteMesh`对象并为其分配相应的图像素材。接着利用`Create Bone`功能于目标位置建立关节节点,以此形成完整的骨链架构[^4]。 ```csharp // 示例代码用于展示如何程序化地添加骨骼到SpriteMesh using UnityEngine; public class AddBoneToSprite : MonoBehaviour { void Start() { var spriteRenderer = GetComponent<SpriteRenderer>(); Anima2D.SpriteMeshInstance smi = gameObject.AddComponent<Anima2D.SpriteMeshInstance>(); smi.spriteAsset = Resources.Load<Sprite>(spriteRenderer.sprite.name); // 假设我们有一个名为"Arm"的新骨骼 Transform armBone = new GameObject("Arm").transform; armBone.SetParent(transform); } } ``` #### 绑定骨骼至SpriteMesh 一旦完成了基础框架的设计工作,下一步就是把之前定义好的骨骼关联给具体的图形表现形式—即所谓的“蒙皮”。具体来说就是在编辑模式下选定`SpriteMesh`实体,并将准备好的骨骼组件逐一加入其内部设定里提到的`Set bones`字段之中。随后借助内置工具确认两者间的关系已经确立无误[^2]。 #### 制作基本动作序列 当上述准备工作皆已完成以后,便可以着手设计一些简单的姿态变化作为起步练习。比如让虚拟形象处于静止状态下的默认姿势(通常称为idle pose)。此时需启动时间轴上的录制机制,针对各部分变换矩阵分别插入关键帧数据点,从而捕捉住特定瞬间的空间坐标信息以及旋转角度参数等重要特征量[^3]。 ```csharp // 记录Idle状态下所有骨骼的位置和旋转的关键帧 Animator animator = GetComponent<Animator>(); animator.Update(0f); foreach(Transform bone in GetComponentsInChildren<Transform>()) { AnimationUtility.SetAnimationCurve( animationClip, EditorCurveBinding.TrProperty(bone.gameObject, typeof(Transform), "m_LocalPosition"), AnimationCurve.Linear(0, bone.localPosition.x, 1, bone.localPosition.x)); } animator.Play("Idle"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值