diff --git a/spine-unity/Assets/Examples/Scripts/SpineboyPole.cs b/spine-unity/Assets/Examples/Scripts/SpineboyPole.cs
index f4dc31470..a52cc4abc 100644
--- a/spine-unity/Assets/Examples/Scripts/SpineboyPole.cs
+++ b/spine-unity/Assets/Examples/Scripts/SpineboyPole.cs
@@ -69,9 +69,8 @@ namespace Spine.Unity.Examples {
SetXPosition(endX);
separator.enabled = true; // Enable Separator when hit
var poleTrack = state.SetAnimation(0, pole, false);
- float duration = poleTrack.TrackEnd;
- poleTrack.TrackEnd = float.PositiveInfinity;
- yield return new WaitForSeconds(duration + 1f);
+ yield return new WaitForSpineAnimationComplete(poleTrack);
+ yield return new WaitForSeconds(1f);
}
}
diff --git a/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs
index c2d3672e1..912c880d7 100644
--- a/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs
+++ b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs
@@ -62,14 +62,13 @@ namespace Spine.Unity {
Debug.LogWarning("TrackEntry was null. Coroutine will continue immediately.");
m_WasFired = true;
} else {
- // Function normally.
trackEntry.Complete += HandleComplete;
}
}
#region Reuse
///
- /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize pressure.
+ /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize GC pressure.
/// Use NowWaitFor to reuse the same instance of WaitForSpineAnimationComplete.
public WaitForSpineAnimationComplete NowWaitFor (Spine.TrackEntry trackEntry) {
SafeSubscribe(trackEntry);
diff --git a/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs
new file mode 100644
index 000000000..0696f11f5
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs
@@ -0,0 +1,94 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 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 THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#if (UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7)
+#define PREUNITY_5_3
+#endif
+
+using UnityEngine;
+using System.Collections;
+using Spine;
+
+namespace Spine.Unity {
+ ///
+ /// Use this as a condition-blocking yield instruction for Unity Coroutines.
+ /// The routine will pause until the AnimationState.TrackEntry fires its End event.
+ public class WaitForSpineTrackEntryEnd : IEnumerator {
+
+ bool m_WasFired = false;
+
+ public WaitForSpineTrackEntryEnd (Spine.TrackEntry trackEntry) {
+ #if PREUNITY_5_3
+ Debug.LogWarning("Unity 5.3 or later is required for Spine Unity custom yield instructions to function correctly.");
+ #endif
+
+ SafeSubscribe(trackEntry);
+ }
+
+ void HandleEnd (TrackEntry trackEntry) {
+ m_WasFired = true;
+ }
+
+ void SafeSubscribe (Spine.TrackEntry trackEntry) {
+ if (trackEntry == null) {
+ // Break immediately if trackEntry is null.
+ Debug.LogWarning("TrackEntry was null. Coroutine will continue immediately.");
+ m_WasFired = true;
+ } else {
+ trackEntry.End += HandleEnd;
+ }
+ }
+
+ #region Reuse
+ ///
+ /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize GC pressure.
+ /// Use NowWaitFor to reuse the same instance of WaitForSpineAnimationEnd.
+ public WaitForSpineTrackEntryEnd NowWaitFor (Spine.TrackEntry trackEntry) {
+ SafeSubscribe(trackEntry);
+ return this;
+ }
+ #endregion
+
+ #region IEnumerator
+ bool IEnumerator.MoveNext () {
+ if (m_WasFired) {
+ ((IEnumerator)this).Reset(); // auto-reset for YieldInstruction reuse
+ return false;
+ }
+
+ return true;
+ }
+ void IEnumerator.Reset () { m_WasFired = false; }
+ object IEnumerator.Current { get { return null; } }
+ #endregion
+
+ }
+
+}
diff --git a/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta
new file mode 100644
index 000000000..afd6031f3
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8036c6c2897d2764db92f632d2aef568
+timeCreated: 1480672707
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: