diff --git a/Core/Script/Editor/TweenEditorUtil.cs b/Core/Script/Editor/TweenEditorUtil.cs index 0fa5462..6c29a81 100644 --- a/Core/Script/Editor/TweenEditorUtil.cs +++ b/Core/Script/Editor/TweenEditorUtil.cs @@ -40,18 +40,22 @@ static TweenEditorUtil() internal static void CacheTweenTypes() { - var types = Assembly.GetExecutingAssembly().GetTypes(); + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var tweenTypes = new List(); - for (var i = 0; i < types.Length; i++) + foreach (var assembly in assemblies) { - var type = types[i]; - if (!type.IsClass || type.IsAbstract) continue; - if (typeof(TweenerEditor).IsAssignableFrom(type)) + var types = assembly.GetTypes(); + for (var i = 0; i < types.Length; i++) { - tweenTypes.Add(type); + var type = types[i]; + if (!type.IsClass || type.IsAbstract) continue; + if (typeof(TweenerEditor).IsAssignableFrom(type)) + { + tweenTypes.Add(type); + } } } - + TweenerEditorTypeList = tweenTypes; } diff --git a/Core/Script/TweenAnimation.cs b/Core/Script/TweenAnimation.cs index 4daf84d..b6ba220 100644 --- a/Core/Script/TweenAnimation.cs +++ b/Core/Script/TweenAnimation.cs @@ -440,15 +440,41 @@ public Tweener CreateTweenerEditorTime() public bool CheckRequireComponent() { - var requireComponentsAttribute = TweenerType.GetCustomAttribute(); - if (requireComponentsAttribute == null) + var requireOneOfComponentsAttribute = TweenerType.GetCustomAttribute(); + var requireComponentAttribute = TweenerType.GetCustomAttribute(); + if (requireOneOfComponentsAttribute == null && requireComponentAttribute == null) { HasRequireComponent = true; } else { - var result = RequireComponentsAttribute.Check(TweenerType, gameObject); - HasRequireComponent = result; + if (requireOneOfComponentsAttribute != null) + { + var result = RequireOneOfComponentsAttribute.Check(TweenerType, gameObject); + HasRequireComponent = result; + } + + if (requireComponentAttribute != null) + { + var component0 = gameObject.GetComponent(requireComponentAttribute.m_Type0); + if (requireComponentAttribute.m_Type1 == null) + { + HasRequireComponent = component0 != null; + } + else + { + var component1 = gameObject.GetComponent(requireComponentAttribute.m_Type1); + if (requireComponentAttribute.m_Type2 == null) + { + HasRequireComponent = component0 != null && component1 != null; + } + else + { + var component2 = gameObject.GetComponent(requireComponentAttribute.m_Type2); + HasRequireComponent = component0 != null && component1 != null && component2 != null; + } + } + } } return HasRequireComponent; @@ -456,12 +482,37 @@ public bool CheckRequireComponent() public void FixRequireComponent() { - var requireComponentsAttribute = TweenerType.GetCustomAttribute(); - if (requireComponentsAttribute == null) return; - var componentType = requireComponentsAttribute.Types[0]; - var component = gameObject.GetComponent(componentType); - if (component != null) return; - gameObject.AddComponent(componentType); + var requireOneOfComponentsAttribute = TweenerType.GetCustomAttribute(); + var requireComponentAttribute = TweenerType.GetCustomAttribute(); + if (requireOneOfComponentsAttribute == null && requireComponentAttribute == null) return; + if (requireOneOfComponentsAttribute != null) + { + var componentType = requireOneOfComponentsAttribute.Types[0]; + var component = gameObject.GetComponent(componentType); + if (component != null) return; + gameObject.AddComponent(componentType); + } + + if (requireComponentAttribute != null) + { + if (requireComponentAttribute.m_Type0 != null) + { + var component = gameObject.GetComponent(requireComponentAttribute.m_Type0); + if(component == null) gameObject.AddComponent(requireComponentAttribute.m_Type0); + } + + if (requireComponentAttribute.m_Type1 != null) + { + var component = gameObject.GetComponent(requireComponentAttribute.m_Type1); + if (component == null) gameObject.AddComponent(requireComponentAttribute.m_Type1); + } + + if (requireComponentAttribute.m_Type2 != null) + { + var component = gameObject.GetComponent(requireComponentAttribute.m_Type2); + if (component == null) gameObject.AddComponent(requireComponentAttribute.m_Type2); + } + } } #endregion diff --git a/Core/Script/TweenManager.cs b/Core/Script/TweenManager.cs index faea128..40edac1 100644 --- a/Core/Script/TweenManager.cs +++ b/Core/Script/TweenManager.cs @@ -93,15 +93,19 @@ public static Dictionary TweenerTypeDic internal static void CacheTweenTypeDic() { - var types = Assembly.GetExecutingAssembly().GetTypes(); var tweenTypes = new List(); - for (var i = 0; i < types.Length; i++) + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) { - var type = types[i]; - if (!type.IsClass || type.IsAbstract) continue; - if (typeof(Tweener).IsAssignableFrom(type)) + var types = assembly.GetTypes(); + for (var i = 0; i < types.Length; i++) { - tweenTypes.Add(type); + var type = types[i]; + if (!type.IsClass || type.IsAbstract) continue; + if (typeof(Tweener).IsAssignableFrom(type)) + { + tweenTypes.Add(type); + } } } diff --git a/Core/Script/_Base/Attribute/RequireComponentsAttribute.cs b/Core/Script/_Base/Attribute/RequireOneOfComponentsAttribute.cs similarity index 84% rename from Core/Script/_Base/Attribute/RequireComponentsAttribute.cs rename to Core/Script/_Base/Attribute/RequireOneOfComponentsAttribute.cs index e0b9c3b..f8de6d8 100644 --- a/Core/Script/_Base/Attribute/RequireComponentsAttribute.cs +++ b/Core/Script/_Base/Attribute/RequireOneOfComponentsAttribute.cs @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // -// Script : RequireComponentsAttribute.cs +// Script : RequireOneOfComponentsAttribute.cs // Info : 特性 - 包含至少一个组件 // Author : ls9512 2019 // E-mail : ls9512@vip.qq.com @@ -13,11 +13,14 @@ namespace Aya.Tween { [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] - internal sealed class RequireComponentsAttribute : Attribute + internal sealed class RequireOneOfComponentsAttribute : Attribute { public Type[] Types; - public RequireComponentsAttribute(params Type[] requiredComponents) { Types = requiredComponents; } + public RequireOneOfComponentsAttribute(params Type[] requiredComponents) + { + Types = requiredComponents; + } /// /// 检查是否包含组件 @@ -39,7 +42,7 @@ public static bool Check(Type type, GameObject target) /// 结果 public static Component Find(Type type, GameObject target) { - var classAttribute = type.GetCustomAttribute(); + var classAttribute = type.GetCustomAttribute(); var types = classAttribute.Types; Component ret = null; for (var i = 0; i < types.Length; i++) diff --git a/Core/Script/_Base/Attribute/RequireComponentsAttribute.cs.meta b/Core/Script/_Base/Attribute/RequireOneOfComponentsAttribute.cs.meta similarity index 100% rename from Core/Script/_Base/Attribute/RequireComponentsAttribute.cs.meta rename to Core/Script/_Base/Attribute/RequireOneOfComponentsAttribute.cs.meta diff --git a/Core/Script/_Base/Ease/EaseType.cs b/Core/Script/_Base/Ease/EaseType.cs index 60ebd68..318a1e0 100644 --- a/Core/Script/_Base/Ease/EaseType.cs +++ b/Core/Script/_Base/Ease/EaseType.cs @@ -94,34 +94,13 @@ static EaseType() { var assembly = typeof(EaseType).Assembly; var space = typeof(EaseType).Namespace; - var fieldInfos = typeof(EaseType).GetFields(); - var fieldsList = new List(); - var attributeList = new List(); - foreach (var fieldInfo in fieldInfos) + var enumName = nameof(EaseType); + var infos = SerializeEnumAttribute.TypeInfosDic[enumName]; + foreach (var info in infos) { - var attributes = fieldInfo.GetCustomAttributes(true); - foreach (var attribute in attributes) - { - if (attribute.GetType() == typeof(EnumPropertyAttribute)) - { - var enumPropertyAttribute = attribute as EnumPropertyAttribute; - if (enumPropertyAttribute == null || !enumPropertyAttribute.Display) continue; - fieldsList.Add(fieldInfo); - attributeList.Add(enumPropertyAttribute); - } - } - } - - for (var i = 0; i < fieldsList.Count; i++) - { - var fieldInfo = fieldsList[i]; - var attribute = attributeList[i]; - var indexValue = (int)fieldInfo.GetValue(null); - var displayName = string.IsNullOrEmpty(attribute.DisplayName) ? fieldInfo.Name : attribute.DisplayName; - - ValueNameDic.Add(indexValue, fieldInfo.Name); - ValueShowNameDic.Add(indexValue, displayName); - NameValueDic.Add(displayName, indexValue); + ValueNameDic.Add(info.Index, info.Name); + ValueShowNameDic.Add(info.Index, info.DisplayName); + NameValueDic.Add(info.DisplayName, info.Index); } foreach (var kv in ValueNameDic) diff --git a/Core/Script/_Base/TweenType.cs b/Core/Script/_Base/TweenType.cs index 0631ae8..e628a2f 100644 --- a/Core/Script/_Base/TweenType.cs +++ b/Core/Script/_Base/TweenType.cs @@ -90,33 +90,12 @@ public static class TweenType static TweenType() { - var fieldInfos = typeof(TweenType).GetFields(); - var fieldsList = new List(); - var attributeList = new List(); - foreach (var fieldInfo in fieldInfos) + var enumName = nameof(TweenType); + var infos = SerializeEnumAttribute.TypeInfosDic[enumName]; + foreach (var info in infos) { - var attributes = fieldInfo.GetCustomAttributes(true); - foreach (var attribute in attributes) - { - if (attribute.GetType() == typeof(EnumPropertyAttribute)) - { - var enumPropertyAttribute = attribute as EnumPropertyAttribute; - if (enumPropertyAttribute == null || !enumPropertyAttribute.Display) continue; - fieldsList.Add(fieldInfo); - attributeList.Add(enumPropertyAttribute); - } - } - } - - for (var i = 0; i < fieldsList.Count; i++) - { - var fieldInfo = fieldsList[i]; - var attribute = attributeList[i]; - var indexValue = (int)fieldInfo.GetValue(null); - var displayName = string.IsNullOrEmpty(attribute.DisplayName) ? fieldInfo.Name : attribute.DisplayName; - - ValueTypeDic.Add(indexValue, displayName); - TypeValueDic.Add(displayName, indexValue); + ValueTypeDic.Add(info.Index, info.DisplayName); + TypeValueDic.Add(info.DisplayName, info.Index); } } } diff --git a/Core/Script/_TweenColor/TweenColor.cs b/Core/Script/_TweenColor/TweenColor.cs index 1d75a4a..dfc88c9 100644 --- a/Core/Script/_TweenColor/TweenColor.cs +++ b/Core/Script/_TweenColor/TweenColor.cs @@ -12,7 +12,7 @@ namespace Aya.Tween { - [RequireComponents( + [RequireOneOfComponents( typeof(Image), typeof(RawImage), typeof(Text), @@ -33,7 +33,7 @@ public class TweenColor : TweenColorBase public override void Awake() { - TargetComponent = RequireComponentsAttribute.Find(typeof(TweenColor), Target); + TargetComponent = RequireOneOfComponentsAttribute.Find(typeof(TweenColor), Target); base.Awake(); } diff --git a/Core/Script/_TweenColor/TweenColorBlock.cs b/Core/Script/_TweenColor/TweenColorBlock.cs index ab16a90..b9bacac 100644 --- a/Core/Script/_TweenColor/TweenColorBlock.cs +++ b/Core/Script/_TweenColor/TweenColorBlock.cs @@ -13,7 +13,7 @@ namespace Aya.Tween { - [RequireComponents( + [RequireOneOfComponents( typeof(Button), typeof(Toggle), typeof(InputField), @@ -31,7 +31,7 @@ public class TweenColorBlock : TweenColorBase public override void Awake() { - TargetComponent = RequireComponentsAttribute.Find(typeof(TweenColorBlock), Target); + TargetComponent = RequireOneOfComponentsAttribute.Find(typeof(TweenColorBlock), Target); base.Awake(); } diff --git a/Core/Script/_TweenComponent/TweenTransform.cs b/Core/Script/_TweenComponent/TweenTransform.cs index 91c2efd..9d98373 100644 --- a/Core/Script/_TweenComponent/TweenTransform.cs +++ b/Core/Script/_TweenComponent/TweenTransform.cs @@ -11,7 +11,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Transform)] public class TweenTransform : Tweener { diff --git a/Core/Script/_TweenFloat/TweenAlpha.cs b/Core/Script/_TweenFloat/TweenAlpha.cs index 7ec9484..a0b34a2 100644 --- a/Core/Script/_TweenFloat/TweenAlpha.cs +++ b/Core/Script/_TweenFloat/TweenAlpha.cs @@ -12,7 +12,7 @@ namespace Aya.Tween { - [RequireComponents( + [RequireOneOfComponents( typeof(Image), typeof(RawImage), typeof(Text), @@ -33,7 +33,7 @@ public class TweenAlpha : TweenFloatBase public override void Awake() { - TargetComponent = RequireComponentsAttribute.Find(typeof(TweenColor), Target); + TargetComponent = RequireOneOfComponentsAttribute.Find(typeof(TweenColor), Target); base.Awake(); } diff --git a/Core/Script/_TweenFloat/TweenCanvasGroupAlpha.cs b/Core/Script/_TweenFloat/TweenCanvasGroupAlpha.cs index 0945460..80fc964 100644 --- a/Core/Script/_TweenFloat/TweenCanvasGroupAlpha.cs +++ b/Core/Script/_TweenFloat/TweenCanvasGroupAlpha.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(CanvasGroup))] + [RequireComponent(typeof(CanvasGroup))] [Tweener(TweenType.CanvasGroupAlpha)] public class TweenCanvasGroupAlpha : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenHeight.cs b/Core/Script/_TweenFloat/TweenHeight.cs index bacb888..3b94630 100644 --- a/Core/Script/_TweenFloat/TweenHeight.cs +++ b/Core/Script/_TweenFloat/TweenHeight.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(RectTransform))] + [RequireComponent(typeof(RectTransform))] [Tweener(TweenType.Height)] public class TweenHeight : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenScrollbar.cs b/Core/Script/_TweenFloat/TweenScrollbar.cs index f42a50f..afd2148 100644 --- a/Core/Script/_TweenFloat/TweenScrollbar.cs +++ b/Core/Script/_TweenFloat/TweenScrollbar.cs @@ -7,11 +7,12 @@ // E-mail : ls9512@vip.qq.com // ///////////////////////////////////////////////////////////////////////////// +using UnityEngine; using UnityEngine.UI; namespace Aya.Tween { - [RequireComponents(typeof(Scrollbar))] + [RequireComponent(typeof(Scrollbar))] [Tweener(TweenType.Scrollbar)] public class TweenScrollbar : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenShake/TweenShake.cs b/Core/Script/_TweenFloat/TweenShake/TweenShake.cs index ef1dc3f..423217e 100644 --- a/Core/Script/_TweenFloat/TweenShake/TweenShake.cs +++ b/Core/Script/_TweenFloat/TweenShake/TweenShake.cs @@ -11,7 +11,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Shake)] public class TweenShake : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenSlider.cs b/Core/Script/_TweenFloat/TweenSlider.cs index e6fed1d..3494710 100644 --- a/Core/Script/_TweenFloat/TweenSlider.cs +++ b/Core/Script/_TweenFloat/TweenSlider.cs @@ -7,11 +7,12 @@ // E-mail : ls9512@vip.qq.com // ///////////////////////////////////////////////////////////////////////////// +using UnityEngine; using UnityEngine.UI; namespace Aya.Tween { - [RequireComponents(typeof(Slider))] + [RequireComponent(typeof(Slider))] [Tweener(TweenType.Slider)] public class TweenSlider : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenVolume.cs b/Core/Script/_TweenFloat/TweenVolume.cs index e09df49..822a212 100644 --- a/Core/Script/_TweenFloat/TweenVolume.cs +++ b/Core/Script/_TweenFloat/TweenVolume.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(AudioSource))] + [RequireComponent(typeof(AudioSource))] [Tweener(TweenType.Volume)] public class TweenVolume : TweenFloatBase { diff --git a/Core/Script/_TweenFloat/TweenWidth.cs b/Core/Script/_TweenFloat/TweenWidth.cs index d72cd53..f832aab 100644 --- a/Core/Script/_TweenFloat/TweenWidth.cs +++ b/Core/Script/_TweenFloat/TweenWidth.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(RectTransform))] + [RequireComponent(typeof(RectTransform))] [Tweener(TweenType.Width)] public class TweenWidth : TweenFloatBase { diff --git a/Core/Script/_TweenQuaternion/TweenRotationQuaternion.cs b/Core/Script/_TweenQuaternion/TweenRotationQuaternion.cs index 405c234..7d65188 100644 --- a/Core/Script/_TweenQuaternion/TweenRotationQuaternion.cs +++ b/Core/Script/_TweenQuaternion/TweenRotationQuaternion.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.RotationQuaternion)] public class TweenRotationQuaternion : TweenQuaternionBase { diff --git a/Core/Script/_TweenQueue/TweenGradient.cs b/Core/Script/_TweenQueue/TweenGradient.cs index 2604480..291f353 100644 --- a/Core/Script/_TweenQueue/TweenGradient.cs +++ b/Core/Script/_TweenQueue/TweenGradient.cs @@ -11,7 +11,7 @@ namespace Aya.Tween { - [RequireComponents( + [RequireOneOfComponents( typeof(Image), typeof(RawImage), typeof(Text), @@ -32,7 +32,7 @@ public class TweenGradient : TweenQueueColorBase public override void Awake() { - TargetComponent = RequireComponentsAttribute.Find(typeof(TweenGradient), Target); + TargetComponent = RequireOneOfComponentsAttribute.Find(typeof(TweenGradient), Target); base.Awake(); } diff --git a/Core/Script/_TweenQueue/TweenPath.cs b/Core/Script/_TweenQueue/TweenPath.cs index 6fd7dde..2b3c1ea 100644 --- a/Core/Script/_TweenQueue/TweenPath.cs +++ b/Core/Script/_TweenQueue/TweenPath.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Path)] public class TweenPath : TweenQueueVector3Base { diff --git a/Core/Script/_TweenString/TweenText.cs b/Core/Script/_TweenString/TweenText.cs index 30b3dd5..3cd6235 100644 --- a/Core/Script/_TweenString/TweenText.cs +++ b/Core/Script/_TweenString/TweenText.cs @@ -8,11 +8,12 @@ // E-mail : ls9512@vip.qq.com // ///////////////////////////////////////////////////////////////////////////// +using UnityEngine; using UnityEngine.UI; namespace Aya.Tween { - [RequireComponents(typeof(Text))] + [RequireComponent(typeof(Text))] [Tweener(TweenType.Text)] public class TweenText : TweenStringBase { diff --git a/Core/Script/_TweenVector2/TweenPositionUGUI.cs b/Core/Script/_TweenVector2/TweenPositionUGUI.cs index 27573b9..4aa006b 100644 --- a/Core/Script/_TweenVector2/TweenPositionUGUI.cs +++ b/Core/Script/_TweenVector2/TweenPositionUGUI.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(RectTransform))] + [RequireComponent(typeof(RectTransform))] [Tweener(TweenType.PositionUGUI)] public class TweenPositionUGUI : TweenVector2Base { diff --git a/Core/Script/_TweenVector2/TweenSize.cs b/Core/Script/_TweenVector2/TweenSize.cs index 23b9b28..942f1a7 100644 --- a/Core/Script/_TweenVector2/TweenSize.cs +++ b/Core/Script/_TweenVector2/TweenSize.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(RectTransform))] + [RequireComponent(typeof(RectTransform))] [Tweener(TweenType.Size)] public class TweenSize : TweenVector2Base { diff --git a/Core/Script/_TweenVector3/TweenPosition.cs b/Core/Script/_TweenVector3/TweenPosition.cs index 5b1896c..0744942 100644 --- a/Core/Script/_TweenVector3/TweenPosition.cs +++ b/Core/Script/_TweenVector3/TweenPosition.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Position)] public class TweenPosition : TweenVector3Base { diff --git a/Core/Script/_TweenVector3/TweenRotation.cs b/Core/Script/_TweenVector3/TweenRotation.cs index 1b50369..cbbe6a2 100644 --- a/Core/Script/_TweenVector3/TweenRotation.cs +++ b/Core/Script/_TweenVector3/TweenRotation.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Rotation)] public class TweenRotation : TweenVector3Base { diff --git a/Core/Script/_TweenVector3/TweenScale.cs b/Core/Script/_TweenVector3/TweenScale.cs index b752592..9b29781 100644 --- a/Core/Script/_TweenVector3/TweenScale.cs +++ b/Core/Script/_TweenVector3/TweenScale.cs @@ -10,7 +10,7 @@ namespace Aya.Tween { - [RequireComponents(typeof(Transform))] + [RequireComponent(typeof(Transform))] [Tweener(TweenType.Scale)] public class TweenScale : TweenVector3Base { diff --git a/README.md b/README.md index 9fa01b0..1ea2045 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ![last](https://img.shields.io/github/last-commit/ls9512/UTween) [![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu) -![issue](https://img.shields.io/github/issues/ls9512/UTween) +[![issue](https://img.shields.io/github/issues/ls9512/UTween)](https://github.com/ls9512/UTween/issues) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/ls9512/UTween/pulls) [![Updates](https://img.shields.io/badge/Platform-%20iOS%20%7C%20OS%20X%20%7C%20Android%20%7C%20Windows%20%7C%20Linux%20-brightgreen.svg)](https://github.com/ls9512/UTween) diff --git a/README_CN.md b/README_CN.md index 710fae1..5525668 100644 --- a/README_CN.md +++ b/README_CN.md @@ -12,7 +12,7 @@ ![last](https://img.shields.io/github/last-commit/ls9512/UTween) [![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu) -![issue](https://img.shields.io/github/issues/ls9512/UTween) +[![issue](https://img.shields.io/github/issues/ls9512/UTween)](https://github.com/ls9512/UTween/issues) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/ls9512/UTween/pulls) [![Updates](https://img.shields.io/badge/Platform-%20iOS%20%7C%20OS%20X%20%7C%20Android%20%7C%20Windows%20%7C%20Linux%20-brightgreen.svg)](https://github.com/ls9512/UTween)