spine是基于骨骼的2D动画系统,相比较与模型动画各有利弊。在做项目时,有时候需要在spine特定骨骼出添加动画帧,类似于模型动画的Animation动画帧一样。
接下来就是 spine骨骼的2D动画添加动画帧事件方法教程。
1、需要让美术在需要添加关键帧的骨骼处添加事件的名字
2、在skeletonData Animation 物体下添加一个子集,并添加脚本BoneFollower,在BoneName中选择你步骤1中添加动画事件帧的骨骼名称。
3、完成前两步的准备工作,接下来直接上代码。新建脚本ParticleControl,代码如下:
// 存储你需要在特定骨骼出生成物体的对象池列表
public List<GameObject> GOpoolList = new List<GameObject>();
// 对Spine类库进行引用
public List<SkeletonAnimation> skeletonAnimations = new List<SkeletonAnimation>();
//存储skeletonData Animation 物体下子集的列表
public List<GameObject> NumberofChildren = new List<GameObject>();
public GameObject Strike;
void Start()
{
skeletonAnimations.Add(this.GetComponent<SkeletonAnimation>());
for (int i = 0; i < skeletonAnimations.Count; i++)
{
NumberofChildren.Add(skeletonAnimations[i].transform.GetChild(0).gameObject);
skeletonAnimations[i].state.Event += AnimationEvents;
}
}
/// <summary>
/// 动画帧事件
/// </summary>
/// <param name="trackEntry"></param>
/// <param name="Myevent"></param>
void AnimationEvents(TrackEntry trackEntry, Spine.Event Myevent)
{
if (Myevent.Data.Name == "TX1") // 此处的“TX1”为之前说的特定骨骼动画帧事件名称
{
for (int i = 0; i < NumberofChildren.Count; i++)
{
LaserObjectPool(Strike, GOpoolList, NumberofChildren[i].transform.GetChild(0).transform.position);
}
}
}
/// <summary>
/// 生成特效的对象池
/// </summary>
private void LaserObjectPool(GameObject _obj, List<GameObject> _list, Vector3 gameposition)
{
foreach (var item in _list)
{
if (item.activeSelf)
{
continue;
}
item.GetComponent<StateController>().ReturnBool();
item.transform.position = gameposition;
item.SetActive(true);
return;
}
GameObject Str = Instantiate(_obj, gameposition, Quaternion.identity);
_list.Add(Str);
Str.GetComponent<StateController>().ReturnBool();
Str.transform.position = gameposition;
}