using System.Collections;
using System.Collections.Generic;
using Spine;
using Spine.Unity;
using UnityEngine;
//spine动画2种方式加载。
//spine动画播放。
//spine动画暂停。
//spine动画继续。
//spine动画完成回调。
//spine动画循环播放。
//spine动画根据事件处理逻辑。
//spine动画换皮。
public class Demo : MonoBehaviour
{
public SkeletonGraphic mySkeletonGraphic;
public SkeletonGraphic mySkeletonGraphic2;
public SkeletonGraphic mySkeletonGraphic3;
public Transform transform;
public string path;
void Start()
{
//1 加载本地spine动画文件。
//dankuang_SkeletonData是spine动画文件放入unity工程后自动生成的文件
mySkeletonGraphic = LoadSpineAnimationFromResource("Animation/dankuang_SkeletonData", transform);
//播放动画片段。第1个参数一般写0即可。第2个参数代表动画片段的名字。第3个参数代表是否循环。
mySkeletonGraphic.AnimationState.SetAnimation(0, "idle", true);
//动画结束后的委托回调
mySkeletonGraphic.AnimationState.Complete += delegate
{
//暂停动画
mySkeletonGraphic.AnimationState.TimeScale = 0;
//继续动画
//mySkeletonGraphic.AnimationState.TimeScale = 1;
};
//2 加载AB包解压缩后的资源文件
mySkeletonGraphic2 = LoadSpineAnimationFromABPackage(Path() + "/Resources/Animation/frame/IOS/spine.logicfour_score_frame", "dankuang_SkeletonData", transform);
mySkeletonGraphic2.AnimationState.SetAnimation(0,"idle",true);
mySkeletonGraphic2.AnimationState.Complete += delegate {
mySkeletonGraphic2.gameObject.SetActive(false);
};
//3 绑定事件
mySkeletonGraphic.AnimationState.Event += HandleEvent;
//搜索所有事件
for (int i = 0; i < mySkeletonGraphic.Skeleton.Data.Events.Items.Length; i++)
{
Debug.Log("检索出所有的事件: " + mySkeletonGraphic.Skeleton.Data.Events.Items[i].Name);
}
//4 换皮肤
mySkeletonGraphic3 = LoadSpineAnimationFromResource("Animation/paopao/paopao1_SkeletonData", transform);
//播放动画片段。第1个参数一般写0即可。第2个参数代表动画片段的名字。第3个参数代表是否循环。
mySkeletonGraphic3.AnimationState.SetAnimation(0, "broken", true);
//换皮肤
mySkeletonGraphic3.initialSkinName = "paopao5";
}
//事件触发的逻辑
private void HandleEvent(TrackEntry trackEntry, Spine.Event e)
{
//如果动画里有一个test里的事件,触发事件对应的逻辑
if (e.Data.Name == "test")
{
Debug.Log("触发事件逻辑");
}
}
/// <summary>
/// 通过代码动态加载Spine动画资源文件
/// </summary>
/// <param name="path">资源路径名</param>
/// <param name="transform">通过transform,控制动画的位置</param>
private SkeletonGraphic LoadSpineAnimationFromResource(string path, Transform transform)
{
//Spine默认材质球,使用Spine动画需要加载它
Material material = Resources.Load<Material>("Common/Spine/SkeletonGraphicDefault");
SkeletonDataAsset mySkeletonDataAsset = Resources.Load<SkeletonDataAsset>(path);
if (mySkeletonDataAsset != null)
{
SkeletonGraphic myAnimation = SkeletonGraphic.NewSkeletonGraphicGameObject(mySkeletonDataAsset, transform, material);
//设置锚点
myAnimation.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
//设置名字
myAnimation.name = myAnimation.skeletonDataAsset.name;
//设置材质
myAnimation.material = material;
//设置层级
myAnimation.transform.SetAsLastSibling();
//将动画尺寸赋给myAnimation
myAnimation.MatchRectTransformWithBounds();
//通过射线控制是否可点击
myAnimation.raycastTarget = false;
//刷新
myAnimation.Initialize(true);
//
return myAnimation;
}
return null;
}
/// <summary>
/// 通过代码动态加载Spine动画资源文件(AB包格式)-AB包主要用于热更新下载,这里是把解压缩zip后的文件放在了对应的位置
/// </summary>
/// <param name="path">路径名</param>
/// <param name="dataAssetName">动画名,例如dankuang_SkeletonData这种名字</param>
/// <param name="transform">通过transform,控制动画的位置</param>
SkeletonGraphic LoadSpineAnimationFromABPackage(string path, string dataAssetName, Transform transform)
{
//通过AB包获得bundle
AssetBundle bundle = AssetBundle.LoadFromFile(path, 0);
if (bundle != null)
{
Material material = Resources.Load<Material>("Common/Spine/SkeletonGraphicDefault");
//通过bundle获得SkeletonDataAsset。
SkeletonDataAsset mySkeletonDataAsset = bundle.LoadAsset<SkeletonDataAsset>(dataAssetName);
//当参数为false时,会释放掉assetbundle里面的关于资源的压缩文件数据。
//当参数为true时,该bundle中加载的物体也将被销毁,如果场景中有物体引用该资源,引用会丢失。
bundle.Unload(false);
SkeletonGraphic myAnimation = SkeletonGraphic.NewSkeletonGraphicGameObject(mySkeletonDataAsset, transform, material);
//设置锚点
myAnimation.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
//设置名字
myAnimation.name = myAnimation.skeletonDataAsset.name;
//设置材质
myAnimation.material = material;
//设置层级
myAnimation.transform.SetAsLastSibling();
//将动画尺寸赋给myAnimation
myAnimation.MatchRectTransformWithBounds();
//通过射线控制是否可点击
myAnimation.raycastTarget = false;
//刷新
myAnimation.Initialize(true);
//
return myAnimation;
}
return null;
}
public string Path()
{
string myPath = "";
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor)
myPath = Application.dataPath;
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
myPath = Application.persistentDataPath;
return myPath;
}
}
Unity-Spine骨骼动画总结
于 2022-04-19 19:32:26 首次发布