163 lines
5.6 KiB
C#
163 lines
5.6 KiB
C#
/******************************************************************************
|
|
* Spine Runtimes License Agreement
|
|
* Last updated July 28, 2023. Replaces all prior versions.
|
|
*
|
|
* Copyright (c) 2013-2023, Esoteric Software LLC
|
|
*
|
|
* Integration of the Spine Runtimes into software or otherwise creating
|
|
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
* http://esotericsoftware.com/spine-editor-license
|
|
*
|
|
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
* "Products"), provided that each user of the Products must obtain their own
|
|
* Spine Editor license and redistribution of the Products in any form must
|
|
* include this license and copyright notice.
|
|
*
|
|
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE
|
|
* SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*****************************************************************************/
|
|
|
|
using Spine;
|
|
using Spine.Unity;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
namespace Spine.Unity.Examples {
|
|
public class SpineAnimationTesterTool : MonoBehaviour, IHasSkeletonDataAsset, IHasSkeletonComponent {
|
|
|
|
public SkeletonAnimation skeletonAnimation;
|
|
public SkeletonDataAsset SkeletonDataAsset { get { return skeletonAnimation.SkeletonDataAsset; } }
|
|
public ISkeletonComponent SkeletonComponent { get { return skeletonAnimation; } }
|
|
|
|
public bool useOverrideMixDuration;
|
|
public float overrideMixDuration = 0.2f;
|
|
|
|
public bool useOverrideAttachmentThreshold = true;
|
|
|
|
[Range(0f, 1f)]
|
|
public float attachmentThreshold = 0.5f;
|
|
|
|
public bool useOverrideDrawOrderThreshold;
|
|
[Range(0f, 1f)]
|
|
public float drawOrderThreshold = 0.5f;
|
|
|
|
[System.Serializable]
|
|
public struct AnimationControl {
|
|
[SpineAnimation]
|
|
public string animationName;
|
|
public bool loop;
|
|
public KeyCode key;
|
|
|
|
[Space]
|
|
public bool useCustomMixDuration;
|
|
public float mixDuration;
|
|
//public bool useChainToControl;
|
|
//public int chainToControl;
|
|
}
|
|
[System.Serializable]
|
|
public class ControlledTrack {
|
|
public List<AnimationControl> controls = new List<AnimationControl>();
|
|
}
|
|
|
|
[Space]
|
|
public List<ControlledTrack> trackControls = new List<ControlledTrack>();
|
|
|
|
[Header("UI")]
|
|
public UnityEngine.UI.Text boundAnimationsText;
|
|
public UnityEngine.UI.Text skeletonNameText;
|
|
|
|
void OnValidate () {
|
|
// Fill in the SkeletonData asset name
|
|
if (skeletonNameText != null) {
|
|
if (skeletonAnimation != null && skeletonAnimation.skeletonDataAsset != null) {
|
|
skeletonNameText.text = SkeletonDataAsset.name.Replace("_SkeletonData", "");
|
|
}
|
|
}
|
|
|
|
// Fill in the control list.
|
|
if (boundAnimationsText != null) {
|
|
StringBuilder boundAnimationsStringBuilder = new StringBuilder();
|
|
boundAnimationsStringBuilder.AppendLine("Animation Controls:");
|
|
|
|
for (int trackIndex = 0; trackIndex < trackControls.Count; trackIndex++) {
|
|
|
|
if (trackIndex > 0)
|
|
boundAnimationsStringBuilder.AppendLine();
|
|
|
|
boundAnimationsStringBuilder.AppendFormat("---- Track {0} ---- \n", trackIndex);
|
|
foreach (AnimationControl ba in trackControls[trackIndex].controls) {
|
|
string animationName = ba.animationName;
|
|
if (string.IsNullOrEmpty(animationName))
|
|
animationName = "SetEmptyAnimation";
|
|
|
|
boundAnimationsStringBuilder.AppendFormat("[{0}] {1}\n", ba.key.ToString(), animationName);
|
|
}
|
|
|
|
}
|
|
|
|
boundAnimationsText.text = boundAnimationsStringBuilder.ToString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void Start () {
|
|
if (useOverrideMixDuration) {
|
|
skeletonAnimation.AnimationState.Data.DefaultMix = overrideMixDuration;
|
|
}
|
|
}
|
|
|
|
void Update () {
|
|
AnimationState animationState = skeletonAnimation.AnimationState;
|
|
|
|
// For each track
|
|
for (int trackIndex = 0; trackIndex < trackControls.Count; trackIndex++) {
|
|
|
|
// For each control in the track
|
|
foreach (AnimationControl control in trackControls[trackIndex].controls) {
|
|
|
|
// Check each control, and play the appropriate animation.
|
|
if (Input.GetKeyDown(control.key)) {
|
|
TrackEntry trackEntry;
|
|
if (!string.IsNullOrEmpty(control.animationName)) {
|
|
trackEntry = animationState.SetAnimation(trackIndex, control.animationName, control.loop);
|
|
|
|
} else {
|
|
float mix = control.useCustomMixDuration ? control.mixDuration : animationState.Data.DefaultMix;
|
|
trackEntry = animationState.SetEmptyAnimation(trackIndex, mix);
|
|
}
|
|
|
|
if (trackEntry != null) {
|
|
if (control.useCustomMixDuration)
|
|
trackEntry.SetMixDuration(control.mixDuration, 0f); // use SetMixDuration(mixDuration, delay) to update delay correctly
|
|
|
|
if (useOverrideAttachmentThreshold)
|
|
trackEntry.MixAttachmentThreshold = attachmentThreshold;
|
|
|
|
if (useOverrideDrawOrderThreshold)
|
|
trackEntry.MixDrawOrderThreshold = drawOrderThreshold;
|
|
}
|
|
|
|
// Don't parse more than one animation per track.
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|