SpinePro中添加事件幀
首先 選中右上角的層級樹 然后選擇事件選項
最后在右下角看到 新建 點擊它 新建一個事件
點擊左上角的設置按鈕 彈出編輯窗口
編輯窗口
在右上角 動畫欄 可以切換對應的動畫
點坐邊的那個小灰點來切換 亮點代表當前動畫
選中幀
添加事件 點擊對應事件的🔑圖標 在當前幀添加事件
添加成功后 點擊左下角播放按鈕 可以看到 人物身邊有對應事件的文本彈出 表示添加成功
Unity監聽Spine幀事件
面板上添加
可以一個事件 添加多個監聽
代碼中動態添加
一個事件可以添加多個監聽
源碼
using System.Collections.Generic;
using UnityEngine;
using Spine.Unity;
using Spine;
using System;
using UnityEngine.Events;public class SpineEventHelper : MonoBehaviour
{[Serializable]public class SpineFrameKey{[SpineEvent] public string key;public UnityEvent handler;}[SerializeField] private List<SpineFrameKey> handlers;private Dictionary<string, UnityEvent> keyFrameEventDict = new Dictionary<string, UnityEvent>( );public const string START_EVENT = "START_EVENT", END_EVENT = "END_EVENT";private SkeletonAnimation skeletonAnimation;private void Start( ){Bind( );}private void Bind( ){skeletonAnimation = GetComponent<SkeletonAnimation>( );if ( skeletonAnimation == null ) return;skeletonAnimation.AnimationState.Event += HandleEvent;skeletonAnimation.AnimationState.Start += delegate ( TrackEntry trackEntry ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent @event ) ){@event.Invoke( );}};skeletonAnimation.AnimationState.End += delegate{if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent @event ) ){@event.Invoke( );}};foreach ( var handler in handlers ){keyFrameEventDict[ handler.key ] = handler.handler;}}/// <summary>/// 添加自定義的幀事件/// </summary>/// <param name="key"> 幀名稱 </param>/// <param name="handler"> 處理的方法 </param>public void AddCustomEventHandler( string key, UnityAction handler ){if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( key, ue );}}/// 移除自定義的幀事件/// </summary>/// <param name="key"> 指定幀名稱 </param>/// <param name="handler"> 處理的方法 如果忽略則移除key的所有幀事件 </param>public void RemoveCustomEventHandler( string key, UnityAction handler = null ){if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) ){if ( handler == null ){ev.RemoveAllListeners( );}else{ev.RemoveListener( handler );}}}/// <summary>/// 添加動畫開始事件/// </summary>/// <param name="handler"> 開始處理事件的方法 </param>public void AddStartEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( START_EVENT, ue );}}/// <summary>/// 移除開始幀事件/// </summary>/// <param name="handler"></param>public void RemoveStartEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) ){ev.RemoveListener( handler );}}/// <summary>/// 添加結束幀事件/// </summary>/// <param name="handler"></param>public void AddEndEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( END_EVENT, ue );}}/// <summary>/// 移除結束幀事件/// </summary>/// <param name="handler"></param>public void RemoveEndEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) ){ev.RemoveListener( handler );}}private void HandleEvent( TrackEntry trackEntry, Spine.Event e ){if ( keyFrameEventDict.TryGetValue( e.Data.Name, out UnityEvent @event ) ){@event.Invoke( );}}/// <summary>/// 清理所有幀事件 /// </summary>public void Clear( ){keyFrameEventDict.Clear( );}private void OnDestroy( ){Clear( ); }
}