diff --git a/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineAnimationComplete.cs b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineAnimationComplete.cs
new file mode 100644
index 000000000..a2c385bb4
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineAnimationComplete.cs
@@ -0,0 +1,87 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+//using UnityEngine;
+using System.Collections;
+using Spine;
+
+namespace Spine {
+ ///
+ /// Use this as a condition-blocking yield instruction for Unity Coroutines.
+ /// The routine will pause until the AnimationState.TrackEntry fires its Complete event.
+ public class WaitForSpineAnimationComplete : IEnumerator {
+
+ bool m_WasFired = false;
+
+ public WaitForSpineAnimationComplete (Spine.TrackEntry trackEntry) {
+ SafeSubscribe(trackEntry);
+ }
+
+ void HandleComplete (AnimationState state, int trackIndex, int loopCount) {
+ m_WasFired = true;
+ }
+
+ void SafeSubscribe (Spine.TrackEntry trackEntry) {
+ if (trackEntry == null) {
+ // Break immediately if trackEntry is null.
+ m_WasFired = true;
+ } else {
+ // Function normally.
+ trackEntry.Complete += HandleComplete;
+ }
+ }
+
+ #region Reuse
+ ///
+ /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize pressure.
+ /// Use NowWaitFor to reuse the same instance of WaitForSpineAnimationComplete.
+ public WaitForSpineAnimationComplete 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/YieldInstructions/WaitForSpineAnimationComplete.cs.meta b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineAnimationComplete.cs.meta
new file mode 100644
index 000000000..0aabc3b4f
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineAnimationComplete.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a807dd9fb79db3545b6c2859a2bbfc0b
+timeCreated: 1449704018
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineEvent.cs b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineEvent.cs
new file mode 100644
index 000000000..1cbddda00
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineEvent.cs
@@ -0,0 +1,144 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+//using UnityEngine;
+using System.Collections;
+using Spine;
+
+namespace Spine {
+ ///
+ /// Use this as a condition-blocking yield instruction for Unity Coroutines.
+ /// The routine will pause until the AnimationState fires an event matching the given event name or EventData reference.
+ public class WaitForSpineEvent : IEnumerator {
+
+ Spine.EventData m_TargetEvent;
+ string m_EventName;
+ Spine.AnimationState m_AnimationState;
+
+ bool m_WasFired = false;
+ bool m_unsubscribeAfterFiring = false;
+
+ #region Constructors
+ void Subscribe (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribe) {
+ if (state == null || eventDataReference == null) {
+ m_WasFired = true;
+ } else {
+ m_AnimationState = state;
+ m_TargetEvent = eventDataReference;
+ state.Event += HandleAnimationStateEvent;
+
+ m_unsubscribeAfterFiring = unsubscribe;
+ }
+ }
+
+ void SubscribeByName (Spine.AnimationState state, string eventName, bool unsubscribe) {
+ if (state == null || string.IsNullOrEmpty(eventName)) {
+ m_WasFired = true;
+ } else {
+ m_AnimationState = state;
+ m_EventName = eventName;
+ state.Event += HandleAnimationStateEventByName;
+
+ m_unsubscribeAfterFiring = unsubscribe;
+ }
+ }
+
+ public WaitForSpineEvent (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribeAfterFiring = true) {
+ Subscribe(state, eventDataReference, unsubscribeAfterFiring);
+ }
+
+ public WaitForSpineEvent (Spine.AnimationState state, string eventName, bool unsubscribeAfterFiring = true) {
+ SubscribeByName(state, eventName, unsubscribeAfterFiring);
+ }
+ #endregion
+
+ #region Event Handlers
+ void HandleAnimationStateEventByName (AnimationState state, int trackIndex, Spine.Event e) {
+ if (state != m_AnimationState) return;
+
+ m_WasFired |= (e.Data.Name == m_EventName); // Check event name string match.
+ if (m_WasFired && m_unsubscribeAfterFiring)
+ state.Event -= HandleAnimationStateEventByName; // Unsubscribe after correct event fires.
+ }
+
+ void HandleAnimationStateEvent (AnimationState state, int trackIndex, Spine.Event e) {
+ if (state != m_AnimationState) return;
+
+ m_WasFired |= (e.Data == m_TargetEvent); // Check event data reference match.
+ if (m_WasFired && m_unsubscribeAfterFiring)
+ state.Event -= HandleAnimationStateEvent; // Usubscribe after correct event fires.
+ }
+ #endregion
+
+ #region Reuse
+ ///
+ /// By default, WaitForSpineEvent will unsubscribe from the event immediately after it fires a correct matching event.
+ /// If you want to reuse this WaitForSpineEvent instance on the same event, you can set this to false.
+ public bool WillUnsubscribeAfterFiring { get { return m_unsubscribeAfterFiring; } set { m_unsubscribeAfterFiring = value; } }
+
+ public WaitForSpineEvent NowWaitFor (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribeAfterFiring = true) {
+ ((IEnumerator)this).Reset();
+ Clear(state);
+ Subscribe(state, eventDataReference, unsubscribeAfterFiring);
+
+ return this;
+ }
+
+ public WaitForSpineEvent NowWaitFor (Spine.AnimationState state, string eventName, bool unsubscribeAfterFiring = true) {
+ ((IEnumerator)this).Reset();
+ Clear(state);
+ SubscribeByName(state, eventName, unsubscribeAfterFiring);
+
+ return this;
+ }
+
+ void Clear (Spine.AnimationState state) {
+ state.Event -= HandleAnimationStateEvent;
+ state.Event -= HandleAnimationStateEventByName;
+ }
+ #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/YieldInstructions/WaitForSpineEvent.cs.meta b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineEvent.cs.meta
new file mode 100644
index 000000000..72bbef736
--- /dev/null
+++ b/spine-unity/Assets/spine-unity/YieldInstructions/WaitForSpineEvent.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fc166d883db083e469872998172f2d38
+timeCreated: 1449701857
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: