Spine在Unity里使用有3钟方式:
-
SkeletonAnimation,Spine原生方式,支持所有Spine功能
-
SkeletonMecanim (或 SkeletonAnimator),会将SkeletonData中的动画转换为一系列AnimationClips ,并生成一个Unity Animator Controller动画状态机
-
Baking,不推荐,是专门为没有spine runtime准备的,无法使用Spine特有的功能
之前播放Spine动画用的是SkeletonMecanim方式,发现测试用的动画资源还有皮肤,可查了半天没有找到SkeletonMecanim方式下用脚本切换皮肤的方法
找到的切换皮肤的方法都是用SkeletonAnimation方式的,就也研究了下用这种方式控制动画播放和切换皮肤
一样是直接把SkeletonData文件拖进层级窗口,不过这次选SkeletonAnimation
选择待机动画,设置循环播放,就可以运行看效果了
但这样仅仅只是播放一个动画,新建一个脚本控制点击播放其他动画和更换皮肤
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;
public class NewBehaviourScript1 : MonoBehaviour
{
bool Touch = false;//用来控制动画播放过程中不能被重复开始播放
bool cloth = false;//是否切换皮肤
public SkeletonAnimation skeletonanimation;
void Start()//游戏开始时执行一次
{
skeletonanimation=GetComponent<SkeletonAnimation>();//获取骨骼动画组件
skeletonanimation.AnimationState.Complete += completeEvent;//注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "XXX_idle1", true);//循环播放待机动画
}
void Update()//每帧执行
{
if (Input.GetMouseButtonDown(0)&& Touch==false) //左键
{
Touch = true;
print("点击屏幕");
skeletonanimation.AnimationState.SetAnimation(0, "XXX_angry", false);//播放点击动画
}
if (Input.GetMouseButtonDown(1)) //右键
{
if(cloth)
{
cloth = false;
print("默认皮肤");
skeletonanimation.initialSkinName = "1";
skeletonanimation.Initialize(true); //重新初始化
skeletonanimation.AnimationState.Complete += completeEvent;//重新初始化后也需要重新注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "a_01_idle1", true);
Touch = false;
}
else
{
cloth = true;
print("切换皮肤");
skeletonanimation.initialSkinName = "8";
skeletonanimation.Initialize(true); //重新初始化
skeletonanimation.AnimationState.Complete += completeEvent;//重新初始化后也需要重新注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "a_01_idle1", true);
Touch = false;
}
}
}
/*定义动画回调事件函数*/
public void completeEvent(Spine.TrackEntry trackEntry)
{
if(Touch)
{
Touch = false;
//点击动画播放完成后切换回待机动画
skeletonanimation.AnimationState.SetAnimation(0, "a_01_idle1", true);
}
}
}
直接挂载上去
运行,点击对应按键测试