From 0a8a083cad6b5b2a69af221ddce7c4671d5c006e Mon Sep 17 00:00:00 2001 From: pharan Date: Fri, 2 Dec 2016 19:32:30 +0800 Subject: [PATCH] [unity] Update YieldInstructions. --- .../Assets/Examples/Scripts/SpineboyPole.cs | 5 +- .../WaitForSpineAnimationComplete.cs | 3 +- .../WaitForSpineTrackEntryEnd.cs | 94 +++++++++++++++++++ .../WaitForSpineTrackEntryEnd.cs.meta | 12 +++ 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs create mode 100644 spine-unity/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta 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: