#if FAIRYGUI_SPINE using System.Collections.Generic; using UnityEngine; using Spine.Unity; namespace FairyGUI { /// /// /// public partial class GLoader3D : GObject { SkeletonAnimation _spineAnimation; /// /// /// /// public SkeletonAnimation spineAnimation { get { return _spineAnimation; } } /// /// /// /// /// /// /// public void SetSpine(SkeletonDataAsset asset, int width, int height, Vector2 anchor) { SetSpine(asset, width, height, anchor, true); } /// /// /// /// /// /// /// /// public void SetSpine(SkeletonDataAsset asset, int width, int height, Vector2 anchor, bool cloneMaterial) { if (_spineAnimation != null) FreeSpine(); _content.customCloneMaterials = MaterialOverride; _content.customRecoverMaterials = CleanMaterialOverride; _spineAnimation = SkeletonRenderer.NewSpineGameObject(asset); _spineAnimation.gameObject.name = asset.name; Spine.SkeletonData dat = asset.GetSkeletonData(false); _spineAnimation.gameObject.transform.localScale = new Vector3(1 / asset.scale, 1 / asset.scale, 1); _spineAnimation.gameObject.transform.localPosition = new Vector3(anchor.x, -anchor.y, 0); SetWrapTarget(_spineAnimation.gameObject, cloneMaterial, width, height); _spineAnimation.skeleton.R = _color.r; _spineAnimation.skeleton.G = _color.g; _spineAnimation.skeleton.B = _color.b; OnChangeSpine(null); } protected void LoadSpine() { SkeletonDataAsset asset = (SkeletonDataAsset)_contentItem.skeletonAsset; if (asset == null) return; SetSpine(asset, _contentItem.width, _contentItem.height, _contentItem.skeletonAnchor); } protected void OnChangeSpine(string propertyName) { if (_spineAnimation == null) return; if (propertyName == "color") { _spineAnimation.skeleton.R = _color.r; _spineAnimation.skeleton.G = _color.g; _spineAnimation.skeleton.B = _color.b; return; } var skeletonData = _spineAnimation.skeleton.Data; var state = _spineAnimation.AnimationState; Spine.Animation animationToUse = !string.IsNullOrEmpty(_animationName) ? skeletonData.FindAnimation(_animationName) : null; if (animationToUse != null) { var trackEntry = state.GetCurrent(0); if (trackEntry == null || trackEntry.Animation.Name != _animationName || trackEntry.IsComplete && !trackEntry.Loop) trackEntry = state.SetAnimation(0, animationToUse, _loop); else trackEntry.Loop = _loop; if (_playing) trackEntry.TimeScale = 1; else { trackEntry.TimeScale = 0; trackEntry.TrackTime = Mathf.Lerp(0, trackEntry.AnimationEnd - trackEntry.AnimationStart, _frame / 100f); } } else state.ClearTrack(0); var skin = !string.IsNullOrEmpty(skinName) ? skeletonData.FindSkin(skinName) : skeletonData.DefaultSkin; if (skin == null && skeletonData.Skins.Count > 0) skin = skeletonData.Skins.Items[0]; if (_spineAnimation.skeleton.Skin != skin) { _spineAnimation.skeleton.SetSkin(skin); _spineAnimation.skeleton.SetSlotsToSetupPose(); } } protected void FreeSpine() { if (_spineAnimation != null) { if (Application.isPlaying) GameObject.Destroy(_spineAnimation.gameObject); else GameObject.DestroyImmediate(_spineAnimation.gameObject); _content.customCloneMaterials = null; _content.customRecoverMaterials = null; } } protected void OnUpdateSpine(UpdateContext context) { if (_spineAnimation != null) _spineAnimation.skeleton.A = context.alpha * _content.alpha; } private void MaterialOverride(Dictionary materials) { if (_spineAnimation != null) { foreach (var kv in materials) { _spineAnimation.CustomMaterialOverride[kv.Key] = kv.Value; } } } private void CleanMaterialOverride() { if (_spineAnimation != null) _spineAnimation.CustomMaterialOverride.Clear(); } } } #endif