From cbc79df8a2d850837f4c613e3a31775d6c6ee1bc Mon Sep 17 00:00:00 2001 From: CaiYanPeng Date: Fri, 26 Mar 2021 16:36:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Cyp/4-Demo.unity | 596 ++- Assets/Cyp/Circle.meta | 8 + Assets/Cyp/Circle/ImageWithRoundedCorners.cs | 36 + .../Circle/ImageWithRoundedCorners.cs.meta | 11 + Assets/Cyp/Circle/RoundedCorners.shader | 63 + Assets/Cyp/Circle/RoundedCorners.shader.meta | 9 + Assets/Cyp/Circle/SDFUtils.cginc | 82 + Assets/Cyp/Circle/SDFUtils.cginc.meta | 9 + Assets/Cyp/Circle/ShaderSetup.cginc | 25 + Assets/Cyp/Circle/ShaderSetup.cginc.meta | 9 + Assets/Cyp/Common/Utils.cs | 1 + Assets/Cyp/DOTween.meta | 8 + Assets/Cyp/DOTween/DOTween.XML | 2769 ++++++++++ Assets/Cyp/DOTween/DOTween.XML.meta | 7 + Assets/Cyp/DOTween/DOTween.dll | Bin 0 -> 162304 bytes Assets/Cyp/DOTween/DOTween.dll.meta | 33 + Assets/Cyp/DOTween/Editor.meta | 8 + Assets/Cyp/DOTween/Editor/DOTweenEditor.XML | 107 + .../Cyp/DOTween/Editor/DOTweenEditor.XML.meta | 7 + Assets/Cyp/DOTween/Editor/DOTweenEditor.dll | Bin 0 -> 57344 bytes .../Cyp/DOTween/Editor/DOTweenEditor.dll.meta | 33 + Assets/Cyp/DOTween/Editor/Imgs.meta | 8 + .../Cyp/DOTween/Editor/Imgs/DOTweenIcon.png | Bin 0 -> 1565 bytes .../DOTween/Editor/Imgs/DOTweenIcon.png.meta | 92 + Assets/Cyp/DOTween/Editor/Imgs/Footer.png | Bin 0 -> 4409 bytes .../Cyp/DOTween/Editor/Imgs/Footer.png.meta | 92 + .../Cyp/DOTween/Editor/Imgs/Footer_dark.png | Bin 0 -> 4429 bytes .../DOTween/Editor/Imgs/Footer_dark.png.meta | 92 + Assets/Cyp/DOTween/Editor/Imgs/Header.jpg | Bin 0 -> 22787 bytes .../Cyp/DOTween/Editor/Imgs/Header.jpg.meta | 92 + Assets/Cyp/DOTween/Modules.meta | 8 + .../DOTween/Modules/DOTween.Modules.asmdef | 3 + .../Modules/DOTween.Modules.asmdef.meta | 7 + .../Cyp/DOTween/Modules/DOTweenModuleAudio.cs | 202 + .../Modules/DOTweenModuleAudio.cs.meta | 11 + .../DOTween/Modules/DOTweenModulePhysics.cs | 216 + .../Modules/DOTweenModulePhysics.cs.meta | 11 + .../DOTween/Modules/DOTweenModulePhysics2D.cs | 168 + .../Modules/DOTweenModulePhysics2D.cs.meta | 11 + .../DOTween/Modules/DOTweenModuleSprite.cs | 93 + .../Modules/DOTweenModuleSprite.cs.meta | 11 + Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs | 634 +++ .../DOTween/Modules/DOTweenModuleUI.cs.meta | 11 + .../Modules/DOTweenModuleUnityVersion.cs | 403 ++ .../Modules/DOTweenModuleUnityVersion.cs.meta | 11 + .../Cyp/DOTween/Modules/DOTweenModuleUtils.cs | 155 + .../Modules/DOTweenModuleUtils.cs.meta | 11 + Assets/Cyp/DOTween/readme.txt | 29 + Assets/Cyp/DOTween/readme.txt.meta | 7 + Assets/Cyp/DemoShader.meta | 8 + Assets/Cyp/DemoShader/ScrollTest.cs | 36 + Assets/Cyp/DemoShader/ScrollTest.cs.meta | 11 + Assets/Cyp/DemoShader/ScrollTest2.cs | 65 + Assets/Cyp/DemoShader/ScrollTest2.cs.meta | 11 + Assets/Cyp/ImageRotate.cs | 30 + Assets/Cyp/ImageRotate.cs.meta | 11 + Assets/Cyp/RotateUVs.shader | 40 + Assets/Cyp/RotateUVs.shader.meta | 9 + Assets/Cyp/intensive_line.png | Bin 0 -> 603 bytes Assets/Cyp/intensive_line.png.meta | 104 + Assets/Cyp/rect.png | Bin 0 -> 178 bytes Assets/Cyp/rect.png.meta | 104 + Assets/Resources/UI/Material.meta | 8 + .../RoundedCornersTextureMaterial.mat | 88 + .../RoundedCornersTextureMaterial.mat.meta | 8 + Assets/Scenes/1-Login.unity | 4585 ++++++++++++++++- Assets/Scenes/2-Main.unity | 4372 +++++++++++++++- Assets/Scenes/Image.prefab | 89 + Assets/Scenes/Image.prefab.meta | 7 + Assets/Scripts/Scenes/LoginController.cs | 6 +- Assets/Scripts/UI/ButtonHoverScript.cs | 2 +- ProjectSettings/ProjectSettings.asset | 3 +- 72 files changed, 15352 insertions(+), 444 deletions(-) create mode 100644 Assets/Cyp/Circle.meta create mode 100644 Assets/Cyp/Circle/ImageWithRoundedCorners.cs create mode 100644 Assets/Cyp/Circle/ImageWithRoundedCorners.cs.meta create mode 100644 Assets/Cyp/Circle/RoundedCorners.shader create mode 100644 Assets/Cyp/Circle/RoundedCorners.shader.meta create mode 100644 Assets/Cyp/Circle/SDFUtils.cginc create mode 100644 Assets/Cyp/Circle/SDFUtils.cginc.meta create mode 100644 Assets/Cyp/Circle/ShaderSetup.cginc create mode 100644 Assets/Cyp/Circle/ShaderSetup.cginc.meta create mode 100644 Assets/Cyp/DOTween.meta create mode 100644 Assets/Cyp/DOTween/DOTween.XML create mode 100644 Assets/Cyp/DOTween/DOTween.XML.meta create mode 100644 Assets/Cyp/DOTween/DOTween.dll create mode 100644 Assets/Cyp/DOTween/DOTween.dll.meta create mode 100644 Assets/Cyp/DOTween/Editor.meta create mode 100644 Assets/Cyp/DOTween/Editor/DOTweenEditor.XML create mode 100644 Assets/Cyp/DOTween/Editor/DOTweenEditor.XML.meta create mode 100644 Assets/Cyp/DOTween/Editor/DOTweenEditor.dll create mode 100644 Assets/Cyp/DOTween/Editor/DOTweenEditor.dll.meta create mode 100644 Assets/Cyp/DOTween/Editor/Imgs.meta create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/DOTweenIcon.png create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/DOTweenIcon.png.meta create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Footer.png create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Footer.png.meta create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png.meta create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Header.jpg create mode 100644 Assets/Cyp/DOTween/Editor/Imgs/Header.jpg.meta create mode 100644 Assets/Cyp/DOTween/Modules.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef create mode 100644 Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs create mode 100644 Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs.meta create mode 100644 Assets/Cyp/DOTween/readme.txt create mode 100644 Assets/Cyp/DOTween/readme.txt.meta create mode 100644 Assets/Cyp/DemoShader.meta create mode 100644 Assets/Cyp/DemoShader/ScrollTest.cs create mode 100644 Assets/Cyp/DemoShader/ScrollTest.cs.meta create mode 100644 Assets/Cyp/DemoShader/ScrollTest2.cs create mode 100644 Assets/Cyp/DemoShader/ScrollTest2.cs.meta create mode 100644 Assets/Cyp/ImageRotate.cs create mode 100644 Assets/Cyp/ImageRotate.cs.meta create mode 100644 Assets/Cyp/RotateUVs.shader create mode 100644 Assets/Cyp/RotateUVs.shader.meta create mode 100644 Assets/Cyp/intensive_line.png create mode 100644 Assets/Cyp/intensive_line.png.meta create mode 100644 Assets/Cyp/rect.png create mode 100644 Assets/Cyp/rect.png.meta create mode 100644 Assets/Resources/UI/Material.meta create mode 100644 Assets/Resources/UI/Material/RoundedCornersTextureMaterial.mat create mode 100644 Assets/Resources/UI/Material/RoundedCornersTextureMaterial.mat.meta create mode 100644 Assets/Scenes/Image.prefab create mode 100644 Assets/Scenes/Image.prefab.meta diff --git a/Assets/Cyp/4-Demo.unity b/Assets/Cyp/4-Demo.unity index c41429dd..951a17c7 100644 --- a/Assets/Cyp/4-Demo.unity +++ b/Assets/Cyp/4-Demo.unity @@ -279,6 +279,244 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &879024927 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 879024928} + - component: {fileID: 879024931} + - component: {fileID: 879024930} + - component: {fileID: 879024929} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &879024928 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879024927} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1303823509} + m_Father: {fileID: 1225993558} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &879024929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879024927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 879024930} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &879024930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879024927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &879024931 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 879024927} + m_CullTransparentMesh: 0 +--- !u!1 &965574203 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965574204} + - component: {fileID: 965574207} + - component: {fileID: 965574206} + - component: {fileID: 965574205} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &965574204 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965574203} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1276475963} + m_Father: {fileID: 1225993558} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 311, y: 50} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &965574205 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965574203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: -1 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 965574206} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &965574206 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965574203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &965574207 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965574203} + m_CullTransparentMesh: 0 --- !u!1001 &975783711 PrefabInstance: m_ObjectHideFlags: 0 @@ -438,7 +676,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 232bc1a830e1f7344887323f3b110026, type: 3} m_Name: m_EditorClassIdentifier: - button: {fileID: 1548918030} + button: {fileID: 0} --- !u!114 &1225993555 MonoBehaviour: m_ObjectHideFlags: 0 @@ -511,7 +749,8 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_Children: - {fileID: 975783712} - - {fileID: 1548918029} + - {fileID: 879024928} + - {fileID: 965574204} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -557,6 +796,162 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1225993553} m_CullTransparentMesh: 0 +--- !u!1 &1276475962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1276475963} + - component: {fileID: 1276475965} + - component: {fileID: 1276475964} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1276475963 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276475962} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 965574204} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1276475964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276475962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Button +--- !u!222 &1276475965 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276475962} + m_CullTransparentMesh: 0 +--- !u!1 &1303823508 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1303823509} + - component: {fileID: 1303823511} + - component: {fileID: 1303823510} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1303823509 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303823508} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 879024928} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1303823510 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303823508} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Button +--- !u!222 &1303823511 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303823508} + m_CullTransparentMesh: 0 --- !u!1 &1326506151 GameObject: m_ObjectHideFlags: 0 @@ -640,200 +1035,3 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1548918028 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1548918029} - - component: {fileID: 1548918032} - - component: {fileID: 1548918031} - - component: {fileID: 1548918030} - m_Layer: 5 - m_Name: Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1548918029 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1548918028} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1754202976} - m_Father: {fileID: 1225993558} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -138} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1548918030 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1548918028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1548918031} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1548918031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1548918028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1548918032 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1548918028} - m_CullTransparentMesh: 0 ---- !u!1 &1754202975 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1754202976} - - component: {fileID: 1754202978} - - component: {fileID: 1754202977} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1754202976 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1754202975} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1548918029} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1754202977 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1754202975} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Button ---- !u!222 &1754202978 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1754202975} - m_CullTransparentMesh: 0 diff --git a/Assets/Cyp/Circle.meta b/Assets/Cyp/Circle.meta new file mode 100644 index 00000000..ce651e0c --- /dev/null +++ b/Assets/Cyp/Circle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f5e42e9e114a0e4abdf39588a33a9dc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/Circle/ImageWithRoundedCorners.cs b/Assets/Cyp/Circle/ImageWithRoundedCorners.cs new file mode 100644 index 00000000..cf6fe2ed --- /dev/null +++ b/Assets/Cyp/Circle/ImageWithRoundedCorners.cs @@ -0,0 +1,36 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +[ExecuteInEditMode] +public class ImageWithRoundedCorners : MonoBehaviour { + private static readonly int Props = Shader.PropertyToID("_WidthHeightRadius"); + + private Material material; + public float radius; + private void Start() + { + + } + void OnRectTransformDimensionsChange(){ + Refresh(); + } + + private void OnValidate(){ + Refresh(); + } + + private void Refresh(){ + if (material != null) + { + var rect = ((RectTransform)transform).rect; + material.SetVector(Props, new Vector4(rect.width, rect.height, radius, 0)); + gameObject.GetComponent().material = material; + gameObject.GetComponent().sprite = null; + } + else + { + material = Instantiate(Resources.Load("UI/Material/RoundedCornersTextureMaterial")); + } + } +} diff --git a/Assets/Cyp/Circle/ImageWithRoundedCorners.cs.meta b/Assets/Cyp/Circle/ImageWithRoundedCorners.cs.meta new file mode 100644 index 00000000..a34d59ae --- /dev/null +++ b/Assets/Cyp/Circle/ImageWithRoundedCorners.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adb30198aa32dd140b5750692dd48104 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/Circle/RoundedCorners.shader b/Assets/Cyp/Circle/RoundedCorners.shader new file mode 100644 index 00000000..1a30980a --- /dev/null +++ b/Assets/Cyp/Circle/RoundedCorners.shader @@ -0,0 +1,63 @@ +Shader "UI/RoundedCorners/RoundedCorners" { + Properties { + [HideInInspector] _MainTex ("Texture", 2D) = "white" {} + + // --- Mask support --- + [HideInInspector] _StencilComp ("Stencil Comparison", Float) = 8 + [HideInInspector] _Stencil ("Stencil ID", Float) = 0 + [HideInInspector] _StencilOp ("Stencil Operation", Float) = 0 + [HideInInspector] _StencilWriteMask ("Stencil Write Mask", Float) = 255 + [HideInInspector] _StencilReadMask ("Stencil Read Mask", Float) = 255 + [HideInInspector] _ColorMask ("Color Mask", Float) = 15 + [HideInInspector] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 + + // Definition in Properties section is required to Mask works properly + _WidthHeightRadius ("WidthHeightRadius", Vector) = (0,0,0,0) + // --- + } + + SubShader { + Tags { + "RenderType"="Transparent" + "Queue"="Transparent" + } + + // --- Mask support --- + Stencil { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + Cull Off + Lighting Off + ZTest [unity_GUIZTestMode] + ColorMask [_ColorMask] + // --- + + Blend SrcAlpha OneMinusSrcAlpha + ZWrite Off + + Pass { + CGPROGRAM + + #include "UnityCG.cginc" + #include "SDFUtils.cginc" + #include "ShaderSetup.cginc" + + #pragma vertex vert + #pragma fragment frag + + float4 _WidthHeightRadius; + sampler2D _MainTex; + + fixed4 frag (v2f i) : SV_Target { + float alpha = CalcAlpha(i.uv, _WidthHeightRadius.xy, _WidthHeightRadius.z); + return mixAlpha(tex2D(_MainTex, i.uv), i.color, alpha); + } + + ENDCG + } + } +} diff --git a/Assets/Cyp/Circle/RoundedCorners.shader.meta b/Assets/Cyp/Circle/RoundedCorners.shader.meta new file mode 100644 index 00000000..5c672786 --- /dev/null +++ b/Assets/Cyp/Circle/RoundedCorners.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0bd2ec5d73751e34a814274a454bec41 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/Circle/SDFUtils.cginc b/Assets/Cyp/Circle/SDFUtils.cginc new file mode 100644 index 00000000..e335c0bb --- /dev/null +++ b/Assets/Cyp/Circle/SDFUtils.cginc @@ -0,0 +1,82 @@ +// SDF Function for rectangle +float rectangle(float2 samplePosition, float2 halfSize){ + // X component represents signed distance to closest vertical edge of rectangle + // Same for Y but for closest horizontal edge + // HalfSize represents two distances from each axis of 2d space to a сorresponding edge + float2 distanceToEdge = abs(samplePosition) - halfSize; + // max(n, 0) to remove distances that signed with minus (distances inside rectangle) + // length to calculate distance from outside (distances that > 0) to rectangle + float outsideDistance = length(max(distanceToEdge, 0)); + // max(x,y) is a cheap way to calculate distance to closest edge inside rectangle + // with min we just make sure that inside distances would not impact on outside distances + float insideDistance = min(max(distanceToEdge.x, distanceToEdge.y), 0); + return outsideDistance + insideDistance; +} + +// An extension of rectangle() function to modify signed distance (effect as a wrap around rectangle) +float roundedRectangle(float2 samplePosition, float absoluteRound, float2 halfSize){ + // subtrancting value from final distance effects like a wrap around rectangle, so + // the solution is to decrease actual rectangle with `absoluteRound` value + // and then make an effect of wrap with size of `absoluteRound` + return rectangle(samplePosition, halfSize - absoluteRound) - absoluteRound; +} + +// Smoothstep function with antialiasing +float AntialiasedCutoff(float distance){ + float distanceChange = fwidth(distance) * 0.5; + return smoothstep(distanceChange, -distanceChange, distance); +} + +float CalcAlpha(float2 samplePosition, float2 size, float radius){ + // -.5 = translate origin of samplePositions from (0, 0) to (.5, .5) + // because for Image component (0,0) is bottom-right, not a center + // * size = scale samplePositions to localSpace of Image with this size + float2 samplePositionTranslated = (samplePosition - .5) * size; + float distToRect = roundedRectangle(samplePositionTranslated, radius * .5, size * .5); + return AntialiasedCutoff(distToRect); +} + +inline float2 translate(float2 samplePosition, float2 offset){ + return samplePosition - offset; +} + +float intersect(float shape1, float shape2){ + return max(shape1, shape2); +} + +float2 rotate(float2 samplePosition, float rotation){ + const float PI = 3.14159; + float angle = rotation * PI * 2 * -1; + float sine, cosine; + sincos(angle, sine, cosine); + return float2(cosine * samplePosition.x + sine * samplePosition.y, cosine * samplePosition.y - sine * samplePosition.x); +} + +float circle(float2 position, float radius){ + return length(position) - radius; +} + +float CalcAlphaForIndependentCorners(float2 samplePosition, float2 halfSize, float4 rect2props, float4 r){ + + samplePosition = (samplePosition - .5) * halfSize * 2; + + float r1 = rectangle(samplePosition, halfSize); + + float2 r2Position = rotate(translate(samplePosition, rect2props.xy), .125); + float r2 = rectangle(r2Position, rect2props.zw); + + float2 circle0Position = translate(samplePosition, float2(-halfSize.x + r.x, halfSize.y - r.x)); + float c0 = circle(circle0Position, r.x); + + float2 circle1Position = translate(samplePosition, float2(halfSize.x - r.y, halfSize.y - r.y)); + float c1 = circle(circle1Position, r.y); + + float2 circle2Position = translate(samplePosition, float2(halfSize.x - r.z, -halfSize.y + r.z)); + float c2 = circle(circle2Position, r.z); + + float2 circle3Position = translate(samplePosition, -halfSize + r.w); + float c3 = circle(circle3Position, r.w); + + float dist = max(r1,min(min(min(min(r2, c0), c1), c2), c3)); + return AntialiasedCutoff(dist); +} \ No newline at end of file diff --git a/Assets/Cyp/Circle/SDFUtils.cginc.meta b/Assets/Cyp/Circle/SDFUtils.cginc.meta new file mode 100644 index 00000000..fe9d9074 --- /dev/null +++ b/Assets/Cyp/Circle/SDFUtils.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ab2727997695a3f47805a77e7bf398fd +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/Circle/ShaderSetup.cginc b/Assets/Cyp/Circle/ShaderSetup.cginc new file mode 100644 index 00000000..22ef431c --- /dev/null +++ b/Assets/Cyp/Circle/ShaderSetup.cginc @@ -0,0 +1,25 @@ +struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 color : COLOR; // set from Image component property +}; + +struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float4 color : COLOR; +}; + +v2f vert (appdata v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + o.color = v.color; + return o; +} + +inline fixed4 mixAlpha(fixed4 mainTexColor, fixed4 color, float sdfAlpha){ + fixed4 col = mainTexColor * color; + col.a = min(col.a, sdfAlpha); + return col; +} \ No newline at end of file diff --git a/Assets/Cyp/Circle/ShaderSetup.cginc.meta b/Assets/Cyp/Circle/ShaderSetup.cginc.meta new file mode 100644 index 00000000..b975d817 --- /dev/null +++ b/Assets/Cyp/Circle/ShaderSetup.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 33563ecef438258418542aa6f49c18c6 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/Common/Utils.cs b/Assets/Cyp/Common/Utils.cs index 52abc3c5..e09cfb37 100644 --- a/Assets/Cyp/Common/Utils.cs +++ b/Assets/Cyp/Common/Utils.cs @@ -13,6 +13,7 @@ namespace Assets.Cyp.Common { public static class Utils { + /*显示简略提示,需要拖Toast的预制件,且保证其他组件名字不是Toast,ToastContainer*/ public static void showToast(GameObject game,string text,int duration = 1) { diff --git a/Assets/Cyp/DOTween.meta b/Assets/Cyp/DOTween.meta new file mode 100644 index 00000000..af05d337 --- /dev/null +++ b/Assets/Cyp/DOTween.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b906e9e57af475489c768c2ff08237c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/DOTween.XML b/Assets/Cyp/DOTween/DOTween.XML new file mode 100644 index 00000000..11e9215f --- /dev/null +++ b/Assets/Cyp/DOTween/DOTween.XML @@ -0,0 +1,2769 @@ + + + + DOTween + + + + + Types of autoPlay behaviours + + + + No tween is automatically played + + + Only Sequences are automatically played + + + Only Tweeners are automatically played + + + All tweens are automatically played + + + + What axis to constrain in case of Vector tweens + + + + Called the first time the tween is set in a playing state, after any eventual delay + + + + Used in place of System.Func, which is not available in mscorlib. + + + + + Used in place of System.Action. + + + + + Public so it can be used by lose scripts related to DOTween (like DOTweenAnimation) + + + + + Used to separate DOTween class from the MonoBehaviour instance (in order to use static constructors on DOTween). + Contains all instance-based methods + + + + Used internally inside Unity Editor, as a trick to update DOTween's inspector at every frame + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + This class contains a C# port of the easing equations created by Robert Penner (http://robertpenner.com/easing). + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected + + + + + Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected + + + + + Used to interpret AnimationCurves as eases. + Public so it can be used by external ease factories + + + + + Behaviour in case a tween nested inside a Sequence fails + + + + If the Sequence contains other elements, kill the failed tween but preserve the rest + + + Kill the whole Sequence + + + + Additional notices passed to plugins when updating. + Public so it can be used by custom plugins. Internally, only PathPlugin uses it + + + + + None + + + + + Lets the plugin know that we restarted or rewinded + + + + + OnRewind callback behaviour (can only be set via DOTween's Utility Panel) + + + + + When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will be fired only if the tween isn't already rewinded + + + + + When calling Rewind, OnRewind callbacks will always be fired, even if the tween is already rewinded. + When calling PlayBackwards/SmoothRewind instead, OnRewind callbacks will be fired only if the tween isn't already rewinded + + + + + When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will always be fired, even if the tween is already rewinded + + + + + Public only so custom shortcuts can access some of these methods + + + + + INTERNAL: used by DO shortcuts and Modules to set special startup mode + + + + + INTERNAL: used by DO shortcuts and Modules to set the tween as blendable + + + + + INTERNAL: used by DO shortcuts and Modules to prevent a tween from using a From setup even if passed + + + + + Used to dispatch commands that need to be captured externally, usually by Modules + + + + + Returns a Vector3 with z = 0 + + + + + Returns the 2D angle between two vectors + + + + + Uses approximate equality on each axis instead of Unity's Vector3 equality, + because the latter fails (in some cases) when assigning a Vector3 to a transform.position and then checking it. + + + + + Looks for the type within all possible project assembly names + + + + NO-GC METHOD: changes the start value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + If bigger than 0 applies it as the new tween duration + + + NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If bigger than 0 applies it as the new tween duration + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + NO-GC METHOD: changes the start and end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + The new end value + If bigger than 0 applies it as the new tween duration + + + + Struct that stores two colors (used for LineRenderer tweens) + + + + + Used for tween callbacks + + + + + Used for tween callbacks + + + + + Used for custom and animationCurve-based ease functions. Must return a value between 0 and 1. + + + + + Straight Quaternion plugin. Instead of using Vector3 values accepts Quaternion values directly. + Beware: doesn't work with LoopType.Incremental (neither directly nor if inside a LoopType.Incremental Sequence). + To use it, call DOTween.To with the plugin parameter overload, passing it PureQuaternionPlugin.Plug() as first parameter + (do not use any of the other public PureQuaternionPlugin methods): + DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); + + + + + Plug this plugin inside a DOTween.To call. + Example: + DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); + + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + + Main DOTween class. Contains static methods to create and control tweens in a generic way + + + + DOTween's version + + + If TRUE (default) makes tweens slightly slower but safer, automatically taking care of a series of things + (like targets becoming null while a tween is playing). + Default: TRUE + + + Behaviour in case a tween nested inside a Sequence fails (caught by safe mode). + Default: NestedTweenFailureBehaviour.TryToPreserveSequence + + + If TRUE you will get a DOTween report when exiting play mode (only in the Editor). + Useful to know how many max Tweeners and Sequences you reached and optimize your final project accordingly. + Beware, this will slightly slow down your tweens while inside Unity Editor. + Default: FALSE + + + Global DOTween timeScale. + Default: 1 + + + If TRUE, DOTween will use Time.smoothDeltaTime instead of Time.deltaTime for UpdateType.Normal and UpdateType.Late tweens + (unless they're set as timeScaleIndependent, in which case a value between the last timestep + and will be used instead). + Setting this to TRUE will lead to smoother animations. + Default: FALSE + + + If is TRUE, this indicates the max timeStep that an independent update call can last. + Setting this to TRUE will lead to smoother animations. + Default: FALSE + + + DOTween's log behaviour. + Default: LogBehaviour.ErrorsOnly + + + Used to intercept DOTween's logs. If this method isn't NULL, DOTween will call it before writing a log via Unity's own Debug log methods. + Return TRUE if you want DOTween to proceed with the log, FALSE otherwise. + This method must return a bool and accept two parameters: + - LogType: the type of Unity log that DOTween is trying to log + - object: the log message that DOTween wants to log + + + If TRUE draws path gizmos in Unity Editor (if the gizmos button is active). + Deactivate this if you want to avoid gizmos overhead while in Unity Editor + + + If TRUE activates various debug options + + + Stores the target id so it can be used to give more info in case of safeMode error capturing. + Only active if both debugMode and useSafeMode are TRUE + + + Default updateType for new tweens. + Default: UpdateType.Normal + + + Sets whether Unity's timeScale should be taken into account by default or not. + Default: false + + + Default autoPlay behaviour for new tweens. + Default: AutoPlay.All + + + Default autoKillOnComplete behaviour for new tweens. + Default: TRUE + + + Default loopType applied to all new tweens. + Default: LoopType.Restart + + + If TRUE all newly created tweens are set as recyclable, otherwise not. + Default: FALSE + + + Default ease applied to all new Tweeners (not to Sequences which always have Ease.Linear as default). + Default: Ease.InOutQuad + + + Default overshoot/amplitude used for eases + Default: 1.70158f + + + Default period used for eases + Default: 0 + + + Used internally. Assigned/removed by DOTweenComponent.Create/DestroyInstance + + + + Must be called once, before the first ever DOTween call/reference, + otherwise it will be called automatically and will use default options. + Calling it a second time won't have any effect. + You can chain SetCapacity to this method, to directly set the max starting size of Tweeners and Sequences: + DOTween.Init(false, false, LogBehaviour.Default).SetCapacity(100, 20); + + If TRUE all new tweens will be set for recycling, meaning that when killed, + instead of being destroyed, they will be put in a pool and reused instead of creating new tweens. This option allows you to avoid + GC allocations by reusing tweens, but you will have to take care of tween references, since they might result active + even if they were killed (since they might have been respawned and are now being used for other tweens). + If you want to automatically set your tween references to NULL when a tween is killed + you can use the OnKill callback like this: + .OnKill(()=> myTweenReference = null) + You can change this setting at any time by changing the static property, + or you can set the recycling behaviour for each tween separately, using: + SetRecyclable(bool recyclable) + Default: FALSE + If TRUE makes tweens slightly slower but safer, automatically taking care of a series of things + (like targets becoming null while a tween is playing). + You can change this setting at any time by changing the static property. + Default: FALSE + Type of logging to use. + You can change this setting at any time by changing the static property. + Default: ErrorsOnly + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + Kills all tweens, clears all cached tween pools and plugins and resets the max Tweeners/Sequences capacities to the default values. + + If TRUE also destroys DOTween's gameObject and resets its initializiation, default settings and everything else + (so that next time you use it it will need to be re-initialized) + + + + Clears all cached tween pools. + + + + + Checks all active tweens to find and remove eventually invalid ones (usually because their targets became NULL) + and returns the total number of invalid tweens found and removed. + IMPORTANT: this will cause an error on UWP platform, so don't use it there + BEWARE: this is a slightly expensive operation so use it with care + + + + + Updates all tweens that are set to . + + Manual deltaTime + Unscaled delta time (used with tweens set as timeScaleIndependent) + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using a custom plugin + The plugin to use. Each custom plugin implements a static Get() method + you'll need to call to assign the correct plugin in the correct way, like this: + CustomPlugin.Get() + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens only one axis of a Vector3 to the given value using default plugins. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + The axis to tween + + + Tweens only the alpha of a Color to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a virtual property from the given start to the given end value + and implements a setter that allows to use that value with an external method or a lambda + Example: + To(MyMethod, 0, 12, 0.5f); + Where MyMethod is a function that accepts a float parameter (which will be the result of the virtual tween) + The action to perform with the tweened value + The value to start from + The end value to reach + The duration of the virtual tween + + + + Punches a Vector3 towards the given direction and then back to the starting one + as if it was connected to the starting position via an elastic. + This tween type generates some GC allocations at startup + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The direction and strength of the punch + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + 1 creates a full oscillation between the direction and the opposite decaying direction, + while 0 oscillates only between the starting position and the decaying direction + + + Shakes a Vector3 with the given values. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction and behave like a random punch. + If TRUE only shakes on the X Y axis (looks better with things like cameras). + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Vector3 with the given values. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction and behave like a random punch. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a property or field to the given values using default plugins. + Ease is applied between each segment and not as a whole. + This tween type generates some GC allocations at startup + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end values to reach for each segment. This array must have the same length as durations + The duration of each segment. This array must have the same length as endValues + + + + Returns a new to be used for tween groups + + + + Completes all tweens and returns the number of actual tweens completed + (meaning tweens that don't have infinite loops and were not already complete) + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Completes all tweens with the given ID or target and returns the number of actual tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + For Sequences only: if TRUE internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Flips all tweens (changing their direction to forward if it was backwards and viceversa), + then returns the number of actual tweens flipped + + + Flips the tweens with the given ID or target (changing their direction to forward if it was backwards and viceversa), + then returns the number of actual tweens flipped + + + Sends all tweens to the given position (calculating also eventual loop cycles) and returns the actual tweens involved + + + Sends all tweens with the given ID or target to the given position (calculating also eventual loop cycles) + and returns the actual tweens involved + + + Kills all tweens and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + + + Kills all tweens and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + Eventual IDs or targets to exclude from the killing + + + Kills all tweens with the given ID or target and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + + + Pauses all tweens and returns the number of actual tweens paused + + + Pauses all tweens with the given ID or target and returns the number of actual tweens paused + (meaning the tweens that were actually playing and have been paused) + + + Plays all tweens and returns the number of actual tweens played + (meaning tweens that were not already playing or complete) + + + Plays all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + + + Plays all tweens with the given target and the given ID, and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + + + Plays backwards all tweens and returns the number of actual tweens played + (meaning tweens that were not already started, playing backwards or rewinded) + + + Plays backwards all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Plays backwards all tweens with the given target and ID and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Plays forward all tweens and returns the number of actual tweens played + (meaning tweens that were not already playing forward or complete) + + + Plays forward all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already playing forward or complete) + + + Plays forward all tweens with the given target and ID and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Restarts all tweens, then returns the number of actual tweens restarted + + + Restarts all tweens with the given ID or target, then returns the number of actual tweens restarted + If TRUE includes the eventual tweens delays, otherwise skips them + If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it + + + Restarts all tweens with the given target and the given ID, and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + If TRUE includes the eventual tweens delays, otherwise skips them + If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it + + + Rewinds and pauses all tweens, then returns the number of actual tweens rewinded + (meaning tweens that were not already rewinded) + + + Rewinds and pauses all tweens with the given ID or target, then returns the number of actual tweens rewinded + (meaning the tweens that were not already rewinded) + + + Smoothly rewinds all tweens (delays excluded), then returns the number of actual tweens rewinding/rewinded + (meaning tweens that were not already rewinded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Smoothly rewinds all tweens (delays excluded) with the given ID or target, then returns the number of actual tweens rewinding/rewinded + (meaning the tweens that were not already rewinded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Toggles the play state of all tweens and returns the number of actual tweens toggled + (meaning tweens that could be played or paused, depending on the toggle state) + + + Toggles the play state of all tweens with the given ID or target and returns the number of actual tweens toggled + (meaning the tweens that could be played or paused, depending on the toggle state) + + + + Returns TRUE if a tween with the given ID or target is active. + You can also use this to know if a shortcut tween is active for a given target. + Example: + transform.DOMoveX(45, 1); // transform is automatically added as the tween target + DOTween.IsTweening(transform); // Returns true + + The target or ID to look for + If FALSE (default) returns TRUE as long as a tween for the given target/ID is active, + otherwise also requires it to be playing + + + + Returns the total number of active and playing tweens. + A tween is considered as playing even if its delay is actually playing + + + + + Returns a list of all active tweens in a playing state. + Returns NULL if there are no active playing tweens. + Beware: each time you call this method a new list is generated, so use it for debug only + + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens in a paused state. + Returns NULL if there are no active paused tweens. + Beware: each time you call this method a new list is generated, so use it for debug only + + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens with the given id. + Returns NULL if there are no active tweens with the given id. + Beware: each time you call this method a new list is generated + + If TRUE returns only the tweens with the given ID that are currently playing + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens with the given target. + Returns NULL if there are no active tweens with the given target. + Beware: each time you call this method a new list is generated + If TRUE returns only the tweens with the given target that are currently playing + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + + Creates virtual tweens that can be used to change other elements via their OnUpdate calls + + + + + Tweens a virtual float. + You can add regular settings to the generated tween, + but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter + + The value to start from + The value to tween to + The duration of the tween + A callback which must accept a parameter of type float, called at each update + + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + Eventual overshoot to use with Back ease + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + Eventual amplitude to use with Elastic easeType + Eventual period to use with Elastic easeType + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The AnimationCurve to use for ease + + + Fires the given callback after the given time. + Callback delay + Callback to fire when the delay has expired + If TRUE (default) ignores Unity's timeScale + + + + Don't assign this! It's assigned automatically when creating 0 duration tweens + + + + + Don't assign this! It's assigned automatically when setting the ease to an AnimationCurve or to a custom ease function + + + + + Allows to wrap ease method in special ways, adding extra features + + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + Ease type + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + AnimationCurve to use for the ease + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + Custom ease function to use + + + + Used to allow method chaining with DOTween.Init + + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + Behaviour that can be assigned when chaining a SetLink to a tween + + + + Pauses the tween when the link target is disabled + + + Pauses the tween when the link target is disabled, plays it when it's enabled + + + Pauses the tween when the link target is disabled, restarts it when it's enabled + + + Plays the tween when the link target is enabled + + + Restarts the tween when the link target is enabled + + + Kills the tween when the link target is disabled + + + Kills the tween when the link target is destroyed (becomes NULL). This is always active even if another behaviour is chosen + + + Completes the tween when the link target is disabled + + + Completes and kills the tween when the link target is disabled + + + Rewinds the tween (delay excluded) when the link target is disabled + + + Rewinds and kills the tween when the link target is disabled + + + + Path mode (used to determine correct LookAt orientation) + + + + Ignores the path mode (and thus LookAt behaviour) + + + Regular 3D path + + + 2D top-down path + + + 2D side-scroller path + + + + Type of path to use with DOPath tweens + + + + Linear, composed of straight segments between each waypoint + + + Curved path (which uses Catmull-Rom curves) + + + EXPERIMENTAL: Curved path (which uses Cubic Bezier curves, where each point requires two extra control points) + + + + Path control point + + + + + Path waypoints (modified by PathPlugin when setting relative end/change value or by CubicBezierDecoder) and by DOTweenPathInspector + + + + + Gets the point on the path at the given percentage (0 to 1) + + The percentage (0 to 1) at which to get the point + If TRUE constant speed is taken into account, otherwise not + + + + Base interface for all tween plugins options + + + + Resets the plugin + + + + This plugin generates some GC allocations at startup + + + + + Path plugin works exclusively with Transforms + + + + + Rotation mode used with DORotate methods + + + + + Fastest way that never rotates beyond 360° + + + + + Fastest way that rotates beyond 360° + + + + + Adds the given rotation to the transform using world axis and an advanced precision mode + (like when using transform.Rotate(Space.World)). + In this mode the end value is is always considered relative + + + + + Adds the given rotation to the transform's local axis + (like when rotating an object with the "local" switch enabled in Unity's editor or using transform.Rotate(Space.Self)). + In this mode the end value is is always considered relative + + + + + Type of scramble to apply to string tweens + + + + + No scrambling of characters + + + + + A-Z + a-z + 0-9 characters + + + + + A-Z characters + + + + + a-z characters + + + + + 0-9 characters + + + + + Custom characters + + + + + Methods that extend Tween objects and allow to control or get data from them + + + + Completes the tween + + + Completes the tween + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Flips the direction of this tween (backwards if it was going forward or viceversa) + + + Forces the tween to initialize its settings immediately + + + Send the tween to the given position in time + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + Kills the tween + If TRUE completes the tween before killing it + + + Pauses the tween + + + Plays the tween + + + Sets the tween in a backwards direction and plays it + + + Sets the tween in a forward direction and plays it + + + Restarts the tween from the beginning + Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it + Ignored in case of Sequences. If >= 0 changes the startup delay to this value, otherwise doesn't touch it + + + Rewinds and pauses the tween + Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it + + + Smoothly rewinds the tween (delays excluded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + If called on a tween who is still waiting for its delay to happen, it will simply set the delay to 0 and pause the tween. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Plays the tween if it was paused, pauses it if it was playing + + + Send a path tween to the given waypoint. + Has no effect if this is not a path tween. + BEWARE, this is a special utility method: + it works only with Linear eases. Also, the lookAt direction might be wrong after calling this and might need to be set manually + (because it relies on a smooth path movement and doesn't work well with jumps that encompass dramatic direction changes) + Waypoint index to reach + (if higher than the max waypoint index the tween will simply go to the last one) + If TRUE will play the tween after reaching the given waypoint, otherwise it will pause it + + + + Creates a yield instruction that waits until the tween is killed or complete. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForCompletion(); + + + + + Creates a yield instruction that waits until the tween is killed or rewinded. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForRewind(); + + + + + Creates a yield instruction that waits until the tween is killed. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForKill(); + + + + + Creates a yield instruction that waits until the tween is killed or has gone through the given amount of loops. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForElapsedLoops(2); + + Elapsed loops to wait for + + + + Creates a yield instruction that waits until the tween is killed or has reached the given position (loops included, delays excluded). + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForPosition(2.5f); + + Position (loops included, delays excluded) to wait for + + + + Creates a yield instruction that waits until the tween is killed or started + (meaning when the tween is set in a playing state the first time, after any eventual delay). + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForStart(); + + + + Returns the total number of loops completed by this tween + + + Returns the eventual delay set for this tween + + + Returns the eventual elapsed delay set for this tween + + + Returns the duration of this tween (delays excluded). + NOTE: when using settings like SpeedBased, the duration will be recalculated when the tween starts + If TRUE returns the full duration loops included, + otherwise the duration of a single loop cycle + + + Returns the elapsed time for this tween (delays exluded) + If TRUE returns the elapsed time since startup loops included, + otherwise the elapsed time within the current loop cycle + + + Returns the elapsed percentage (0 to 1) of this tween (delays exluded) + If TRUE returns the elapsed percentage since startup loops included, + otherwise the elapsed percentage within the current loop cycle + + + Returns the elapsed percentage (0 to 1) of this tween (delays exluded), + based on a single loop, and calculating eventual backwards Yoyo loops as 1 to 0 instead of 0 to 1 + + + Returns FALSE if this tween has been killed or is NULL, TRUE otherwise. + BEWARE: if this tween is recyclable it might have been spawned again for another use and thus return TRUE anyway. + When working with recyclable tweens you should take care to know when a tween has been killed and manually set your references to NULL. + If you want to be sure your references are set to NULL when a tween is killed you can use the OnKill callback like this: + .OnKill(()=> myTweenReference = null) + + + Returns TRUE if this tween was reversed and is set to go backwards + + + Returns TRUE if the tween is complete + (silently fails and returns FALSE if the tween has been killed) + + + Returns TRUE if this tween has been initialized + + + Returns TRUE if this tween is playing + + + Returns the total number of loops set for this tween + (returns -1 if the loops are infinite) + + + + Returns a point on a path based on the given path percentage. + Returns Vector3.zero if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + Percentage of the path (0 to 1) on which to get the point + + + + Returns an array of points that can be used to draw the path. + Note that this method generates allocations, because it creates a new array. + Returns NULL if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + How many points to create for each path segment (waypoint to waypoint). + Only used in case of non-Linear paths + + + + Returns the length of a path. + Returns -1 if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + + + + Types of loop + + + + Each loop cycle restarts from the beginning + + + The tween moves forward and backwards at alternate cycles + + + Continuously increments the tween at the end of each loop cycle (A to B, B to B+(A-B), and so on), thus always moving "onward". + In case of String tweens works only if the tween is set as relative + + + + Controls other tweens as a group + + + + + Methods that extend known Unity objects and allow to directly create and control tweens from their instances + + + + Tweens a Camera's aspect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's backgroundColor to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's farClipPlane to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's fieldOfView to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's nearClipPlane to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's orthographicSize to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's pixelRect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's rect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Shakes a Camera's localPosition along its relative X Y axes with the given values. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localPosition along its relative X Y axes with the given values. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localRotation. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localRotation. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a Light's color to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's intensity to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's shadowStrength to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a LineRenderer's color to the given value. + Also stores the LineRenderer as the tween's target so it can be used for filtered operations. + Note that this method requires to also insert the start colors for the tween, + since LineRenderers have no way to get them. + The start value to tween from + The end value to reachThe duration of the tween + + + Tweens a Material's color to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Material's named color property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's named color property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's alpha color to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Material's alpha color to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's alpha color with the given ID to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's named float property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named float property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's texture offset to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The duration of the tween + + + Tweens a Material's named texture offset property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's texture scale to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The duration of the tween + + + Tweens a Material's named texture scale property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named Vector property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named Vector property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a TrailRenderer's startWidth/endWidth to the given value. + Also stores the TrailRenderer as the tween's target so it can be used for filtered operations + The end startWidth to reachThe end endWidth to reach + The duration of the tween + + + Tweens a TrailRenderer's time to the given value. + Also stores the TrailRenderer as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's X position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Y position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Z position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's X localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Y localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Z localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's rotation to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + Rotation mode + + + Tweens a Transform's rotation to the given value using pure quaternion values. + Also stores the transform as the tween's target so it can be used for filtered operations. + PLEASE NOTE: DORotate, which takes Vector3 values, is the preferred rotation method. + This method was implemented for very special cases, and doesn't support LoopType.Incremental loops + (neither for itself nor if placed inside a LoopType.Incremental Sequence) + + The end value to reachThe duration of the tween + + + Tweens a Transform's localRotation to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + Rotation mode + + + Tweens a Transform's rotation to the given value using pure quaternion values. + Also stores the transform as the tween's target so it can be used for filtered operations. + PLEASE NOTE: DOLocalRotate, which takes Vector3 values, is the preferred rotation method. + This method was implemented for very special cases, and doesn't support LoopType.Incremental loops + (neither for itself nor if placed inside a LoopType.Incremental Sequence) + + The end value to reachThe duration of the tween + + + Tweens a Transform's localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's localScale uniformly to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's X localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's Y localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's Z localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's rotation so that it will look towards the given position. + Also stores the transform as the tween's target so it can be used for filtered operations + The position to look atThe duration of the tween + Eventual axis constraint for the rotation + The vector that defines in which direction up is (default: Vector3.up) + + + Punches a Transform's localPosition towards the given direction and then back to the starting one + as if it was connected to the starting position via an elastic. + The direction and strength of the punch (added to the Transform's current position) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + 1 creates a full oscillation between the punch direction and the opposite direction, + while 0 oscillates only between the punch and the start position + If TRUE the tween will smoothly snap all values to integers + + + Punches a Transform's localScale towards the given size and then back to the starting one + as if it was connected to the starting scale via an elastic. + The punch strength (added to the Transform's current scale) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + 1 creates a full oscillation between the punch scale and the opposite scale, + while 0 oscillates only between the punch scale and the start scale + + + Punches a Transform's localRotation towards the given size and then back to the starting one + as if it was connected to the starting rotation via an elastic. + The punch strength (added to the Transform's current rotation) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. + 1 creates a full oscillation between the punch rotation and the opposite rotation, + while 0 oscillates only between the punch and the start rotation + + + Shakes a Transform's localPosition with the given values. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the tween will smoothly snap all values to integers + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localPosition with the given values. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the tween will smoothly snap all values to integers + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localRotation. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localRotation. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localScale. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localScale. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a Transform's position to the given value, while also applying a jump effect along the Y axis. + Returns a Sequence instead of a Tweener. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reach + Power of the jump (the max height of the jump is represented by this plus the final Y offset) + Total number of jumps + The duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition to the given value, while also applying a jump effect along the Y axis. + Returns a Sequence instead of a Tweener. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reach + Power of the jump (the max height of the jump is represented by this plus the final Y offset) + Total number of jumps + The duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's position through the given path waypoints, using the chosen path algorithm. + Also stores the transform as the tween's target so it can be used for filtered operations + The waypoints to go through + The duration of the tween + The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + The path mode: 3D, side-scroller 2D, top-down 2D + The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + The color of the path (shown when gizmos are active in the Play panel and the tween is running) + + + Tweens a Transform's localPosition through the given path waypoints, using the chosen path algorithm. + Also stores the transform as the tween's target so it can be used for filtered operations + The waypoint to go through + The duration of the tween + The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + The path mode: 3D, side-scroller 2D, top-down 2D + The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + The color of the path (shown when gizmos are active in the Play panel and the tween is running) + + + IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. + Tweens a Transform's position via the given path. + Also stores the transform as the tween's target so it can be used for filtered operations + The path to use + The duration of the tween + The path mode: 3D, side-scroller 2D, top-down 2D + + + IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. + Tweens a Transform's localPosition via the given path. + Also stores the transform as the tween's target so it can be used for filtered operations + The path to use + The duration of the tween + The path mode: 3D, side-scroller 2D, top-down 2D + + + Tweens a Tween's timeScale to the given value. + Also stores the Tween as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's color to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Light as the tween's target so it can be used for filtered operations + The value to tween toThe duration of the tween + + + Tweens a Material's color to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween toThe duration of the tween + + + Tweens a Material's named color property to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween to + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's named color property with the given ID to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween to + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Transform's position BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableMove tweens to work together on the same target, + instead than fight each other as multiple DOMove would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableMove tweens to work together on the same target, + instead than fight each other as multiple DOMove would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + EXPERIMENTAL METHOD - Tweens a Transform's rotation BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableRotate tweens to work together on the same target, + instead than fight each other as multiple DORotate would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + Rotation mode + + + EXPERIMENTAL METHOD - Tweens a Transform's lcoalRotation BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableRotate tweens to work together on the same target, + instead than fight each other as multiple DORotate would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + Rotation mode + + + Punches a Transform's localRotation BY the given value and then back to the starting one + as if it was connected to the starting rotation via an elastic. Does it in a way that allows other + DOBlendableRotate tweens to work together on the same target + The punch strength (added to the Transform's current rotation) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. + 1 creates a full oscillation between the punch rotation and the opposite rotation, + while 0 oscillates only between the punch and the start rotation + + + Tweens a Transform's localScale BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableScale tweens to work together on the same target, + instead than fight each other as multiple DOScale would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + + + + Completes all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + + Completes all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + + Kills all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens killed. + + If TRUE completes the tween before killing it + + + + Kills all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens killed. + + If TRUE completes the tween before killing it + + + + Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens flipped. + + + + + Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens flipped. + + + + + Sends to the given position all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + + Sends to the given position all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + + Pauses all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens paused. + + + + + Pauses all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens paused. + + + + + Plays all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays backwards all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays backwards all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays forward all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays forward all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Restarts all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens restarted. + + + + + Restarts all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens restarted. + + + + + Rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Smoothly rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Smoothly rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + + + + Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + + + + This class serves only as a utility class to store tween settings to apply on multiple tweens. + It is in no way needed otherwise, since you can directly apply tween settings to a tween via chaining + + + + A variable you can eventually Clear and reuse when needed, + to avoid instantiating TweenParams objects + + + Creates a new TweenParams object, which you can use to store tween settings + to pass to multiple tweens via myTween.SetAs(myTweenParms) + + + Clears and resets this TweenParams instance using default values, + so it can be reused without instantiating another one + + + Sets the autoKill behaviour of the tween. + Has no effect if the tween has already started + If TRUE the tween will be automatically killed when complete + + + Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. + The ID to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the target for the tween, which can then be used as a filter with DOTween's static methods. + IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. + When using shorcuts the shortcut target is already assigned as the tween's target, + so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. + The target to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + Loop behaviour type (default: LoopType.Restart) + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + Eventual overshoot or amplitude to use with Back or Elastic easeType (default is 1.70158) + Eventual period to use with Elastic easeType (default is 0) + + + Sets the ease of the tween using an AnimationCurve. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween using a custom ease function. + If applied to Sequences eases the whole sequence animation + + + Sets the recycling behaviour for the tween. + If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. + + + Sets the update type to the one defined in DOTween.defaultUpdateType (UpdateType.Normal unless changed) + and lets you choose if it should be independent from Unity's Time.timeScale + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the type of update (default or independent) for the tween + The type of update (default: UpdateType.Normal) + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the onStart callback for the tween. + Called the first time the tween is set in a playing state, after any eventual delay + + + Sets the onPlay callback for the tween. + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Sets the onRewind callback for the tween. + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Sets the onUpdate callback for the tween. + Called each time the tween updates + + + Sets the onStepComplete callback for the tween. + Called the moment the tween completes one loop cycle, even when going backwards + + + Sets the onComplete callback for the tween. + Called the moment the tween reaches its final forward position, loops included + + + Sets the onKill callback for the tween. + Called the moment the tween is killed + + + Sets the onWaypointChange callback for the tween. + Called when a path tween reaches a new waypoint + + + Sets a delayed startup for the tween. + Has no effect on Sequences or if the tween has already started + + + If isRelative is TRUE sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + + Methods that extend Tween objects and allow to set their parameters + + + + Sets the autoKill behaviour of the tween to TRUE. + Has no effect if the tween has already started or if it's added to a Sequence + + + Sets the autoKill behaviour of the tween. + Has no effect if the tween has already started or if it's added to a Sequence + If TRUE the tween will be automatically killed when complete + + + Sets an ID for the tween (), which can then be used as a filter with DOTween's static methods. + The ID to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets a string ID for the tween (), which can then be used as a filter with DOTween's static methods. + Filtering via string is 2X faster than using an object as an ID (using the alternate obejct overload) + The string ID to assign to this tween. + + + Sets an int ID for the tween (), which can then be used as a filter with DOTween's static methods. + Filtering via int is 4X faster than via object, 2X faster than via string (using the alternate object/string overloads) + The int ID to assign to this tween. + + + Allows to link this tween to a GameObject + so that it will be automatically killed when the GameObject is destroyed. + Has no effect if the tween is added to a Sequence + The link target (unrelated to the target set via SetTarget) + + + Allows to link this tween to a GameObject and assign a behaviour depending on it. + This will also automatically kill the tween when the GameObject is destroyed. + Has no effect if the tween is added to a Sequence + The link target (unrelated to the target set via SetTarget) + The behaviour to use ( is always evaluated even if you choose another one) + + + Sets the target for the tween, which can then be used as a filter with DOTween's static methods. + IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. + When using shorcuts the shortcut target is already assigned as the tween's target, + so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. + The target to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + Loop behaviour type (default: LoopType.Restart) + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + + Eventual overshoot to use with Back or Flash ease (default is 1.70158 - 1 for Flash). + In case of Flash ease it must be an intenger and sets the total number of flashes that will happen. + Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. + + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + Eventual amplitude to use with Elastic easeType or overshoot to use with Flash easeType (default is 1.70158 - 1 for Flash). + In case of Flash ease it must be an integer and sets the total number of flashes that will happen. + Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. + + Eventual period to use with Elastic or Flash easeType (default is 0). + In case of Flash ease it indicates the power in time of the ease, and must be between -1 and 1. + 0 is balanced, 1 weakens the ease with time, -1 starts the ease weakened and gives it power towards the end. + + + + Sets the ease of the tween using an AnimationCurve. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween using a custom ease function (which must return a value between 0 and 1). + If applied to Sequences eases the whole sequence animation + + + Allows the tween to be recycled after being killed. + + + Sets the recycling behaviour for the tween. + If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. + + + Sets the update type to UpdateType.Normal and lets you choose if it should be independent from Unity's Time.timeScale + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the type of update for the tween + The type of update (defalt: UpdateType.Normal) + + + Sets the type of update for the tween and lets you choose if it should be independent from Unity's Time.timeScale + The type of update + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the onStart callback for the tween, clearing any previous onStart callback that was set. + Called the first time the tween is set in a playing state, after any eventual delay + + + Sets the onPlay callback for the tween, clearing any previous onPlay callback that was set. + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Sets the onPause callback for the tween, clearing any previous onPause callback that was set. + Called when the tween state changes from playing to paused. + If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. + + + Sets the onRewind callback for the tween, clearing any previous onRewind callback that was set. + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Sets the onUpdate callback for the tween, clearing any previous onUpdate callback that was set. + Called each time the tween updates + + + Sets the onStepComplete callback for the tween, clearing any previous onStepComplete callback that was set. + Called the moment the tween completes one loop cycle, even when going backwards + + + Sets the onComplete callback for the tween, clearing any previous onComplete callback that was set. + Called the moment the tween reaches its final forward position, loops included + + + Sets the onKill callback for the tween, clearing any previous onKill callback that was set. + Called the moment the tween is killed + + + Sets the onWaypointChange callback for the tween, clearing any previous onWaypointChange callback that was set. + Called when a path tween's current waypoint changes + + + Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given one. + Doesn't copy specific SetOptions settings: those will need to be applied manually each time. + Has no effect if the tween has already started. + NOTE: the tween's target will not be changed + Tween from which to copy the parameters + + + Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given TweenParams. + Has no effect if the tween has already started. + TweenParams from which to copy the parameters + + + Adds the given tween to the end of the Sequence. + Has no effect if the Sequence has already started + The tween to append + + + Adds the given tween to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The tween to prepend + + + Inserts the given tween at the same time position of the last tween, callback or intervale added to the Sequence. + Note that, in case of a Join after an interval, the insertion time will be the time where the interval starts, not where it finishes. + Has no effect if the Sequence has already started + + + Inserts the given tween at the given time position in the Sequence, + automatically adding an interval if needed. + Has no effect if the Sequence has already started + The time position where the tween will be placed + The tween to insert + + + Adds the given interval to the end of the Sequence. + Has no effect if the Sequence has already started + The interval duration + + + Adds the given interval to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The interval duration + + + Adds the given callback to the end of the Sequence. + Has no effect if the Sequence has already started + The callback to append + + + Adds the given callback to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The callback to prepend + + + Inserts the given callback at the given time position in the Sequence, + automatically adding an interval if needed. + Has no effect if the Sequence has already started + The time position where the callback will be placed + The callback to insert + + + Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue + then immediately sends the target to the previously set endValue. + + + Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue + then immediately sends the target to the previously set endValue. + If TRUE the FROM value will be calculated as relative to the current one + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Value to start from + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Alpha value to start from (in case of Fade tweens) + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + + + Sets a delayed startup for the tween. + In case of Sequences behaves the same as , + which means the delay will repeat in case of loops (while with tweens it's ignored after the first loop cycle). + Has no effect if the tween has already started + + + EXPERIMENTAL: implemented in v1.2.340. + Sets a delayed startup for the tween with options to choose how the delay is applied in case of Sequences. + Has no effect if the tween has already started + Only used by types: If FALSE sets the delay as a one-time occurrence + (defaults to this for types), + otherwise as a Sequence interval which will repeat at the beginning of every loop cycle + + + Sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isRelative is TRUE sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + Options for float tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector2 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector2 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Quaternion tweens + If TRUE (default) the rotation will take the shortest route, and will not rotate more than 360°. + If FALSE the rotation will be fully accounted. Is always FALSE if the tween is set as relative + + + Options for Color tweens + If TRUE only the alpha value of the color will be tweened + + + Options for Vector4 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + If TRUE, rich text will be interpreted correctly while animated, + otherwise all tags will be considered as normal text + The type of scramble to use, if any + A string containing the characters to use for scrambling. + Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + Leave it to NULL to use default ones + + + Options for Vector3Array tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3Array tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Path tweens (created via the DOPath shortcut) + The eventual movement axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + The eventual rotation axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + + + Options for Path tweens (created via the DOPath shortcut) + If TRUE the path will be automatically closed + The eventual movement axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + The eventual rotation axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards the given position. + Must be chained directly to the tween creation method or to a SetOptions + The position to look at + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards the given position with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The position to look at + If TRUE doesn't rotate the target along the Z axis + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards another transform. + Must be chained directly to the tween creation method or to a SetOptions + The transform to look at + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards another transform with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The transform to look at + If TRUE doesn't rotate the target along the Z axis + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target to the path, with the given lookAhead. + Must be chained directly to the tween creation method or to a SetOptions + The percentage of lookAhead to use (0 to 1) + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the path with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The percentage of lookAhead to use (0 to 1) + If TRUE doesn't rotate the target along the Z axis + + + + Types of log behaviours + + + + Log only warnings and errors + + + Log warnings, errors and additional infos + + + Log only errors + + + + Indicates either a Tweener or a Sequence + + + + TimeScale for the tween + + + If TRUE the tween wil go backwards + + + Object ID (usable for filtering with DOTween static methods). Can be anything except a string or an int + (use or for those) + + + String ID (usable for filtering with DOTween static methods). 2X faster than using an object id + + + Int ID (usable for filtering with DOTween static methods). 4X faster than using an object id, 2X faster than using a string id. + Default is -999 so avoid using an ID like that or it will capture all unset intIds + + + Tween target (usable for filtering with DOTween static methods). Automatically set by tween creation shortcuts + + + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Called when the tween state changes from playing to paused. + If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. + + + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Called each time the tween updates + + + Called the moment the tween completes one loop cycle + + + Called the moment the tween reaches completion (loops included) + + + Called the moment the tween is killed + + + Called when a path tween's current waypoint changes + + + Tweeners-only (ignored by Sequences), returns TRUE if the tween was set as relative + + + + Set by SetTarget if DOTween's Debug Mode is on (see DOTween Utility Panel -> "Store GameObject's ID" debug option + + + + FALSE when tween is (or should be) despawned - set only by TweenManager + + + Gets and sets the time position (loops included, delays excluded) of the tween + + + Returns TRUE if the tween is set to loop (either a set number of times or infinitely) + + + TRUE after the tween was set in a play state at least once, AFTER any delay is elapsed + + + Time position within a single loop cycle + + + + Animates a single value + + + + Changes the start value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + If bigger than 0 applies it as the new tween duration + + + Changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If bigger than 0 applies it as the new tween duration + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + Changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + Changes the start and end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + The new end value + If bigger than 0 applies it as the new tween duration + + + + Used internally + + + + + Update type + + + + Updates every frame during Update calls + + + Updates every frame during LateUpdate calls + + + Updates using FixedUpdate calls + + + Updates using manual update calls + + + diff --git a/Assets/Cyp/DOTween/DOTween.XML.meta b/Assets/Cyp/DOTween/DOTween.XML.meta new file mode 100644 index 00000000..e9c32ece --- /dev/null +++ b/Assets/Cyp/DOTween/DOTween.XML.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d177da701c512db4fbea5774b852fb8d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/DOTween.dll b/Assets/Cyp/DOTween/DOTween.dll new file mode 100644 index 0000000000000000000000000000000000000000..6ad855fc1e6c6dd1f3c53247bf0bd481083f3261 GIT binary patch literal 162304 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

Z|x4|T@p>5ag)-cF10J$*i3(wWZ} zO(v+FVfg-p4Bf_08Pw&W&iK6Y64);9ndD`f-V+&@rl)%>p=Q!)HJMgO0RLJ*9hVL)PaIZJX%v0J(rx>3`9Agf& zMcN6m!j-W;jCKMW3To4a&VP`O+xSlgb$O^WK2L81w)M6n#`eiAwuy)>>9p9k`~%i? zg4(%;?|+fuUhljZq4QgWTJjUCMJTfKwWM=_q4P`9aT~v4P?v`~XeFthgR#0}B=LbaTCVAyA2V^C0=F|>ZK zv}!S0SGQ;(pJmC9>=t&F^gtp!TWB-y9NI^a_BDp~AC&epVzi$b(H5#Y_>0pXifA+M z9NH74eXXJWN2UF&813siXe)y_?G+Ji=55hd{ca-dx}p6irM){wyAjcbkLl1aaa*)h zzwlW>t!ZfeS!rD#qcz*2bpZV`?;P6LxE9o&ZD{{RX+I}M`?(SA1L>D}=g>Ziw4Y~a z|5a%}KSuk84%++CFY~r&yVi*?qN7Rs1%~!srTs$EJ5Qa$ix|hCojx4n0y+g^g&6OZ zR*&qyfX%G&8%#%~Z6z#@;m}rt+KUa%M~QtU#v^E~FNqO;X^b!ieI*bURCE;dHf&#% z5A=fCjfNIZ8?nvb6eIJp7#SlUvGyz9Hqv~#q1i=jBi}1xg#Rf<*vKcSG5OdB9z$9; z8(Ox?_s`5~+W#vVkGFrXPAuALYaVwz=p0KruQGHTU@Yx&9EU3B?ETd-inl}*ePi)n zo%n`g0$1L+xC zeqO$N5s*Z3&h@k3wzi25;wdMAZ*Wc!;28XR&n%F>BjHaB6`<)7D!u< zBi}a}zDbbOHR9OZ`X?Q8&^J>KV?Y1GxY`fq)_i@9zJoMmR)~4xli~5D?RgfaAly?K z)ZSuvr554^PZXQSzct3|u7!A!hVWvWR30aj$J-2#^g=v_+&GW7$9TMBAs(dB;*qqT zhH`8tk9Qg#8KkS7#&p)X9`Ua+9`EYlk;fq!U5_A{*krn;JkH;r3Z9QA&vzT1*#q-@ zPmJe#J9vU621%$XQdx*4beWWOms7~|Zo{*CA)Y69*v9)}Jn!k?*pp{~1N z!7`}5-|)&EnAZnlygt~$tF=BsDsfg)t}1kiDRxl%km0qY&Fc`^Zt+r7Z&!FRT8i1u zl%9Eihsk_6#`+^2tlPyT)j7PioS4!FwT~L!J#F6YwX9BN_r{pr*TJk+PEwi2>xEqw z$8ACFV}@4%ES#6iBS;k1IE5aE8zn5Ov6Kmj&feGPV>I9BWguI@8~u#JJ%2nV#wQ{% zB)|F#anCt7F)+Prhm3WGARY&N%h^qoxRy{tVj+Y(D1qK5Nh1L>3^ArHH40=?7iN3C zPsMnBI^yN+rsQ&FO4!Pe;VKLV48wvlJeq^ez20YHv_2crY7;P2F#t`+X|3p_wN(bL zlrhvObs1s+UTR|g;qnk$X|-3ELhSWEM>bM4%pD15vBb`+s1q!k2DQ%vg=^shNI{(} zM-bJCS0}Lg6iB4!zz!k~Bu4cNF`94SRdiH6%NVW8?_Tc4qAVM?U)*%lIGL^YWo3F7u93>Ox05}>>GSJH-H7=p!QYZ zQ1>g4lvAxI!Vjsnd@UyF*CR<24v#z5F2XQT`nZx;XI}bkbh?+IqHvz|2im9l*3;3X z&^-pVe=~fB7vS@a7@r6C!-sk2^HHXS#(yZ!gzSSxHyqTyX?U(=K2xS|#dv)?;)MY- zdTW$KFxw?bXhBd0j@7W9$^Sv^JBIGTF}nXAqx;=?bOm!R-44Nphprc6tu&~8&+u3U z9;nKPNYc!Azt4E*e3w|U`EEka0AP#})E+i;4h07GDKn^|15I;DEZx(kPOojr5|dNM zjYE|456BH&1jn{NWE?J=GYq&e={cb_5|t%3+LrRhQfE;6k>R~sc{8YDz_1A3Bg*^7 zG2V|X%$r1Gyx#~tVu>NB{lxGNNy%*-&Y&(2b;jqdwGe35TA-#FA}n|j0v|^Dd%d5= z1pZk|U|l=rFaydWX%(2dqP$oJ32Hw#@|H-*ZIl_*<)O~_yfqpE%^D5ljUnz_l)OdK z-|PJ%ChvbNEH6n%^12)=SXhG!YX52E9VH>zs@bS0&Ho}DGbH{c#_>7 zhA=oDq~aWsw6UfY)P7}XuWi#_qqKh=qy69eqs^>w+K|D*I#W>lA47XgXkQ9tHP$KZ z-;kb}Ui_Bv*z|(umr-}jBy)^tcJUkaIj%+e$Q#stXXvkQ(;rv*{~M$K`-SN<(?aw; z8D~SDp!Nqte5scWy!Ofuoc(KRQ;`V()ZaKd95!L~arYIw!fJW;vT zKrm&M6ifjn#1uwC48OhNM%n2(dtV4Iq=e9mNis?#A-pH|@yW4CJM__$={xh3^;MMT zLX^k0`$p1@-KaXRQOB>{T!!C9L!xktZllSl{`Fyx9;|2!JmH2JEfYE&8g#uYY$cq>)G+r!_VM1QQsCeJTOBu~KZq(o=27Qf}F=zt8 zZM*)eA`Qko@U9kRgw~g3kYzHEO zv_;#3vgHrRA^>nM2TsKo5lTrsUxDXcDhzHeFsYOZsg6k%`Hb+z8|>i`r8e&fq!tfn zaa$M$!lH@#if6{F$CTDpEzU(lo|u)EFyPW2|b8N&N{G zsSk-sl}JqLvN&4vU|+M>Aye@SdZMm86gyc5<;oen`bU9Lwxbhs1>HmXSh6@K%c~3* zL)dJniU>Q6TSWc?VcohYtlI>OzS-g0nc9Ptr+i4fka<(c4+0-YNc+Mn?W$E;XL;@Y z7%YY##}Bs@|K0T51?X{Xb`jgQ$~RX%yad53AMRW;ipgwRkvzS?sFHN#GM$p=Rj*_- zxSPcmGEU<)Mg<}>3{CzFkNsBk+%{+Ey}dZ zfCHrPMp1K*iW_A_zGh+dc9Jkz_U{r3x|O}Se=Nsf-KEm)L;KR3I^l<o<(83eo}uP!H@BEUNc;Ew{-ryge>h~2+#M4t@oZEaj8@7wRokId{}Sh0s;3!o3c5 z+{$qpO?Tw%hn(Xu06DD@_cU@+Lw$weL024e#Eu-?Q0K<^fn#9~Ab(17F#{i`&cT{f zZ{oMZ8aQU{um+CdI;>%qfVee0n}9v|iAwYw0^-)d@m+^CaG2L&4IJ%tSOW)r9oE3H zXNNU#;MZXd9LjfC!;1-Mcl1u3m?VCAbS^j8j8Eo=>Sj$_3docc|ORz^*h z4QPXf@ti*CnWd5$>dDfs7);3wvNUgp4RMmvVMCm%bl4Cl1jdGbVV8UKL;!BGXpNAa za*re3c{%CmVMh)m9X)j-=lgKg#Md56*6^P&_Cuz}$nRN@G~)N*g8bZak84DA+oEFJ zakDaPE|?2*-+w+p`YSd4t_AbsmZ+FQ;CflMH}4Nsj36|auUZh(6`~N`V4;1-=78c5 zaIi!|EwSkwq}nQG7*hW{R3?N3vCw!ko;6dx`fN_bZLIq{7N(u@r%8V!U8l07gLKJA zq(C{w1|Jx){e+Eirb>=8Se%XVK7^LMMpW#Hu3m*HfXJC>pS@p9UQu%U$B{Ku(3??u z4=qjr$I%!2iE1s919upA>T41GvL5Xi?^9)5(}(jfSaD$ulvXLsiTMj>u9qn491YXB zcs(te@7}Jm<5mtmFr(7a`2w1IWKQYiy1gm8V2Gt{>&zZ+ps#*u8}lHM#6V2m}WC= zH}Twt;?1RT_M$EJK1a6?}ZNIuE8tfszoeq$T1i_Ov}9 z%f0jvF(SxMI;$f(aio3H+KyYQKs((BFKdJ`bXxL62>Ya=ehH%&`CCvUKSar$!qf>4 zP*&i75B}TuU)p5L%SpHK6JX#hygVfuKjqUwId@gz{a>BHsXhihumb87FEW2dMaD9k z1i$f1Ch$#Y_%!IXwXU_a%d(zA-L@(ir*9!wf_3QGQ{G4Lm~itAOe_3A$&f@GdzW_ z2Y|yX`FKur=o_c$IIb?>@Eg^Ex8RH`qU6h5xM#R$2JdOA_?D3oV&|dAX|sPao3!A7NnI`H@U` zCD8ba;$DD!x!6JyvW-swklZ!WEz5_gaE9cVqwy)h{3J=J2%lzDFJZ9z8=u8faY#}y z96)>bt?g)2Po*yPcq>l+KLgY%JO*9GUJkEvQlfH#U8qtPJqKCF6$Ub;*Ynp=_r>$w z)D@E%n&a8AWVxLO)lKO$xI=y#I6PIJz%hPAN^1@JTHs*N$aJ4@9QW4w z(h{E;a6Wtu4vAla%LW`dGpq9I#ARd7oT}H;v`56t0%ee9el3Vo)^aCqMyp3j)>&V; zut37{5$04g-e^fqPWp*ZT48j6F|ufK6>V%Uu0k+3Q~b@hiuHQQ%E{)!fR#oUqo_qT z%l^@_LiBNLMU3|bb32)-wbp$}a=~z~Z+o~9A@CA`UwtNwhxaDv!P#<<7#Ky>vZb}G zxvWYUZzat?N~v2UqG<;UMvQ1AXfY@Z-oONY@_* zx&z_e7jXTt4$! zuajZ;qJ6MRnamx$Qa#ps^137LRQnqrrXo80iydAEiQ(=Gjn9jg>Zl1_TS5;Ze>kh3 zMmNhhmgy3%HeiU)M{qY@Nq`2FovHYE_k9C3!24sc=8}frz{*J4PViMKsFMi193Yivs-Zj)jhyO0z|vN+l9R5!3_pA)n||nwc6HXF znz;Q)b?Wt5VmX76q&p3ueIw`0WRW-@lz%n`=dLCq+7ye&MJmTkRJ%I zg-u~X4?b*bzef0U>ex}E$m<+VvTlMQ;G&4REEAj1@+{T)1^ZRdL+3?0Uo{gZJ9Qpw zv#NP>X{%H~K`Njx^Uyi_rT;e<-Y=>jn6QSQWF5n{N!?$IV(nCW6WwE2kd_gOr%Ew( z;i{%oy9cO}glHXAk}$Vh(UA95CCe}$yAm>7N*P4$X%8cJm$iWZhvI)P{%^ql(((2+ zYfytB)||b{5pZ%x+1CsaFhRg-07?e1iGY3ph74dc0WJWkLgt|aQLRWHDF03?kr#dF zc?s}>32Yk2N zKE+cp5{u>KQ#_TX)27TPlS&I}^A&rF@s-pTUrCMemDCnrNsaN9)D~Y!jrd}EZmcxt zN;8YhDd)HCDN=*U6t{k$wdet@6-Su_EtfFlv5)OelogGEZDEULS(i&Y$8b^F`5O^d z--I7d9kF>I!5UPV6?(b{Zipu$)y zzsR5u-d}sTYi5FR~2?WmYd6;{jR#a8(nirMtA8T1Qt%9l@5-9oCh} z%^<2P=9ao5F<0rZu7s=5o)ihBuG+vUF3@OQaR4Lj=^67I6xXM|qE)rH_H@N#t*a{* zTUSDvbrpUXlIM~V9I(zpSXw&#D1R`{ONaO2N0o%?`xqYdJirjjh;d$kL$cg>`*9?2 z6%Acm+T(hK)=k3N2E41Jo|(jtBlxfS;tGMDzOXF8Tu107j*PDfthtbL7Q__?tBx(zv> zSK0Tba`OGvP#sS@joWZ^8Go@TEGe>j#OA zUNSYAEv18OCWlXdWlQ+XmwxOkaPc{{Sih5;Kkn-FociyfgR$wc*b`JuWb-WwdW_XEi29C^ ztLQ;IX&ujI)HsX>>33Y~K3L~7ga^jN?$x6}sD24FF%7+hq<;u#VSI&o`VSgppbuX4 zejqgd6ClHMHQqCqyD{3NPz{zbE^J2O*`yH{AF{(zJzAuv5Opzr_z0))sRFKMl`r2J z&X17uDTjlgt}oK%8ATD*~@Mjx(BjeR%p%Kg9-CyLx{ z9Nfj(SP2P1w^5YPYm^wqN@b!yLIM5iQ)nZid9RA$Lb~xQs@DJ>06-dEUerrm9Z^ zQNCqy>u{Uyk@un@XtdV@RNhy)^)~^y=?#*^{Jp-buR1nrnG53;C0s#I^$8&GgARrj zSSkb@_3bIYQCdDMz?u|Z8uTl1H%RhiQE9cgR~4UREKIHa5x#ipp=(IB(NYF2MKC_N z>5e@TQE)X$#wqurZ@yOQWKLTPFGbCw-zkh|(UY*st6v2~bw)jycifl~^3n=^Ow^h< z8`Kg`{U^Y#J%^?;2DR(6SN$3Q;irYhFM&`&MSUGl<{AunQ=6IS1qG-6Q>2^EJKIW< z5TOvK+X60<_&qknljd33=G1=%lJdHJ!+0){5D$>39}a^5=kw=h$S-Bo1j^%X&PzHiWsqBa@ZpxzzYRlI14$- zkkCXccu&RJ#@i|*vgR4kJR+Vr)~u=*;|=kU%bYshqG}Z$QJ#|3e*<;Q*ME$pO=yhJ zJ);BX4~##~OIE*uR1OdzINlLUH-|3X7KBl@fsq8r3@NlPaOvDxEuNXhp6zJeM=W?$;@yuVk`XGL~OIi8g zt$A7s*F+B`9Ml06#@E0ETUNQopJjeJQK#IEla~a4#OZv}$2axN$-$hvc9)22x z==u+8oe!QY@HQSITmV=Lg_CYC)-okiT8cY{b~74Z?EF5S{p!Q`m9YUlhVa!j*cMOD zZDX7m#VO8Z2xQHOL=)xpT!U@#Ef2e&_&ess}}+TWd*+TvKJnMb0vI@seFF0J*#ib$sA8)yg!MOu33FE1ry) z#m+quj1dESeFS5~z+Mx<7$Hm+ETuj%f~UPe_gI8vGS(jrR%_`|5Mg>hL^4dTwf0yS z+xroqv^})`bQP{8%?)DhwGuvHtpr^KY7dSazl>MmQzJV@KWCAau9dXt(4I_g2GLpx zbIV!@iMdLLYbC-}Xitg+vR2XtPH~Ttu9YkWzbyFeYwhuaNatTPep$J{wa3^}$>|+a z(PI~0dR**E3F$uOMXjBx4%8LAN2{)&C~LRW6n;@ z_}@`9sXi`}gS<*ZPBMnkl96eSCtqAwdF%f}2nQ``Ay|dzC^gsePJ_4&wW&2Rp(0we zt(fqP!dHC?f%qy?OklDh4BQy)RoHe$eaRai(V22*PLU~UAMb+iX;SBHoo>DaFjed3 zX+}i?OcL1vN~f|Bd+TD4=gMqbC!Dc#cF*#7uJ+VX7kl?{n*WG)I-@$O(-B!lC-cZ{ zS!+}Ja7oG2NS6Ka`r|f^EbZz*6JE)w5|i&fE;)6Hh~>)^zeR~c2_;54C>e3da6Tm_ z`cVN?Cdw?780ny73brsMCOUrOw+M>Iu{A1PMOt(p66bM% zE(9YAw&(8Dz*J$wby#<0!^5=N6@hD4cX^Bo&{~`cl zja2{IPGoelx;K{iXgiV7$*R>wQkt_%;uNCF=wuZ;(~*e1@dl;pA}Zso2aU`*chd(D zm8C-!*$AdWdL8nSvdZU)l#yr(r#xOYE|tP5iWd{eolhDd7Bx;4pt%GAnoA4s-&u6& zvsp}6OL(0ta=Sv+6+*7$ttF@c6qtS-Yf$p1H4)Vc>FuM`s^@(a-6Sqtev{a)6_vr0 zyQL@u9EjALT1HETDFarU5HO<=n9O2)BQV*-I8I5a8?;}k`y;^b*|6(`lw?=@6=_1W zv@4^twe^mFNyhW0eV=c(a7{!SFM#N~d<*x%$anIZm|3}aLruBGiX#BU6w8eOlvS)X z0#Hh^P~-fzK_-lg(A{BPKX+R~MsjH#<&weT(`YJ0CSz|BHikAcE0$@eTvVNg~eye!s0VU#Xo@4#!9uwA}YjN zO${+{*VXKunn*1&QNp>2R3sB6oSR5pGEu^IqL`pIPB>ZIXp_dpBS{3aG$0*UWzZi! zhyJ#nLITJAX@pgP(+xu4N3#g%M|U$a5_S{1n`siA408g|#3k)SMkm9bSYpslWOOpb zp$CxCoW1QtMkhnO>p+8IB4(J^qWE<Shc;PjH z@*tsI@Fn&F^a-3to4|Q=37kh0ew*4%l&hSx|DS4fj_()ii7bgS?L&!b8~aeCNnBW& zCb6y1`M$qx!UmZYIb|%HYL0P_z+@KV8-d9t#&N1v0H85|AMyReFd)uPF%%^M1k8{g znTDJ1^zoi`kn!=+;PhGhbk0kB)!>q(XwS#DQKcymPVoU}AaJ$@!i9ZO0)ewZ5Kei3 z&p_a86UHgOeXdh}&EMyg=ZKx$hu8vNKx~08Ahy6&>;pODITD}_7SbER3-Bj+0rmu| zBT*-{#9!jib5a6iokXrj=>wDX5&@MufUJ!ONZPWEnT~5(c%2spu(bmGLc13ZzU?o7#{|Ua_xcb?NlwkchVk1Ie=|)(SEe2#z!dQ zcx??*b4MtTVXM==xaE>4%z@Sur`0@KH1GjZ%B=Mu@kx!tU{UUFzOUqYjBb`z-{5}iM# zWi8m@gz=|@g>Yg;L>v$)Bd;&njI~Q{!k8n1G49my;uGC8UVBFN`Z-e;UAu0TgZ3Je zo>8m^u_Uq{L=h63UM99UuP_IdHpVo96(%=Uri11twTou6TNP@5N2$0nPH9z5s(U`G zt-D-IDm65^ed5JX8CKKTDqsUxO{Yy`nS}w|y%?#?^WAdaLI%uDzGA3`NOq|WBGfR5 zFdz}pJr@f|#8!CR;`!=Zh~SL@8Ou6~k$@YonO|Ur;5kO3;u35Q5>X>+%p^c!MnJ}; zTM-`c5^DjFF$;XH^#bt`>j0vU7(-Yc#}D7hw|xX3yl_3?IMoQdB>)ZK8Eqdiv^EVt z5x`FzT-uRbF}fx>+%vkRbUNJw^YD9`X?_YkT{^A>JAyF&l-9IhI1-xXFbS!WcU8xUh z>4`olrX5D%gQzL-L6kMI3Bv{ShYKnzEIkv-I-1IQV(GG21&B*(>+FehliI4An48qr zARJjsQX$w@q&PAW>Hk27ba+&aR-PIXpP^i?*J5&M{9Q{&X>Vw4H+6vowYfQjj^Re- znrw_3ue)H5cs4OBZ3v7`#d&CRGP>DRV+z&rCfA|j~p&T%5$OC5M!);)+YAQ7>O z$i+MIUGWwXK~1DOi1fNkvA8FW2UKVgq#{P5RQi`<7tcJ$gpDSy(m}Vt66!L%W@lGH zfprP69Kmqb}tv={@G^QGj#xB0!Ril*PCJNiza6E}f645S`C40H{y3 zExc2(UL^g`v4FDwISygFX7!MYTdXiz&R$}i*9$KfZ+zt-f3PwtQ9r3c=Po=H3~ zGs*0QG+fOdy@L?m`VQhGr1BjE*(z7@O|E>42W+^G%(Mm(9k~X^sgw51g=y=`nXB*< zo{UGi45neBuaA(JVL>D;$hkdFNW@# z-$0hU{8qP9fXCx!b)tMtG)TK_U$Y>&m0;ZyBr6u0PhmdnuPpT{B&iU5<6d@AVUOBR zmCI_X)|dD^zNQ4&7cPom5vU7Pp_D9z^~*Z4M@7r{i=O}N%qIPHuAeP=$^05SpG}m{ z>yX^3V`bMZmvad_m(1e~02zk(I*aEgr*Od)KG))f_!@{O_xY+F%*Tx-{w)MOf6D95 zuUnej!nh=u*rGnRCmcuC8xUQ3bs1wuUVD!)~vvo(Fj~|QY8l)%VXlN#=0`= zI3^n36P$;>;3cSke6zk!(s@7G6Ih4xRBS%TJf{MXPdlP?Z1T%;L7R@ z0Psb1P)viv6A{eR*ecFK3|nZu>e+~F`fr%JxA_kI2JYrpvt6}VW24#d#p8VgH)0z= z*GPW&klRNJ!x!IYEsF|kNvc+h}9-U5?n3;d}Tm_iJv z4fZEmU`i#@$W2@#u*Qh5F``HeB4K>$ihsTd<+t^y(2(uloW<_Gr$DG~+qY9U-)^Up zx0{ncKh$-w?Z}I@hrr3N#g&ZMH=1t#JLqOg$-L&w_yQRHwLi-Q?8P7Oy)iqF8*TiX z)ow^pY{wbZ~r zR>ry;6HG5ncg#m#Ag5z;NABt-A6+AC@!)*NP-YOV5i)n8e8_x8X*c50CD&o{9gXJbQOc z(g}%(%LEhjbc0efGUSF5!bmEDF-{n%L@>sk`jwz(&M#>@fS#q?Iv;P9nf4hgDWmZ{ zViYT}=@ZDiK*0}2!6!;*#55>#W(un1$4tA$NayEFqR=JGv^$g9+K`#HX!#$k2+pdd zibdP9e@UtwYdZ<+BPgS;A+{=*Ylz*LPjAFj`uqtj{BR0Q0#e1X+K$hKLl*HWAhl-C zl7oddIT$t5;JL`Fzyq3=98!;JQH)N>U8aVz8lzf`Y?4(AD|aR@IwZ2wat$a^Yog`eB%*<<-CDh2#HJeeoBa# zv)=lc*V_}rOCgzDVF+UAig;t-e=^87{!0UFJOwF1`xT=~d_G=?QXGRD( zmP3AQHZdyTWYd$mYjF$GZ9F2N(*hCp#W#S)&D0-vo4eOkFiyv9Ox#hM@neTIGWPBZ z0IRbQTxw5asl6|?Vsr&xAZhtop{1ediM3kFMo+9x-;iM8<$wnlOk@*p)=tWvU0kOn zcQ#!Cnf_U1s-dR!lp`7|=Z`OMW?%r7 zbghKa%`z^4?8I|GD2{x%|G-%h9pqZ7x$eO(-dV;4kexV1axHJMnD8HHKP;JfCFef8 zr)}a8AU3;|$ahJEaRFo}d?9jBi^%dOHttZyF3QNb0J0MgaeDi}<6?-eBCaAL<4yi# zC*CKBeKEwGB7T9a8E^6@JMmIM+#W;p6!GgsWW33r>;z^kV2xcNMwiQ*Sw&2fHRA%v zPT*Ao5D$(aE>Xl^ks{+w{$wWtL0lC>#MT0q`Vk^B-sDeq;%6{9?}2k-h`u8JfryMZ z`IDWvPY_RtA%X`f;w!A)EaOf7WG7%Spy=ZED>aP4X0Iat6Dcw-fNbeX?|~<^$PG4= ziuFcfF)n~?X}kBpWDF~%SnnVf<4yi#ONV+7Otr8I&4gmThFFXXAe$`v$!m^+-4*+E z-US<^pO4#jv!7XW!+kX@f23#mgp~^h-qJ4KDVZ+&{x#6ovSJ8QCApwJqX>TWSx7gj zy=%MV`{Q6?^@;iPNtO4BQv0NceNu!zvBExSFMU$mePY0UVoQBet$k8weWK?+X(N5A zN=jBv3;*hM;Es0dSsz60--2=_%Ge!VVu74I79KFKlo#fF#9EC>E4!RJdV~Jtn2$B7 z!E?)*_F?CufOg;(2szE%jTM-w8;?cZHVy^ZRNjr9M=r>bYaIA03daFlsXE!~l}^Hu zRUCCR#~NdfMqZp_i3o}2oFrm$Ub1!uZ0e0Ey1dZa1k%P2HTEjFkr;W;Bmd zV$a1Ifg*Bu@$A+VjwGj2(>NUo;pK`91UM- zI*s$JEpU*5_F7L`j)e7El;bv(1DT*J;p^_&k#TRNx6NwMt)m@NrK<7j*-%EWi{tvG z<8Y3C*L1IE2Uve#^+I2)6h-kpREQfkAl+m-@OybC9@XUSNip>HL<`gCn8)tHn}QJ% zNOBL03xf&~NdNm2h=r*mV7Mm?H!2HI{ZQQo2{c{g%9GCYno zM9Eli3(^$kB$m#Kaxa+dM&2spx5?8L;2bW+Dfmgz&>X4`>~?{+KNWBL)2+6ju;4_k z+ZWmPljTgy-b&rM4u|GOjv>)*`d)HiQhdr<;gaQ~HSh7QF%E__OGcOocd3%I&txjqHS zTbv^>P$*2{Cxcf(aIU=TDmnIjMeuIvcF?i9dT&bLPWL8U9ogWD5#Myb3167u0tg=_ zE^R2$9!tRIxorQ|>mZ+q2d}5SQpVSQQ=fI1gIS+f3Ke1oQ6nko4|>@*PNutY14ZEP ziTVY9?CVOUb$J!bHxMLHj9d5)7uS;n32(=qsBHe&kJ|kvyAKCfrBF3dAK#!c;14(c zQ-|!zX1B(E#>dCE>gV9cnarC@(&%6g=0l=E&$z@5o9MuC?>b`FBi0a1w-8oFPDZG__DnR(?vf$yf7BmK+v;9ju6aS}o1HT^S zvGsZs+c9gg$8lapL!aGx4BiD}2rPr3X>rt+UQ>}3Lt~4EFGV>yFuG}{T%&}0ljSk+ zZt*sTwzLYwaYsIp5W@}uFTd{4=(#X;OSY76;bkJj3ld}Z__zZtaFbIzQvMWPvUI6b z8+m$ob}K$Fy+qq1zM(=vkghi7$Q{pjn)W)o^@vQQy~30!p*+O%1CJ) zF3e{fCZ0*+qNni`zA~09q9J3RGq%L{Hnsr-W7?A%`(hq#(UEV; zND@%=oaqcEQZjy`(F~{Ly}oPX!vS(d3|^OGG}^9uf8F=EHbmN(;975t(H>4ugFGgX z@(}`tH|@lLZZv1(S2#2X#EpO}{axO!9a!g59;gl`_$gtdFB#W;SH@3I0FO6;hc=+X z{08)FG@#X3<5RnmFPpP!xzUB~+>=2g(#ZfzePWrQ$u@-5D(lT6e;J8od={aC&>4qr z2*4^91G%Ftram%?#!?DaUnah=Rkuc=bZ>BBif25W@5CI{L7<{;Anm5!_OR5_+CiRA*EL#SP;uj+f&KY&$C>Tkt zDT%`uvrJmI%d~DKVXlXaXt9aNEGPo7S!fL#_N;TM_y~i>AXB9XK!4Q`r=>C^)HF=~ zbxh??gg!<9e-xm;P2<|WUF%3Tci53zUh80(Z=2gMX(+IDd>w=_-_ag4X5wRy@JkI$ zq))f`?F0EU{fkrfoPp8d(&i>MF>}f4Le#-5jN1Y+iOV%{2NM~$ zoBY*8yg8@>u4_sh*ZqsM1!}O;1>P&6tD{h34OlZ6qKUxmGANwwp0~>eo+9%D^o_I&18+f^fw;tu> zo{9sW`H?M?xY#ay38=SjP4K-nnZt=mHM=_VSD^6d@vt{nBTOO@u0i&q$5(x(F z>W#=lgAFf+Ad$Wu*z?;U$3AHcf`%T6-E=Qxc6g_;+qc(&#<6zA80P6%{c+{PSh7(p z>-iTXFOcIlaj9m`$Y4c(H<Dj;D@0~d)yGVSIYHX$k z{66`7PjPJKD|pcFg5Y7YJC>t4;VI%gfZLUEAZ4f3elNm{V-ptL24-ZuF z#v$F;SG^g*>f&>Rs~v({y1W!)>tlpmn*(KZv)1=qSf z^xuSC#X3edF4DDm(!5Hwa6?YU3Fc%FqUOiEds z0kW0Hn^%x>eH=jl5YK1aB%Xsn2%`2IyR9L(;Xz(mQY)bx`SCPQ> z@KunXU6!?R%fLQ~Es!7?cWB9_v_ju*_3_OC$XWKK;BY!JW~sg!%utzKMRfOl0`jZ3 z04ATI(&6mb&)Cnp*5l!q-T_;(>#RpyU8~v(XKqK`Ur*J9w<70^pT{G0B9Gy1fQ2uB z^5ru;n|_Xh$%k{o_lX_lw|o{5K>-=7AQ&DCQS1n#?+*=M{FY~G)S$u8s8fI6d2mY z&H371$MQy;#*sD>@aVeoxWzoC_3;=!o|CWj=;QHt9B~^b7-(LhCn@w~LP2S{LQmo2 zn~h76#@$t%`2dPudkyM(Bz!IH=V-jDlL8lSieoO3hic0Qs8YE1^bX|0yvc6e4TG{B zkFwddRbb1b24;z)aiT1Sy$$)I)! z$xSmFzK%RMM_)Vs2<*!)t_D2}Cnc8GkDKW@6Xs{VlfLv^v_s+}Al4)k`Pn#ofCm*hAKS>lmG5pAZ)h!1U8K;91*iH(sG#u_#KoU= z@!Yiht^5;$*}7}zkIi0A0F!RSILV&9K1$ceSv=O>1d6lIj__)4<|C#B znyvOPe8dRe?VrW)7{3^z;uk|q{9^R!hHoJTm&IhBk1DeMm3DC*Ao(p_cwBh<#sg1= zrN}G#Y?E}lWtU%*BBgHQd5`ilF!+2QY|k6N46%C<^T#hj?EQ!($0q~#>T!@53I82R z)O>w+3aKWg8!e{fVLT^6VM?Se^`#_rJS#zAQc5Di0)sLau`tuENQJ4RFXQ&|-2gYK z(5>%=CWV#IH0%uNI1$MLICGY+Zxbj?ja?;_dJ|1nO|Mr7ABOm5@NxFcm*6;NzCUDL zxir!4KbCshdAt>x4)4Ox%p<_Ko)Wc@t|z@VUX^${hN`^{QI%*?BvO^JO(rbvtKgis zSx5H#x>ZeDLiO#)!KRFBTSU7|L~$4tn+^Pm^e9bLN|Tny%)q|NVztG@T{-L*!@spG zuRu>B5}@iRNV_ahBa9922F5owpP`rxBu-3@P)h5Y*Ju(0i8G0#9~?2jehsRPfy9|KgNIIe zoJy}sGC3;(i3mlfFj{a1##bxr$yt#=covoA@gT2T@(24j7hhr5B z)*Ccy;LneU^w>Wl-a{Noeile>=kA)RdrkY z5Z;G+eGluE-;I(rNrvWIq*z_ig4*@B0J>=zkoAMMDA`%b!Zx%EORUYNOPZ3Fq{`rV*S0!(JuX`g84#}QZmT3( zrwlx-=w#y#&(2rT4`Hg0`ZslGTOWn}y_a=Z*_uz6#>Ke2+cJLnP@g9Syz+9~vd?V3 zsbmd({opeC;I!9d?>6@7{|mbeKL)c8KdH7)HzR%%O$k2Jwz!tfKlSVEG}P0pXQX|p zMy1xI1*up4SK9fASf11d+5_!CDpF}X{GL6(O%^oS9AGHYD%eWw>bsB~qak^4s_(`V z^lqNsgD0oXaRHB)UW|~Rpd8#VWQX^o6swC7a9{&QYF`r29hzC_atfqe-U~{rmHU)% zFK(0(#qgMnsUsbnKn38>cGfsf4}wV5{nJ;iX!$B`AoVIJ8$J#cejDi>KI>bUAN2|G@Owy;SalOx zv4^pVE9Vd~pa_~V`h{7#oP652Jsv#dmQ7)pysbO6>33-HDd{lmZ9ix0XN~07d8zO_ zV388zt#lW#L4e{+d`8eeNl)})Mho%{^HiN3PsPEPtKAeoB#C#jXq~G*dc+MI)?;my zk@p=9rw3M_A?E3+RQ=P4;5!~wxOw?t1g62W_ibpi+5vQAWi4zujalX6<>mgAev`ag z!<4q5lzjHI(x1|AowupQA z7~>55+xRkQ)BOP8;|BDhn?8;>UJE($>DdHop&S37ga0K|^2ER4r_h_4_!4Wpd@#P9 zz?I5!kBMNj%suoeU7#?5K|S|xE=AgHKngtALuvvGTHsa3-cBsr;uXEbs_#dx$}&9R z1%rVzCUElslGMbLgz1I|>rh0<-7qcp;rrM5R+PJ3E#(=Kq)MIKP!D3KhB`l)LrNfGEqJC11c4T-5H4>V`?ge z@8xtBPF~ebL7h~!5nf;?;8~Q}gN=)EZ4Tl|vWgjfV zu+8Ycp++456*6M+FtiilPA9N-Kn>r88tlaf=he5s8uQ^7-~Lm2;Z#vJV|{UamqXKfB@&Q&$)?0 z_(fo@7A%O#tnBqRVZV)LeWe1~J8pVW1e{gimjNt4lX**5A>&v0_;h)^C`e*UYxn>m z=LqC4v#p;;FUvpTm@x)ip>N&CPjUf9)6W6$&dNDWxS8( z{!#Ice*e*Ze|hv#zkIxQV;r3#p}RDqHPJ0&vEE#etA7}I`$zpCCj{y^gm7}owOLwR#uKC`0o*y;@j8$DOXg#IO2(RR0TL>o( zg<`&VBC@|4Na#5l3=74(%-7HHN=G}L0jJWh6q1Gl)>K+^6qox0EKKe(&L>ZP_Fi}w z8tf859!=A2e423)R62=uORyJ(V($n)Al?i6$`x=f-YjY#HHg=JjE&*VCPTdFWRC3r z$KIR3M^S8j!_~|5Bq3zqH?n7#nS_u)2uUDem9Pg9NkBvt5m5rTp+H1IT&}1HA}S9e z;);6Fiwn50BPuE?DhjeFA_^iRDrl7Ne@@lR^Z@$$+R_=h>|<~`xZW+P8rJ#Vq)C!f?J zUbu#EX4mMiaxGx9kKg7xunTi-D%&UGXWRFp>!6tot4h!tKLqg%Smn#?FLg&QTlnCN&^9vs&I89>0*9d|TMEf?zay6H zaj8Nz&~?QKW@`L|V)XQDNE8+(Dy<2L9BMMq(El7h*s^4cGMr!u+)MOZpoX{uzKlhk z62k0WpW;y1f7hWliBN|r8-95pM0Z_@;nCyPb=S>E$g`s%!8L(^Ki+yWx zy#7v?nw4mCyQ`<#z-Mrj4SW(I4pTgAgV5!Cp#^%Irwiep7+p>l!V+8Ra;iW-5$L&` zU5a+xPy6M)^-ga}v?V8I{Zt~vwGtzn7w@@;dRrooXAovlipLAU(}x_qmcS|3Dw2#d za7nRb^MzpU#x?Z4gJ6~1A(uK(Nt510l5Kh6UuesqdU^^1ZAnuVy)?$~hNw<+nnBI_ zVUWfCYVhZ)lg`e`=L0k^Sw(HlccL+(5qD6uBfy$MYvBF|wsMZ3a(O|#g~hkNIF+2| zhs(6rasuKUZfQArz1-rvV!G?<(E@cn4+o-}-xFPezjV(6^Sn+`gTIkD=vkx(huc|! zsl4!Avz!%JXu?3wS52H2m(j_goN`v&&XTTcY?+~6yt}~CSn?-ncc}LgoY^FU&co9_q!3DDTljyw$!t_@La@dLo9V>8p7rlJ5?|b76I(AA$|6K|JbTgXe&>HhOv- zw~3x~5X;HB>n;rN3A|{hC(0F^rc`vSTsmz^qa@wM>Ky)gyoxuCrXCyzoT)ESORI6G zFKBvd18b^DSW|VKzOd=ZKYeA>6Lb2~CfmZ=2(2%wYeob=l13h_Gh$hU)*ONO53f?n zI5%i-lz`K69W5tY;Wg6er zDdR?=1%yJ2Cw^I>Ay)mVjfSkyB~mhOiM-z|*%agpk8@e@c?x{id2qtEZ%?#t@$@f| zr(am<3A5sh5Blo31cCet$@9!G%(r5pyVlVKKb|`+QLex8)10CZ_Sil&fP9f$V2AuQQl9?EJhkZVX)$S; zUtWe#J%z?mQPf}9bcl;oi0+JAqAp0se0};ZWbT9vR;qBzW{$(zzoxojEHBNuUcoro zf}g?o^08V+nc>(Jg9nU7Ii6AryYRWFb11LT@p2qz@RFRT+6sXHJwyr_%FB12LVS*F zXmBAr{}ctRiurOS@RZd*tjxvmfS=d+Djc(h%9X!&^eKxGB^cxlZ(I`^0<#dzg(#0V zUAQ^Vi)mXRi^sDZv`09#S$6wh?xNvGSur}RHkfi2?hxp{4Cgmpd(gk0tVtayLYi(zUs(6^o-G%a z74hK$ukLiyXksxB+x9^-#IN zoE1RR);Raw$-Z~y`oKQknVU3@|0YfP8~vS5{_vcL+LHe1^x~7HZ^gA#KFOW-Jo-)F zI>L`}*#ySCU-4fgoFJcf%f|!s400}XJw<)VKf3OX_ix2oP3^!t%XGKV_$KNQhB+xI zEgGtX`ukt>>y^$dLG`U$@{Bg6oGyW~jid*nM z=r?7+8QeAhbiZ-$Ib2<-G4B7thlKj-IpuZ>3+12Q!D|_6u z_b5MZ+WYh;LE1^=T|4g7VofAMAKgFdQ%J7y1CV_B{z%v^J<*NeKJ_~x*%;=!Q9I&M zGR}DqU5iqS!^Ow=yBd1%Jx5GbX_>-?gw^;F;I6A$s53l!k_*3m?rfZi(bd^_6Vq9sbcY%y&syFLm*`r7 zMo0|b)#+a_n?N5-k?oKrI*kw&7}K>&Y2>dq^m;iK@O8j-0>mdJKu0z$EbpYP6tItPwW95h!g!7%^_-Jf5AV=0cm99Nq{OoWkJa4f?SX(1MI6yWHI zV-SuJI4;FegQFBj`9u)YG0cr4dq?CO)%bqF$B3XR1h4kexGEMk$aLB6(4iNs~YNR|A~c#cvYb`-#6B1?pAGbGB-Cko;QNwJhlm z1Xj%A2*E(X)7w6mT@F&%MfI-FyzKMpAepsF20i2xBimdn{GDFy3$A+g8+)9I&harN z<_`9WoT1~=A%*~Eg=T|KP?lA0NhZmu&J2>Gs39KCAN~Uy{;2k~W&{VMC=GScYcri2 zqA)bD)^;)cC(2}r={3W`JjqDn%&U=+9bw{}`jon;AuPfSY9L=D+8U_AbTnA?T)ZKI z&PF~*8xXMnJ`Y>`v4<^A@epyN;)@(}p6(b|9$|ipcLe=ogQz(}D~`E%|DUyD_#gWi zt{R?B1hM)QhyS2SLr(X+0pHUL>WwpmD^>aoMP=sD9zWo z2uEWCEzPmhKDLH^(m59FO4G zh~rBf4qOZKaP+`I*U6i3Jc45*jxTXIbntQXz%d%fO*kIGu@T3YI2;D}IC|h1jpHU9 zkKovd<4YV4Tu<|G&{l!+kswVM)Ashl#QdhwNc?W)V`KOgc%p3OO(%}KX-qJ`AiyV% zyXlf(zAL~dj=Kpj4chg$4)BTNZn`v>?+);Z<8B%k%=ZNN#Bn!W7R>hs_{4EHT^`IY z4DgBLZWz!ThoSpE%fI8qDty;1kE)G&z`G9^ezl z-E?g*zhi(;9Cy=o!TgE8qBW^@QLFt z(pzO>!y@iP6R_&y`#uL&>uAl%;P+A2^1Ul%=~IX{?!Z(6-|^pxKlIkoXZVX3aED>F zkl0SEp>Y?oP~H;VFs81f^2RW;!L{2j>BQpsxQ2SX@tJg9p%ITwDdYGz;qgoL4&8}- zJ*2@otflF|VrZz#K?6MQxh&D=U(g4oPFy2|-f+5Jdgk=c`svd1t+udfMO9a8nL;ROJQxvZ2U&C2pEkA6$|S)X5%5nB49Lrt5~>yHyaNt z76GI2JH^6MkJ)%cu?QHA-xKPoPr(wD$={D{ya*BCMqBxFjK-r%2x~;A2>EjYLRdml zLO)P3EME9?4A=Ki-gr!@!|Kv0lKvdKB$^g$1!m*Lo5qWeKH#WEXzQDrfbnT=zVMFK|Suf#&b zU~oeaVLUS%v8EE{?r+aB8k?0EMmC7ygfJVi)W>3hETi!^We9N?Fhn3=2w?^d2(N&l zKvuvILJndGwSb{OmNEpl5q=Ou*qM#LlWn*i$TAwSnWIK)`5pDh-HUXh77OjUh@y zAj@bBRbq%_h#`W_#xNxo$TAvRC^1AY#1M>TW4ICvWEqVuDQ}WK1yPC996%)_k>nq| zbl)L!j43X(QDc-}#F)~WGNMTVngkJPHpUP@lMpZ(V-*YWX*RyEqKSaf7^heW)&Pq@ zfQ8Tvum}WLh~of@K!Ak^HswhSHwdUx6CNUh11tgo7NR!5A`oC9QUfdk0Tu$uY{Uam zt}+3m@jXJYg?I|E2n1M&E0e!JO$|lBkV67WA-n=C0s$6+&1{TU%}c;&Oi*oz$P2It z1Xzf`0E<9?g+L6j2n1LN%K(c&fQ1+h)Qdo%UWnB|LlFox6hbzjkU&5oLKoi+QD+~4 zQ^r1oaX>49fL4TafJGp{LR1H|5;#RG0zJSda0(yMA8?pJz+s#K0TzJ(3#URLED5Nv z9HHw|{5*aLI}Ila%_l8!Bd))gf8bdN&K9$xLfROw|NF};v;Z{1$H41d-5Lw3ZpN&b7@Si*c zRExq#^7RJ4ugT!S*Mw=5fUl`k(C2F!fbumRN%qyBH!X!qOz~Sf%~#1Mg}n7I;3^fd z?*bE^Jc@qYwL$0KT*Zn#Y%L%asa_ynds6-WkeMp1(W+eM&x;rwg(w z&sSrVFOcO;(J5e`^8Doq;A3=5Tc48V3%F9q*KH_tLk5pl_<4>^CuRF}640l3n0il1 z^VMGI_FA|79yrdH(VQ z@XaPJPkpb-^V|*P+xp7a!amlv$Ufz{jzE^bQAAEqjy|OXl!tZPzfs!h3`of@DLJ`> z9PFXI6hglG+4NI(pd{(19DPbVP`&^_Kc)XrKhG4QzdeL}`sp0pMB~L&%H>TSDoJO& zN_L=1Z3j`?K;+I3wb_I6t$<%G;1{XF9uZKkHy-a&IwT|@C2NdV-B8$H?+y_1`DN=D z%J%mQ0ewn2XdYj_RKH;CqHjF-Zm&DCCfZBe7xm*kW>Y8+zoUn3YelKp4<0{_GVt}Y zxM>wgV4Nh34dIf3FUA1MS2*zyn1I~T{%!)Dr&Pq9as`IKu9jRO zH9=~JYQH~}732?Pus=0Oz#qcw4<+y&7*O`7a3@=;Je3+tG{$cUPGjZIC=YDm`kLl;q_T zjpfyYVxs}##9B?V{Ggb>N=l_HpdwT4*?|Zt(9USzZzJ~Tr2w=H}-*j1mMxW zt7$AHKXV&+f*R0sdL44P4ng|6s1WeEqn>jG$*ff}=tG~_XwpOv{V6)JSw#h5(8FEy z-XtHF|6;)o-Q$zN`DuzFzB-&1s_A55wJaYfB=smKC6naniJVO}GvJ(Trw1VrPICd0 z^gn5qF0-Vs;nlJqzLTq-H1qTL>D9gm%?1nbgXSb80}q<%X)zXC=sB|^sO5aEYiqd% z!wfuTrqh|vay(|{x!42$bG{>qG!PoKGa@eJS0mQSDm ziI$Z?*shvPto~=4xxpP=@(iK<2OT79rrKbLFW?qcKnztNa8M26H_ygch1=&JV&E_=pyH=b85TeZyIoJ8{n>&HI5=-{L`_6>)Z!l z@Pwj__(dxf3G%%e%>DUWLbpNyk9Nc(*dInBnE8oeaPJNr$mTs@gPDiGLm=56l+}3YGkIwWS&dDrYP-0=OO!S<*1tk&UWYq_`mT2vwoGG?kH$&gqa+N`KOa=q1o;iNt*JYFkI5 zZ7Xl@A0eJB`5-q&gcfz~Zi$Pc$+w$QNq#|pqOChqsrpW1zghf-% z#(e69eZ{1+dO+vyF=BrO`R1)8Zqq=@eznesH$ogoJ6qy8_Om{RxSP>p6kCfB(G-LD zk6`{~RQ7EI3a*0|(HcGTB zEhwyqWVE;eT3l@jc`!RCdq3xs1rNRFG|A z*NG+U*@s;uvNYnwGVgAYp^-0#I+2CD#UI+1zV(9%`x6e)}>NcIHE(H}xjZ|Hs<2ECoa zt3#>SlXqSB9zcaUMconb`iZ>?H8c7_6ftj9590kK+Atc==x0&PD1y;1qAjB&g-RHe zGWu1NGOA(JEZQ-8fi3)oU$-UedCb$bGWN4?>`)Berq%)VixMw%8Jb_ui0Uv>@hVyJ zjdoJ9TBn$}IYvrWbGe@?CBoe#c#A40=7(zuS|2?$D@y#*cVd1&k)+k>)4{6-uU@2R zxV;1F&ypz`?(2YVV3ekvr)!x};-w;zOw&ej>weyDX}8{@oi>53f0b1UUVH62Zrux_ zD)Y|~9knTpE>q}wo#NV2MUox08LZ{~K9%`ITIrxes>czWSDx>}m zLR+;AMqe>{Ps?I7-6G!mS}vnx%uwpZ2U-E6=NN6%+>G#q4ZIIEe6b02zzqS=M_MtX zo7uCEwNgg3KfN9j_{cgWX=h!%_(bc-Xa#%rsaD14LiS~+R?VoH(Pvs$M)$C1yR{yS zirAOES}#V`Z2fbs41D21(` z)NW(+1|y-*W;B_7(e%3*VdElNP}k=&`iYUD&u8=q`(o<%F~Xz+k`8?#qmLO``h$!n zurE%138Nd>mk|9CMp#BfxlsLaM!Ok>>B|`1!M?Q6pJ9YeXpjuopJf!z)?4Z;7`@CW zLVuCbV74BquVVBqqbU7VMzh$LXnhT%d)b#H{S8L){L9eaWAr2Y(n{aPXes-WsejDq zZ1yEf|CCWSThG=%WAq-Q9DNTXddH$3yHCGhWU%!DeLtgxjNJOyjGks+3iU&bhO_lH z`ge?4u=Te3QAVp6mFhn-8q2=4*N-zQXX_pGUm0n5OB7?W{yU?;F{;u{lg_^$JoZ%U zVT{(|DpW7J>QRiETM+80CouW|H#+sAx1MHVKodn}*a<88>Di`^YsdWV#H&;2Pz9ku zdXDLUWN1D~4%c%TeU00e9^wKZBP&YWnMjhOfnp(fBdqrmx9PnZ{T_ra@*~R{n>Z(S z$n;-w=Yh_wCVKu^M59aQ#Rj+wkdvH9w3g`@roSdEh_%GT#D$mEHpJex!5{WFB)mpxaxK{tMHIx-wpmjTN~mb3l(L6OHS? zCAL%ysCf_ROH&tvK2f;XU%Q#T*P~u}l|)zN5?#-9Ez@zylyfE1NlfP^QqF%deSqoy zew1^B>0zcFn08@W%`~loWb&BiFm01WIps{tn671QZ!>*MrrVIrM@+XdeJq1=o@2V4 zX<8BGL^4fgn#i<}t!yb-@2~0P>`x%sk7*mG!ZeHbH#hyb0JhudSj(chL{3Z5w2m60| zEf$rLho{y>6U%Xq*z00(T`XA_5uZE=gJ=8jIMgvJn&^AolAhD=|SL3DU=cAPK&Q1Q!X;fD%{4oM|ywk6s%`5rx5U~(MSR=iW`0e!5d zIIc__Y1;v`IiF};0nr6rI>bebEz}GC5wa3iUMM1Zw1nu0j+JQVC9M$o;$R-7GrG`t z*pg{!5%uZi9cz%Umv#po0PB``tpnvhkzR|OL*aNKc^kh2RQvG(|b7QA*Mf<5;u<1ZDkJAc$VzR^g^Z+IDaFj zcc4_=^w+x0p%K2@5VZeUoi7C4(qk-qz9ErnG#k{OA1y{!j)$!~E3W{3wsJCLKB=KP zF6%iKwMfg~i&`w_2-ywIhPa~Fg~-364Yl6Y9Fyy_`XT2XrbqjeOrTXYaWZ!rqBm^7 z9K__t${UgXj$`-;yfVbi=s`Ru?szlkfvSb@{8-^#NYBX22CXkAE902bs1hx@4Vn{M zH@(LII*WT&k^*GU=gNW5qR)j1^m8 zD^?7H-B@ugrw1@?!#Rh#lFTIZa;%um>5G{5;G8Vh)0Op{#CQ@bQaD}8`R8!@6`V)0 zqPgoT^i=d&s}O0S)vG}p`hOeSR*dVi8Tr?Aq4=DDu`61fi?cOajNtTrOrK`zEvEbz ztGA)-u)0stRy#b^h9$C?4q&>kdo0>~Ow|#mCB|2sa2n#Hc3(K_rk`JfURI+@bjdD^ zBr}qT)-avfnbPN0?edRi-7+3VgtP_qmD=R`0y1BBB)YhQ=s8RuD4_JW1Bl+2PIN_Q zq8?5=nC|LFIoGjdY2g=sE5GEXBmY1zqTgf^{iTrTUFGREnFGj~S#iLhlj`~wIp}HP2Tfr;0lLG}igR+9y8Lw2 zAUZ>Ts->L63Gy2Kzvlk+Qc|;B-k$bZEM$KqrEAAewg0=*j)~N3uhr6c(v8#GdL_g2 zEDw$OkCm2iji?rXBqKHaaZO3XxfOIL@>4DKqc2UpV^7QWwCBiHJ-329k@|zvbfxy? z+tX)~*Tf(fjg9a2)lq7G|C0EBE(aqsMzGV%T4F^;%i^KAkm&GYqW9;Q#rwF0)s@I; z9!T^sXqmV!p(Z{-TyI9jC5X=9M3bY5mc|fm8A~)hj_6{hRq>QI5{Nc2#R@jkFSQ_g zXB5%fS;J!1a5ZZf&SiHq9m^VWxa@;m_ERqVESG(T%dX?H3%G0(mrCJMik(wCEXnsh)@*eSqxK*L6I`oKli02fFtLq<+ zr3w5qxEwx!q|hcUBuf)m9AMri&Bz)OA3!HEN5tb54d#(OuZ~xP8Bw_=eEQypjI4{| zqy31=;RjUk&u0${6^y9d_;@T8C}d<^9gn@K3Z2NjF+NMYmq~bj$caw3#Al1`3War^ z4fKsdUnRB0NUdc_$={Ra#^;DoiNwj?3*vJ{4Wl{Y*WSzH3&iaTo$S2=s40ibiO=fZ zjrWL~6>3#EH@;BZ#b~Z*Rrz6jk!X`EB~!XCk1rNw3jMuc2T&)4-YwV-biP7n#h39V zVw@j|gfelBAEhQ#h#7uVme5(;=|^=5UBv@_bXh`A@t7aooX}hR!;h9E^cSoBXkEe} z@s=Nbo-jmw>_>WHgZRRavJ*#$@BFB1;wbT}AB{=8SUB@!ZOw}5iI<8vh1zskme?rT zDRgDxmc%Q?aKGfi#K~f*LcbNBNSrFRVU-B|C%(;0OS%#FH9l06bel*kAT$TOi<0Ju zsMeAbYew_M$8C4SKPD;_T3qp2(qm$fLhrUcko341sn9tU zhm)QZ^xNrFqgP=4X)()>eoT5stWs!v$;U~{#V&;&gN5hB5rrNo_$=u;;q*u?ElYO9 z|3f4z^zDGplKvrz{ir!xb3VD2O8ei4EvUg#E)J`{wc__<0OWEn;c@$Ystq&y^`GI z+L-){xX6#*O8!-BQD||+#^m2bW-*nUFZT7`nEboAQlWDy-cLR$4kP-@AKpkZGu9c^tX~* zXqy#sK(eKl)=o-ZSFkZTLYttFyWcm-k=mN}l2=)NG&x55PNCfNqsg&a2G*Ua4r5A= zCdX<06w2xOOLDw6O`-lBjg&;~X@%bH7oL)=?Nq3~XIx5()~rz3z?76!Et7Zt%oj%o zq@<*2-4(j0EHfoto2O85YGz6+?U+IrWM-yhX_L#PFZX1oq~vINM~P~@1u3~&q(b+1 zE=bAK+9p%)qTg95ZMClSvIJ1~wsk4( zw2=yx0F`N*6&hSzpHi;HbtcL6dg{Pck(F9+h0=O!qDs3`p}!Y21N~j0xJp7VD)eya zg(+3qW=3H z%05rIMqA)V-=$2`%s!I$Sk-SSGqk=64IC7cI!l|U&~2>PuQko#ajJq@}&0P4}b3 zv^Cmsg}(9@rftx=V;3Fu*u6RBX`8j%6&ma9o%WWtT_G!RWZJu0yR)TaF3<Gek=M2HsEF?FvO^J(PAr+vZ0vq%~`~=PJpB7t&5@(-lfhd?8KOcPi8e$f1`H zm6E%Ay_puGFIVW@@?B{y^|X4)Taa}qEmohd&_`v5(vtLj3QaFRk(RCxZIF`F%bn@D z`WA&Yl_jKm^zvbnx2Y^Ay{*1fp~S3&^bUIFaLG%|%1Q5}->%Rj6>ZbI>6s%W?jb z+>h=}AE#eAN=klQwIqGKo_nDWJ(E63-=@%A16HM9truS;c}sw<({ESk!U3DooAg5p zT?2HZ-gmT=+>bV!rLR$F;D8U(|E9-XEO{5ZcBS88L;KV3($f{Muw+;I-8Qs8eV(4L zc#A3yr_Z;cAJgyEixjVKMRWQB8**ekpqDG&go4BAi)`q}^au4C#oIXGaQb2!`Z4_> zy_e!W*ZFYz5*zw4{b7Be;@z8mIDM%N{h0oUK2-5`_S=>Is15B;e_X#<@m^2cmHwm+ z?N5J7rx*O_Z2U6qaQZVg^ke$p^=lMwGU~A0hJH+cR==Kka)$JrewReJ>xsyCPQQE% z>6|6Hmc#;GqtKg4$r=C9Z&2vd+T@HC`rj0q)3a5^^ZF|a9n1G-yr{=rBDEaLug+Md zm-*3I887R-6f(18GhWdL`H(9%<5hi(AN9|8O`ojL>V88q*624Xv~9qUjJ5jh3dN)k z$yle)SLkTLkc{>EVufbAhGcBepH%1?ppE(ph1!)2$=Ia7rqD~7=ViREZ&s*u;Fyff z`uhr{d1Eu)(03|yG9@tGIr?0 z$4SXKJ)g+C!o~RSP5MN{QBBX4TRdq0mb}k;Ytw_O$Pu5^cPr z(69a6tzr%HDp{^4=2;0wu0rjAl8o*OHMeQkD#d72=nznvai2m%iaWK+FxDuv4)Ky@ zBwa0au0y!7HGVX@mCJ~_#wR(WmDlK{Q0c&jS``~>{OHM6B}Ua`DVgT| zG`YPo&yOz8C^HTzbTZ}BT0~>N6oFe8$bC`ROVSm%yrVjxjnKoYmEv&D$DF^4ELj6nf;B)e$rmz>V}TzfXI*S;@}rJf zV~st2G$!kEBW9|!cc9lTSrZJGAFar`(iqBUjyTZkgREexr0X>?Mkq+{2xnMPlQX7+5x z_v}U~^m#g=OBvk|@_l+d&=rdJFtp4vrZAcjvK(4w88aEJH)!U6vq7HVuE0q%|C^0X z*E2Hc9wES^`+!^gl5`(%i?Nj@=Zdo{3bOAoTr;TLT#;5>l6|+az>g}j=NaZq;?3lH znR^W{BY9_YuhO~6G2K&}9Y9Cj1GDe*^NzZQW-s)kTWikGUZl`^=jxI%*$)|2tds6Z zF3(YPo+;oC`zyiUJov%VnbJ>xj@ zHi^|GkLJ8@be}EltuA>!XPeFXrkw4@ZHlLP7UXt!-`K1-=X_%MmL3OfQ}hM z6&h96G51GfvO<}4U2~5cHFpK98)l&8N9G!4FXoZ;@wuis&yS|%T4tc-@5l`^KUF-< zGcq^a{7#`7pq8dNM|w7@?7wm&%v^;s>mJRGHcv8=EuUtF+$|;3dT+>0^ZT;8v=9vc+ssYM3Yv%f_$K(~5wy!JMGgYwF3=%T!GvjukQHPz_MEIpaQ` zFAwI`n0G0ZS@&dKH#7GE_C-8a_D)`Z^YEg8XM_FL(|Yg88*CnD9`(wRymQP64@#Y@ zOSJrRZM_noKg`^(c$#NV-g)Lpg=&CCn1S=bm4CjOv{-7%tSiYMWsZF)VEuBN^}+d< zn^!WAtdGhcZ?5s9iTM+3)^E(e(zKRHotkHG{?%rxLN!3wn8gZ>Dw~r(*&L`)X5Iby zQ_T2>1J-BRtiO~$%gkgRS>K$0vl+KkT3B83N&c;7qe62$-{#LYCo80RUdq4IoTpF? z&|T)hM`gKDWujn?Ib5O4y0C(I=F!Ij)*m#R8Bt7l3m!CcANSeoT(H>O?niY6OUzYI zNZuUJB?XU~I~CGA-h#)?kxxoq4bT(jHibr&U0?8|nY2vuGV5+Dc-lPoX+rXRc*#7U zk(~X$WNV4#1uvPGF^^heUBOCo<}*?Y&Xt0fZT)blV70mZ?~C33HiLRaIK!q~vu5;}+hddv!{*BH00@pX@Nam6C$6W_a?+a4P z>XMbNZ*A7!c71Qs&ppzW1Y@%62Qy6}jLEKJ=A#OYD%<1w(OjWWX5BZgaweUo{_J;`xEp}WeDxUcZnsJ=?` zT|7zbET=Rr^++*^Z&x2+bEO+Z6%5#AvQq&~|zJ zY)A2j#9OcTF6so{@sA|R>etJ2mt)Pxgl344nxUR~j!U*n^aap-N5dzCWWO(PjAA6u zl?9IL{JfE#1&-So(f)!lr({q1`LN@d zLL~X9!@HAs($6Oy+Y}-{p9=Ex8AtLil9YZv<7mrB>U_pAR3Xy&tm8N%sq=YtR?QHk z^Ti;YD;-OBlTK=hD?BS5g?k9eJCs))!zB{Ei)MOWbr^e@C$jp@_N;Mu722M-Dsr78 z~(fL#b}OL)_P! z(HQcP=N-pzKl;kE)i#Fw>e=RaQt>p;CeKHX^$OJheeBq#(5SKq?{>#Ag)-}sygMB2 zz9tJYmi7nr`+klP-yRSjqCFr^?SSIRJtqNlBD2E#O;EXmeo5MM@~t1yo|D6VM0-xY zcT}-2^FwL|?TA0>=q8c)vapAF)G<||&V^mPKREvO4S79ZwCdEu{L!&ip`89b%%2?J zE2IPc?8rJOCHs_aOg`=?Qm6{(gricS+kt*@^ipUl(65ej6q-Azm$%t*i68az{^ppj zP<5w4-rpT_6>rsW;4w@aWTbmi(Ab!ZygkjYlB42J0AN3=2nL?@fN~U3zeJgnz z3Ye$RON_QC^iU7t#T}NC?Gb~9HSRk?v&0<*@j%NM-5|_9_<*Ffg3*3#`Fbtcv|eL0 zLsXX6;}cnLE0mjF?{!)`6&h1g?+vjIDwNan0&l3L9U%)dME{PLdRthD3ccH}-rLg3 zXEax2yOzgCSOXPG${=(lBNcXlfC)k*^(yw zOl+J)Ar}@c@WxoZ6q*VYYfWK<(X?opH_p17(X5bL&l+zeS@$!#A!ONE4v}O%taxvO zmuxLlyf45@wpJ+K3Gh;^R}?RzmqVmj8x=37*LWkU@;E zo+WA_nQje}2;=@3G<(`lcHDtgK5EqTN%4)@FrLUEg~Pt#-f5 zas$gwc#Ewq*kedF+T;o?>|nJvBwAcikWyh)DzvZnTgjEyB?_HW5nI^F!UhK}_dr2G zN*AlULf;N3NapuP;2aC>2K`|ky`d)A4{Ee zb||4a*ukYvE+88>96)tq)GI8W_#M^)JIY)w+_=7r1BE#P!x@B}wa_*IUgB(fa50mIHfd zX~sh9pVO@sCL721D}oAj!?vFvSZG8)I#@E?4N` zi2ae9gCyUurrRXnus_1VTh?BielvM`IG7^L3Z5+wPy6{mQQqL1FTvJ~=0bq#wvNb()4jpAK_mVd{pQYZ|O z{7#VMyH;<-n;5pe@Lg+=LO(}*24rvft=2fdTHp%y_`)rc$ z1xdbdJ#CYG-&$jnd_PF?18bY&og1>u`oP+&(Bbe8B0mU{+-7}eliX(M^dSedCrNG# zlKjw0P(0H4q1D6R@xKkSRbomRF&X^{tj>^eWQ%50LKS+zFF&w?a(S?4KU8T{O3 zU8m67@N-v?9CE=8>&b2FWk1M1|glZ_0i-Di}tP+KufS>zD&=lzWGDvd2HB9m1V12)Ji9*XDxj#tq zE9+{->ki4UtQiXJfaF&}k_W6giuZZQ@X!O+B89GPIUC5{?_XO_Dc)_N!$ZHeRw|Sg zF&oG(`Hl6u;(ZUD-&orex&=DF36eZ$eXe*9L+3&3JB2Es^I(wVA?r8Ay9hNpWQBQU zKm3Xs9SV~C)=E-5lKj@nvq^p%Bzf2>RlL{H@`tS&g+@T<;ULNHtp1AkGbF#WhADIh zB)BBHQ}G@N8y@<-HAf*&VbA`r3=dmEkAFUr1kFKyk zT6&>udAh>>7$o_V6{UD2`ID7yll&=2@@LDVcyxvR*(z6vuCPA`NglWQ*d&izLv51B zgCtK_;}mZa>VCqStWYTGej-Tn7i*SH@)v8aP4br@$zQF96mJk}^sDuZLfhfzuhuIH zb;Jy?*)Mr^%owZLFIgD7KQh4U6gS5D&CgpCw?FbXYn#$C9JB7>Q0y9T>wel*JXhC90}^cu#O@F2;S&ifQ^5F}eVmnyU!k}ZQI zBb+A`?_2bHgwy1&bj}bn5s?u=l9A3iiq{H$MmiTN^ayGc>Dbh zo6eXZodF){jB$Qu(-{+_GuC;?rZd*rpD?f^^0^H`{c^JKMJp_!%FhGr%LA@y<>xDgBHO(wX4wE48qn z3C^W9oe4oY13c215ELN^&ZqnqG?C!^n2}snIaTrt=FJednB(IUoCg#-D|~!>ic>3- zXFzuJ`1lNGtU^^WAD%2x>e0+)X9)-da z#>baApH}E*pbF;!g<6R5@tvJNDYUM|`1r2Q=nm4C`=Z9j_jC?aXg)ma?HsAllklv+ zbE-nq;n^VPn+jbFUxqkODD*W@gVR+mbzT9_MmV2Us1Ux4a=xq36Y%9?=OKmm!Iw*& z13SucFT1=gFKdlbrr^&6ditEA+U zK(m}f6&eL!ZgXCw(0=%GhjW5L>FA@ool_P19=^;NoG+Qz2h65N#87<&ic=s?_h2CMvzUL&sJ2FCR}}@qI7(FBq|DDN$N~KY^@>v zE_i4lpY+T8@9HT3tvV`oHqw&n;_gC9@5~|YgPs}ERWr^@Xr|Mi(78PZR zXWIm1M)it{a*Cg8qM|~?*#4)>lg`uS|5%c~C*Hk+zOOy1mk^{`h!ByRim&3GLH{&x zO>tiLQ|KlWq&a+GKwJ1gviN;RdnwAHd=vSn%LlCZd?2q@6q01W z{*sc+jj5FXIqUDoee_f9sX1pli>a3>8a45HiEI;!9~z5He5d8q{402L%F6rWe24h2 zet*WzhXzZHZ+44PGril4_bAa~G-guE6lYP+${th~FZ;8y2XPm$q)dOEPcpvIjMDSD z1&I3MA&?`vf!>$$q+j;+sgeP0BxCQv`DlO23AX6dpO3hr=sFYEC)1&)kBdI#sQ7d1 z*C=_id#1EcTfpZ(&e6pz^aV+hw&l1w_)1-aYlN=aFpxIHRQ6EjoYR)%Pfyb|(I;8X z=g54N(#1LO+z=t4rg*HJMt}sIW%%AYU+K1C9MD97!a7PBT*~B94lZSJDJiLoI}izm zm=9`lzC#Q~gjnMI0vfOG#0aB_i#QUbW_g~{xFI9lcjo@j=FoU+@c3!+nC!r)NF%cx zKc&xdZa`z~pUM1t^!#(Jar$-V&s%#Ht~jlk>OUvh+ZL;K4fgzhZY-6h z{`y#PL|xG+Chd{-SMu%WkzL-N|K}0wD<#{L<`QxSF6W>2w47hbd|%qv3%;@4Hz)Vy z2hY=JWRQ}7l?G;L(ypAX{c-wq{WQnU$Bc#M*a7bSJxTLQo(X#~-_UXAPUn%lbC<8f44JeAzxS zEobkPmNn88ehuA z-9d2d1@!wQ1M#V=5lMO_M<+SQ*2$+ZNS! znbW=6T~4J=^88bJUQw0h&yOf5$FhVs+5en{C+}<$fC?Km0g)HC5dY)>#|0tQd|pcUJYYyFC!++pnTcR z_OdtjpqiH8j@S?bPzqNZ&LJ84EvTd`cGT^-yT=?^M&T*rZ|cxI}WiB=aFx%=|5)#Jt_Fl=<%PCmga~5xhnmiaIO3+ z*KXh3`~RDH1zFKWJ3QT>U+ADH`ke1cX$02937%blgq1O!xrWO5&)ECVjJ@`|EqnT} zM1`*A^MRK4%_{%B^UM_P>t(z?P>L(BCfrzg(DB}Gx|L=4B3l(eViewfu9pJ#rKY}cvd zHyubD={fzmt&U%k@^O8o?Dy36IqEn(D>nsw;rC4U-Le!#6zW*+YZ>24seQff)YUMu zOKtTu*GTT?k>0+{u_s%=UQ^Pb^PV3=Bw#<1CLZ9Nw?XOm*ZBO!-MT}BU|)eH*5X;D zQw+lVAz+K{%IT@Duh!Cs`P}l-x^H!t&Wm74d#QlVaNf@#_e=cI)Ao_f+12r5N> zp1KR-)ErrNJH3_1BAFx8zx&s?ba5<=H2=Mt^mOAm4D4IbL|gPA)`39{(Vtgz?c-Qy zj=kXZ4U+e*Y{+$wz*@)Y>l^<{S-Cbs>km55^b8?${`z{3eFxgB=vh+?Ic;a!U&)uf zPuhHYOQO+|4z*gI#gRtqz=j|h`NY$~d*OV0MdUiOq;mDx?%QlWk52cEto-?II*l#< z_1$+^frn0=J;!gBVg6%^o3L`_5ZCivRi7G)mj1l!LsGk+c7N&p;I4W>di{qlN zC>GC({y4tG@wIpk>F1Ds4(Wd&{ST!7f%FQbS0KFt>F1Gt9_izLLvy@2UhrV~Nq#kHKif$1DjO(bhXvzR{1bR}q% zcu(t#H(cJ}wf^?jY%8~nYoH?;M5J7Ou(gc)spp# zliO=giP8AV?o(om+o`SK^a@UA={bW&YHfA;Qq{Bky{gvw(O%=V@8Qo$?G-`4kN6PM ziTVamufB!p_o6zpkN&+V&Kv+*U3M;LWyJ{4{`f`M`?TjW7a+YGIeUfCWf5px-J{4^ zJLn$J^`P5W^Gvk@CJC~iu>3N*a z(i72xS^5<@_|}+4-|tw;^cDV=$5U)~1=ClUE@irb=@zD~^_vD=;cTtvw;69x?@va0 z^1vqNOf8|06OoWJ=sxH7B9ZAM=_62!#!gMfUJ>5mA?K~ycGv5m{W34rZq-(%U#hj% zPxN}*xs8AMjM6)u3pM&p&4n8M%H~3ier0o^#=Xg3xZ0=DH{lj)^xK^KH2NakK8?Nv zw~&2Xs8I~;)97n(hq%-s)>Fl04{@nOEcp&nheUPfdl19N3yIE# zOgKl;G1hjBwKcQ0W325MYcO^Ciqh^&4D<`_W_o0wn z*0zn$h;4i>Y~x=u{T^q%h7UPi)q!YS-2mOob!o>f;N?=yEZL0bi$|OjwV2W&p<}h9 zeTIbA>hx8wv0A4N!;w>3GsYUL_3khm>4!T~dUplUh<z~T{FJt|C1^GOct?U(-6zqaODOF#FPGyT%vc;)vu`g>F%-ROC-N9^YFk2ta z)}#NQ_TC0Q&g!}ozRxq?(rBcS4cJ6Batw+2u(7`UL5z_s$wtPuWJ?Cj$4cXwku-QT zGoBCIB9M+Cq#+>uJINNbnb~ zApQIJSZ36EwUhYYcH%v<)H5OVjB<@P^x6Ffz8V~pvPiMi^HS&MrOs_q=jWxiA?t4r zTw{lVfY`zGewOv9U^1>VFQxT_&8d7hR$PfMORNuF;b&);Y`EqT5zdA==qzAakdZMBHM zAbVQ!Pe}f6BcJm?;W~O7rTj+2+fvHgDCO~nqLlKYl=7mK@?mN3i<19~lFvQT-WMf@ zl>Nk-KWVtnqGY?zy6v);fiJWz3jAfm{Wdkl#r9WrH#FXFQ+M2NQ)}FBQ&U`Q-?*{4 zF=dA~t!zAQUwidCYR>-q%i0<*2D}9D#*LdB@3Vfne@o-t_KTO?Vm)Nd@7~#XpZ$@} z0Z`O1OI&EX202p)-6l1^PiDpaHs{7??Oh``G*VX{YkW*v^q92hdBqWYOj`7qwCF`p zKIC~!TJ&Mv&msX%%ZffNtNS$G4ZIyVE%MXj?r-*mqoL5$HAP1FuU zO~a5$FX3@7TYMp&#^^L&4ea&4>&q{B?QlXn?B@u zN$^+gdq;lX^Q!&H&QSPO>D5^Cpl8+ldz;X%%*^9~gwPpGf--5Lpbj$ZST z$i=X}H08G=ugbWDJpb*$vBp=`69+S%kmqBA4*-6->jBT3>gm0I5P4I*xc6It9qa#C z@IQ~drDm?SLLtwej{Gn(XT6NCj72@CyM7Az!d3qmvFttT|8JD|@$7hZ!8>)gEI51K=s>(SCa`}f`torpX?a2QgzU493H^4VKXDo9e|#C~ z9~gQCsfLFB6W|vFe*$<4e~a!v1FjW~b}2O4kkx$U51NOpn+{!L4_UVy+SM>*eH@Z@ z$od^f+Jn}w?Db)N^R zK-r+?054M?X=%lG&87iAE%39#`Bi~WA|D(3o!J#Z^|YitEx9d74$rHPBZu#(djVfm zp9cJ%x6XsHXw{9;FA>&(t%3zfgY!_>TG$ zKxMrM=(WBN7_|NaVA%RAz!qx}aHaKQz*W|N0c^AW4zS(&8Q_K1+khLae*wJA@32Ecove_=vzK1U@D3+XCN`Jl_TktADod0Y79C@FoxOC~#Y? z7I?9TGv_i7XV*qRjEH9jc!%KK9+tRWcys_!D!Rz5FV)FkjCFY9@+m-XxbZmU7iG5X#Y!8t3G zIe~Wr2GvvE&$UF<8{SK!5f${^1{n7JcGOmVKBl_g_s5t&pYi<}=nwe57Y(a<-`})` z)l)u>!Z&>!muGw&g=c-t?fXLcp-^4{C9Hl7JgD9j`cH-amT+2r8B;&ghWsB}5m6)l zziq|L^s^6d^0R*?{A_Q+&$&A7=UmN6Y*Auw6TB?=hlTT_!g-Hy-s|VAzTeMT{TV-J z^#gv+>UlqB_2*G~P<_GAmHU{VEB8ss?P|${6(~Jdw^p!B=Cs9l)zbmcMJTiz()bmw*mIU4+U-va&~n9 z2322>{Wcil#6Bzh-xtach4PAU{#f#VQ|Lbx`dh+jg=AzyGO{7gz;z+kb6bdWb-Um@ zLLA@T5XW~2^q|@=l!HjystyY!DKI7U8KEB+N>Sh`q2DGsltY{$b3*y3#NH$Ly%KvL za9jNt<=X1!Qo65!C7vVjq6XIX;s*BTl?~(>6u4jDVSy=uC4mn%utkpud|cpD0$%`Z zRj(k=R`nx+KL)hbTN3-vlJ=rTroC9;XT!uF470>X1%F)dZwmg5;Jzltt`@jaU{4dr z?qCy3ISgp46zD-!0*)RKc$dW9C-Bn(9~bz9z!wC5SKwO$e-3D?w~p%l+~*_>(;DhDHj26RXwYjwol-Gz_5A`^ z=zlHrH-T@$JK>p@O=^W|+_Xu(N38^0uety)RXYR@3;Z_%X9V6R@E*V}^}B!{P+tM; z7kG_&3izndZ&c3%j|=^nz=HZIC?8bkT^`4`6lYrcZI=G9z}E!c=_BRN(8J(=E<}8N z_*3K*7#Db_z=s7sC-60ao+fgx7uYW_F0kArc?v!+_``xP2>zVli-Nx|Mzc`vsp6JT7=y@H+*c7yMzt z7X*J!@aI>49BCJY@|sZ8Ia2>~q<;ioFLjm!>ykGDM!Q+CL1;119dBGnRd_nN%1YZk1*!{)Tlh0&7zM%C3EnGspWqXM#{@46J}3CR;13DD zAo#O_FADx6!PP~Q|3#9&;JpGT1eOKP3tSMmC{VpmS|PAk;Do@kzTlvmoW$HGFg3suM@mi z@Ckusf%5_v1TG3x8zq&%UV#$=7X_+K5-YG*pz4>}3S1Z?z9>)~7W!fG_X;cvoENwt za8aPTR`L|sD{w;K!ms>*xe0796Ymu`A+RiPUf`lYHAkLyfxQAJ1kMXw5V$B%-65O; zCj^!S&I?=+xG1pwPAOO5gut@Ed4Y=p)rTcFfqeC$aNBI*tVOA3;N#hx`a}4q;C~Be z4mVmC*xT(7*-sUwHr8Yx{z}h;OBDyYDLB zHNJzsn|w!o)4q(a=)2Wd_If8-&-owmf7SmD{~!7P-2amQFY)!@|LT7W-%||-?hJe)@WsH_ z0t3f!{&m%u-|o0OlgA$(FO1Bd=Q@UQIg;05sC3T(Za_!R>G`I-Rm59}lSU&n*$ zQQJmszX*sk7qkO!T>))a_CDY%0d1UE1%Tt84)`rr2>3BT8)sOJz-IvQjW??aFl#k~ zk^{u|@T@5CJRrW4XRiQ!%svN{#{q5iW&1qfUjf87gzVM8p8&Mg*X;KI|2m+pEbkgX zkM{z=fOj2W$h#h}$$JrCv-kagE4&v2p5wg~aJ6?M;CsB6176_m09@zo!ifA!;8H*p z+z4m~F9-AnI{^K`E{s(}@KV4qV!x&$h{fn3_G_vYv0qo`BKGTQ6=J`x&PVLmRU2Zz zuGS*TE} z`wg`NvENWT5&I3*i`Z|dU5Gtjy&tRpN_DlmRwdMNb(^|deMbFT)aqL}BmE2YH|p;o zE?TU8)~MyTFS0xBe`o)|e!~uX&i8b9COofre&jjVdx3Ya_mKC)-g~^SdH<{TeBXP0 z_xSGjeaW{9U;Fh1S_AJ7bO){q>TzZv}9;G@BB2A>c9 zS@3k|PeOklYHT>aVSU3j4c9i@-0;nYg$8fqcN@Rg_}7j9(D-2ZoTiSZUo@#mTSPT` zn*Gh|ny+fkG=H}_cQ4MYtSG_aV4nfh)t!!QBCOC)|hO?t=RW z+^@oY6z*=gkHLK$?jE>L!2KHBC*kgeyASTy;XVa-KisF`egp0|;XVWRS-9VV`)#-f z;2wng9k|cI&BHwe_q%Wp!+jp^5xC!j`?qjkfO{0~i*R3pdkpSzxG%$f1@5bGPvB+K z*WkVm_axj?aNmIYeYGDa`1{p2;r;;f?%!e0ep>w-XsZ}BRSdH;CZiEnZ=cICIHEof zrdB(m&c%7>D)@gfK>7)xTkuJz{}%%uq4#z({#FxztHd+h+fCVYt4aSMlkbO2z8@00 zg+61sHu_AL|3$<1MZ@<+ll~b)f5y`k#y@8K8RKV-f86*5~f5`YhH@?rK^YeLhem;-R zFJR~aLk}2w$k0QE9y0VsLvJ+nMni8h^d>`ZGW2FcZ#ML1LysDI)X<}bzQWK~82SoB zzt3y>!)yA(%lfydPkDRgyT+eFJmuM^5bwdf|CGclwcn@b)38scANJ|=!#>^qgNA<4 z&<`4V!O#naUI6_x?u}04*66hQFx)+G_rpB^_j$O-;JyL30QaYGFTwpsxc>t8Pu7U9 z2p6~a`7-ut6^DDl&inoeH?seP_Z>gCGq&wH3bzw(FT#86H{oya?nTUA`+oTU2zQBZ zuYDcd1HS9kAHx3*+?&3Az6X3Gp#K)!0l0+l*q#yOm9}s4r{Q0(^8UT{?fwJ4m#hQ6 zZ@~R2T-?6b`%hL2>d*@J>)uO4KeMx;$L;quzGZvEAMkvPeS_a3-5xHWKV;Vyt{hg%2tUbyve z7s6cx_ddAy!)<`O8153dOW`hq+X%M_?sB-za2;@+a9wcSa6NEa;I_hTgWC@6a|PU$ zsMD3G(@xN?g6oCrgWCny54Q*Ldl0`D{$BX|;S-L)AAwJ)I|~0=_}9We0{;m7o8aFB ze;oce{0ZEL#(~FyC-83y_!RJ4;NJp&2L23u{I_H0_VMxV@s7=E$5?hSR!HtHW#YwD zHna1nq4#g=?&;gMd23(aw!!|bU0Zv$4)k~I+PrnJuX}q}N5|$Z9lHky2K)QEdir+n z9^Bs1-_yOddvNo%j_&Q9J)1i>tMT#CVyu{o_vQ1k*`Z9TI5wM0j;3x+UfFThSVWrI z5vx}_(yxo9io3Jr%VwQoHL?d+JiR)TM5%ORY=n=%`!Wy40?^)b6^} zp1Ra6b*WqHQtJ~t>sGfewW}_*yDqh-E_F*?>ejl{y2OsIy49^q?W#-du1oEyOWjhJ zy0tE~F0rG#ZguNYyXsQA>r#8_Qn%ElZq-zgK4(~=b=FtitU7w?Hm5GNt1h*>F14pF zbxU39*1FWX#Eva>t6P`aRhQabm)cX8x}`p~UKKjF)}waTrFPY&cGso$)TM5zORY=n z*jBeQd_xJGR%YSY2vYU21n-YEND2mbz3S4h)aRW9j7e)Y@1! z1H=2XC#pjGvWTrE3ICBA{z}N@uaJcQh8q4#$mOq)cE=J)ms=87LesHh$y(A_YGw&# z1a`>uawa#E-LZUsI+Ytq$1;_24kYVQ4`pG0RG6f)OK9vHH*2>wE@e1hoX*l@aVdwA zh3eo~DxJzqxv?X$;}n{Z)3HSMN*`Pp|bgmF~MXot7=>)7P%cu zO4{l)(tpdSyVA)_B6c*LtRF2|jbsZc#{!h%g?9;cw3yB9&sMRGW!(nvEzRWIfYiN) z(w|Ld^KQIbqgwK{$#}7f3wGVHzM@IAJDrU=_`q;&=n&Gmd5@${CDS#OzCx~=VR&+~ zkgV|UP9@Wc;mK=L$&+p#ZvA8~?wVa5p@*$rOx3v6i{_-ON0($vB8M`?WCr8nlyA)T zj{1gi2k4rk^9&rM8`IexS(?pm!mcwU1ic9RJv%w(vYvqx|tqQ+L z9hbina``JH85NN_E`KHD@>fWXSgI7p0o9=zu_UA#u_TmQvE(wjnJg7c!m&&&302P< zH>Ff|3C$5p!tb`mO;RJ4be^tQl3+zFNzf5OmF#LL%f*t;Q^aSj;Hl)GYg{LGnOM?Q zpjekQMpy~eU1ZC|l0+{POO>qL$*V_EOCgDNWR3)+?`kNnxRH3b0=49d6f(IuQV2m; z?nqQ^$dNe`RU?IjQjtOutVki9Rjm{fnp?jrDO4Mw$3cse+L)?|RWG_CXzCHx*T0+ z-~hdQaQEgdTetLecWl|Uy}y5VN5|IwuC3d44fOBY(%;kHw|TH{d(Y;cj-KwpuHBn= zZ|(2j*0XhU=eC}KU0b(r*-|N@ek~DS=@|*s^h}rH`O-v}o-fIKe>R^)sBhP(OrVi; zX)2WgLHCJUSVwpL(nvRbat4l0m!s)r@ymvbKkZtUH#kpdj`6? z1_ru&x;nS_Z`r-IyL&6n>pD9J`+5etw+!}e>)JN3ZJ-<8<{r0*Gn4>wr9UK4(;sf~ zjxA?sCFrJ=XW-~`InKZUa-|9qsHuXRykqMbssOr?7X8_oTskTCEX*J#Fm*da(oUD- z3=AMw>gF)hJY*R^Y~vuE4ZEnD3p&QO9I-?9A+ zH3!|){F+ocE%gS;)cXvHI)%gGIs+5P`?HBsI=K^n;whgxfo;(c2Wcjm;dyd4GmtFC zQt84@)t8w{Cp!n!ST;A1J(&SEno1-K@q9L&hM*mQ&`GDe22?Je%_Z~2*&(p1>!^@q z(+ouHQus1|oPfk0F|qXB*dwYy?E>QiA7YR_1f#VrYWQ!c=D$Imh^0%(@o^Q8p_YB= z+;mL!$EX5T{HU5K#IyNy>L@xSu7)!GrK2hO!=<7|M`sJg}Ol$Jeu3%Uf65VB;M%w`9YM854>;A$pWl!_E~%_8JZq=ed^%E;z)IvGo-G`FdO4P-OL zfh2k&J39;p#0_O&B-2CR33eUEJkfV5Rp?73luRurkSdHOkC&2}coO-?GO?-Ta7K#- z$HKa9I+^K9=TYXYjsWL4C&HmjVl;`s?o>WGH0fB!{nN3`6j|a1afiVvsBkD5i%*kf zf9#ZQsY7vj%}BVcag@*5h`Jv`N+{7}KCSWMvCe_P3~fVn*7R&46)#i>iR5A20?iJd z!j?9XOgManTs~DyI-yd^!4k>7QX-Xgg0bpAF?p)EKUtU_$-D8UIENjJWO@u-P8fZg zLkI1`RhLYfst{H%W?-?D8z{jvMZ+}H2~4nTUgPGPNhS4llN!&(O3Wx#-~{hWr?V#! z+KqDu^hbf0U8z_a(;pnwcwu)ctC%QFJIGXc-SVmk3G9EUSl zd1r`E6=ePHDy7m1h)|hxoGE#97?ku(ECX_OB%jP-@~FO?cmuQJ@>2-&bd zi37rfn$cbQngT76oQ##yMc%C%O0t6HG*7Akox?%S=2<7Sn^kl|lwOl2=1>x| zBc2qAhK`OO8_P3zIG2EWJb(i^1WMHbCaz2EIZH=KP*;#Vajbi@T!hNg$t9#2 zwkySHs+VX17vZPk=@MHm(~Nt`!ZhahaJ~=bQL4zOs!3Njo?TEkB3m!Fn42%IzGrg# zV^dfJEQXV7rX~boT!6m9O3=O$m^3VCwjm~+nuMJ_!^Pl`9Gk>&m^1@WVPfsX(p9{N zsLAjt499lSstv1k34sQEET2SQiON&#a31ifzLSK5Fj+DuvcPsFvE?+lvEi`(gjWnY z3L)oqLZzlMv@6^&JAjSRoVq(w8S0x--VnLsW@1Z-nA|l?s9jAM0>HihkY0vf#Z-Yy z$`Y;$viQOnRjtC|KJF7tAXV7q9QJd6t=AIN5gDmP;sD18O9|#i=|$nDT*8Wz5ZQfIvQ|0)3`+`}N;-#eS;P?EW@M#W zP!AW+mX5ixS`@$uN;Hb7!(Ug@GdFn&j*xWERA)OgS}P$`m-{iGgIg z7~`xHX(!68LSlx6I<$nF2o{{yaZtRHpJe6cu0z_A5ghwZQLk8!5~g7(;u-pYy9!o> zr51^BehWf*T)C4&8)}ZdB|)b8eoj)>QkdyvbtcTbhA@zio!pnoP!nJfj6x6$Q{yNp z+P2JKQDdAqKXJyCEfpD*=?e2M3;Y1VxM%>`P^SCSq*Mt`P69|15;6s1tC5pf>@+lj$%7d# zw8;v(N6%q3oKJBOSx&ZsA{H4zZ^rYfoQ`!=DC~TF!bzGWHBf?#zZ- z;7I^2YD^jvs|`c7A0{j+R=}n1OywvSlWbk?CcmH$3g?gAP+q>t0T9S zQwf)l&A8}rX0({hxxs90aH!zMq$((c93JEu^`YVpLP4VKrBUoDMZZAE=H=7`HA?gq zaYk{pgs45GR8>g!9#d3q6%OQnZK{x}p;2~IypN@d)vPW#56g5WmdBm7Q;yC#nZG)f zK<`%Q+}q${H(Nz=a-m+pe5)UcgPqCLl-a0OvUAeHfS1Kxld+==3#L6diE`_Qr7~5h z1lgr2ZZx?KO2LXT1R`7%sCf*D^j!u6Gdq>f=8XL!% z;fzN6fXU?3LG~raeL6dpkL9LQaX!kCa+VPXhKHS3JCs#&F%GK%C!NESI8`f7PdY+; zY#Lj_1oRmA^o=><^T)9LrtvBCiaJA+9kqu;yQ%A9c&dYx9HSf&jvS9a)oAIcJ_xN* zhE#Ez&}3mX$DLx1nsXS);3^$(u#_soa+!jmQgHEDx`0`nj2|1C9Fn69GO%Ct!3IOz z;nT;i2rWQ0v7yJIsG=&ynH3>MSGE``$BhO%1aK%L8WTPaDK$D$DoE@!I)^$M6@;b4 z;|&JlLJDl1GXC}Bs7qO+`ms1~U) zfU*y;UUi^Q9VqJMRAH0FQDLkKGLw^%9dpnaY5QbvrK(mq#~DUL!o*b8+mZ;@)$lMQ z*!tL{p*OL`ta=3|wJ+3?Sc9b`^Jq+skDbhp;M31Jis)E+_~${V~^es8F=HsDz8On}rv%OZ<2#pVvwsLXI<9 z&Q&q>;}9WfSp0c2Y!4if^AX9$`H(Vmf1<`v6SpCHrY>*FSXB5tT z67UXWIqM*V#6#iYPm(rtU~KTvfxdm?{bK7&u1B*)nEjHkK`~WfmEqJhQ^1+(jJ~p| z3Ui4T-B`X;5e+qzQLJz>mT|g-(*FSL4|7AsAgp{E=+a}V_F&U!JFP7>1Jh?k6js7$ ztPaGqmeG?7b|wdb#|}Kz7|8NGN!kach)1MFL(vaP^nMF>J$z@`X+q|ai4&*qG-@Ne zY9pPXPT5@>=>*M_2UL?sE)GwkI;7R16Qxz63GK^frVM%*V!^@3tMO7*fRfbk?@8ir zlv_Fz9+Dn1fg*d$;3L>IR$iwW;y4yH&xIg54Mn=niItu+0eQ&dL`?GKsR`hO%t3L_ z>Ea~o2VG7gM%GYJ_W^w=U|1kI40af@!%0_#mMXY8ixM;1;nbtqRZYvuOB%Ho*Sk1q z0&uo#mA(L}YU5T#H+v2_Kr@?B9G$>$!E&QDQeZNw9jxW?!x=nm(xx#8`ZNNUSI*%D zkH#ujY|h1+n#4qR16V`um79VQ>qaEZ_J+nvmHohT9L%;GWXH*BnB&^2aLqeH#P5RE zUH%!PP7}qgg9Qpsfn?U4>{N1Zm+>OgpiTb zZN~~dl$rgT@ z!ku6KsUv)V$g7_`c6Mx=BgcoGy*i0TrW=h!3T6X@p1d7LZK4oOk7Gd$L1~*$JY%Y6HeT;OK`{7rMP44Qpm%}>JrFOLnvn5 zIMXF=SnC=$m=@LJ1|dnz#jJVw;0DdHk?u*>Am=c$bT@!E4(1I$)M9b8l;hDI&c05? zlVTOZ!Y*XfIQqoc7$d>hucG0{vigV|zCJ-4%1mZel6Sv?4P^#T<+9qG)R?1SZ%F2| zqJC~Aaw2sU2bEc@GMXPy1>zma&Sn*Cf7S<69fN*dt|~mr-6<&X95f>zJn`s9LD?5m z{XD9dARqUqa>$rZE#b-V2|kj|!3L-ppHdrihpbZiqd4u!3AL2d>q+5;4UdWNv;sH$ z5`$eIio@j%PJvM%Dujpuy;T4sFPq};+75^ zuDRk+#vv$;1>=x#;(=QvC#3UsLgQ&E$_dKrpIymYQ^~wT8jtgF&=Ok0ls~?!G&zZS z9Mv8dHH=$ay5;qIODCZ922T+r&N-S=RpqHc^i`hHTNEo$*7OjhD2{=VT^{GMZV0!- z{8>dduLmU0sUS~%DY>9$+1vCmd+FVR(H!Bis)7irn6#P1Aq-7k%t{zl*`l7vkZs6M z^s|iGQS5Q1ARw`Ip@AbKzLZua@J+(htuuHFMSj#wBdD8+#G;D3d1(x4AG|QpupJuU8iHJUO3BZP`qA4ew)}yfZ}0KA)Uq=84Oi27!!a1-2 zj#*O`gcYQ~p4)oUsKh>*cT=(^$4b z+-0MeE2o%p8MleMTd;7qi=HzEo7AhIRbRin2{aT)WExLg6NVz^8}b0o5MYq%#UL-> z4AEU7)kK$*w^vIUt7xw2oU9VDTo?MxL!Oc@E!>2;B&y@xdYJg}Saqy!9hM=ck71DJ z)ll48>oX(6=Vn|(b$N{dSjxPF%yFt6A~U?T!&bHD#WaFYson*H60cz>l#V7+CvbU% zSHOB&xYtdb#WZDfDOF^tr?a4{=yKl@FF`At3oGQH-zD?q%BDlfsZu(YhoJ~TpbK=i zZ!RO$t@D7nrd6h;n})?~1-p6A<%A1M!n)>8to+8p2^4W@jo&6RM~9TF!fCBJ^vaIc zp&ZCMm>335K&xaYBnJXcKz944)|hV&8Qtfg+|fI@&Peam9a`3;?#~wF-U{*tx4$y75f`76k%BDQ%U{#6}k0ZLWCRL(qSGz8WL zS^{UWh9H7dXDri5vQH-`bqfXA$JYZwpO#lW(sqMNe@HwlAny!#{KVe}rSQy`I5d&Q zG1PG!AAve#%tZ-sZ3;4+fiQ7i-SC!GHe|F!hq3LJ$J;P&`392LF1uzO+E5>_*U(Ei zw4n7%ZzffUW9y;%ld1F=vd2V&Aj@ksp);eQEiXB%9^3F5BIjO8iJ-?3p{u*`-h7I; zRjOK{yF~0vDQ=+#z+swLAvlH|3_`}U=W-f#A8ff=+4)&f^*q>N*!1+>xyf8P{6Ec} zv#^=pE}g9q*77VlR8P}t)*U-L$6*4=ort2Tj@6E1Ox%_fRjfAXY*i_AaKr2jtO%M9WW)z~=n+2&i*O%aaYq+|qCV zlw)m~AQ+qoTxV7tL>TJmab&j}&q5U5AIghj%4Rjr8$rR+3{GOdioTM&G{=|f;8^ZN z@&IImGodIaczNc|;Qh%=37-n3ilDr%{5oFd@?=$*vYZhQZ!fOeQIV#AZqsui4qc?d9^cyg4QN+phF6SLIL z_)TY~fS1rRHhPOTl(`y5ps{>>dRAUd^W`1eJ~T6vOr+$Ro(5s%(q6^*3(MgQ*m8OU zC%Cg)FG$ES$|RsI7eS#reSh-!T!Lju{0g-UoJIfI_T`ALN&Vn(0i=;3#M*nZDyUGRRwpkf+S{6rK}F^U>yv9c+Lj`_FVmLoIlS2sE8!Om(!GSl1u$B>ZHGfrP zaE!Jl-pbEdstX3xuo}acn(>Sb-*g@YEaG1ZI38yybxm!2yTqh~BZhB5r|^y8n1r%O z(T=ZvmXHe1d_kRrzaQU-PQbqcaq2yn0p<~kk<8QpHb>vJV z?G(Q8nZy@BV-RF`w1eF9n%{G=QssxnKx)S)J((q>IU>6dj=|3Z&H^vGO=B@^VgmfE zdI_O|aFfQ*nKJWAV|1L86GJo7xFRrJp(L;(aQX$LoDnQ7rA$eTYVN=XPdnkd0XO3d z^kaq}cRIqs4rSiB1w^1juv~L4P4rY zc63Y(aqpMRk4gnM<6EqH9E#H9j1)Nq+5vS~?ZdxzbQ<%WM!qFU8AsP7rOJ9{u#>Ah z*IHV+L(-l~Z@vpEH-ffg&>z$9vYz`ihqY3~@cx7eOo7VAPJ)Y)hN7D|yOpw33;H5DCx@<3gu^MvfUWE&F{VoYT9MAdZHrXhJRCIgVQIoP@7c!!aq7 zY`<$xu`vz-4|BR=>2ek3@GkOk-eLhFm{ok=@_c+G&oa;W%Hbg*aa+!zfnPJq=bg( zidQ;#93ZcsZgRW3GE z@Ekdayx5DJ)T|}j&$>HSDr-VFuxu`X*0e$za1kMN9}gN->LMtU8e@|kK@5*!5TA;KF3Gruv1x{2BkVSqRpHa zM^Qi8Rn<$jT@4{ej=Nr@H)FwC>zRUc4R03E)+z8Lmh!A24`Xp2u{?IPUQ2f2i~4L4 zE$f}8ymoa6?HGZcIwUjZ4=!5T21guQhnMC#iSgfx8P^3^$!`?j;@^!t+hOewqiw{_ zlIx8$f%Ocj7JxLVIj$5$T4~e@BU-T(N;)OYWr{8K#|c?!R9UM0tMxN?v{dziNF;(%+qUIm&KV_k<6T#EN6rGIybhIDJi?C>Z>Q3 z-b7YUH^%GX;+{@VOXf+FNw-p$a1yoSRO8yvN<1cVl014tn!>8(CX#$wn>hUS$|$<4 zQ}4g^8q?EKZ*mdBF;EE?|rowZ83UT9qNGm!D^kP+1ANf~*{^;=Lc%06mB zPH4(~Zn4SF)K1^9J-Teo;na^D)D~KkQijk>$-wFDyw=ZJ2Ul9hzM-iS6K>XPH%dGO zNBOJE)#F{=!(4crdz?Yl=O!Ezo`y`JE{*{_30}5~^!;HRhODN1?dIlxm>9`K3LnqT4_;0@*tO|pZX|Q@8)x8 zDh+-uTpjy@#b}jJ5vN6-7NQzb(9^VcHbz+p!&)VI(iP_QN_G@5Wdh4~HY8Mvj%u$~ zcT_Y}D9=%Z>}(D`tvGJcwQzPsK67XN^trI3Fbk-WGn5=E?z`J@NXoym{Y~5NuykD#YuHGZ(5G)>jAdK z$(gqXL=l*QK{WLu{UZ@9;)Y@x`6rW6wXOXP5ji-I z)_()?W8HO&Sv#%d9dnCIkz$DFFC06XXllG&=9eBJ)cIHbUN!sk$C# z925kHP50G`m`&!ssk*-Xs4KTWmAdIk?<_pln3IHET`fwq1z0=y%Eui&VTV%hXFj+g zN6yRl9qgwaaNzD)&NqNIR+e&gZQWEI%TsB4lD$(m#pTOW>_e+4lIrqzE$8QWJH1dh z&85rJRQNaztJ=MBIqxXyQoS**;*M&O&l4zpc)Ro_anlklr!MG2X&l8FEH9pmZN%U1 z(?|GujJVZx_V|q$0dBH6!kiz>%PRls5e%x{*03v_TQp8~hAAnvDNkP?6gcu-A9B@R zW9jV?*RVcP)Kj}wMli+Fj!{$nRV9u}ddh>!O(TsBy=*8cxFq$aiL(AA@^fTXB?arP zkBYU1Waq2Z?C@HRq&IzPyt)R1XnXZN=h;hN%3ZhQ;p+S=wbTYgy_QvayKa6;t@*>R z?ELrdO%DFvL;vaaA6eFaP@Z=D4eNHx3i<$|=Maq$*x_?p%kOxiE%;Y{xj_O=P0{j8 z8f|EB(Z)ugO`3alO>{O|{+<(Rom&+xKW}n67(M9b6bvGbp&w_G??fbn*7Du>A8|Su zE#D>oFX}==p=kL{L{L2iQ=|0DMZ{$6=xO(f9Zk($Am9)&Oc0bg1OU%D5*^eud8 zRH(s&Mzh((bc2ZL))UiRNlbTkBQU26fxEpMZ1AjAYpu1mzujYn@!vVEb7M}H9{&nE z(C!twFMyVQ6rD78p%wPE+g95u1~ypXXdoO8hSwl1hCB#7hz5q)OQ={FJw)G&ljhk5 zRKm=Q<_61@r02=Gfo7A5n+uX1xBX%KO?PC??2d<#zhsNnH3s}aBt@~oASRhqT4%*Z z>$!>w&RDI9rhqQXG*pNyr9JnAO*Lc`ybV_C2*#?l%?#WIFh%Fm_FAz4& z83;E9LL3h}2yU;!7@QMmLTu|?d$=`GL6Fc!E&*>);`|ty;0h(JyI}^A`RF z_z|b;^~?~a2L#Rw{Jg*~2z)H46PNEIg4E@^TAbw0bP~p|3Vae3wa|M~;H)WdR-&F3 zcv|3sz~=>iN8pPBzh_dmn3OGURrPoZ(@O$hhGeoMg1$-=-H7?QDDZWGZwUN}z`qyx zGn0MEWM6W#*K0|bej)H3!aJlJ@9>&rx0__QyUFx&6ILnz4p|uCuuxhAuH>Ye7Ic-s zHi7K|FBG^z;AH|g3+y%}9ycW(cT3dE+ALBXkQCeWnx`zQ;$={xcL?kiIN&m9xe>s0 zyW{GpjM5$Zgk?nFn854JTF~(~32j1PLZEJ2TJW5}qQFxEZxdK%CusH$L%y1_J}Tls zFOG^h&|yh-kHC8c-Y@Vo0v})=2L+uM_<1Y>%xl5FAh;fm$At1#ftZ>qdR)+_1)dhT z;0xGott(9<_i4c$W>oo`jhM${Mmz@FJ+0F#ESt)ZvPQ2RC>I1A=Fo%^Li9pe+HJ%Ve2Gt0qn^7egBZxi`r4)S}^4UPZ+qx2Rp$QTqXxsQd zIyWt1qx@~#*RERUHU^Y85@~B|g9KbP#J-Mhngg)RSWvpAMirvhF1h4TAyKj5sUw#GBM^>H8pr!%O7qkC#YT{cf}qv`Kxh=OL!hrvEo3H>o5o@o)d}h9hy|mo6Vf9R zVs*Geq$xy7G>uq(SktNIK}DW=^#~)E(d|tEe^?e2Lt+j9VQCRvgm@be;#7}BLV*A) zh+z!0V}iZ_wMymuLS#h%DmCb_VFG(?r`rhYE08BGG8n&APKABM%BMeS3;KO{va*qW3t>uR>(O{EeiZupM`Df+-Uj$)} zmY7eD}L3DzRE{M)zd|5K8!qp0o_MlW2X&@k_hUon@;gx{~@Ut0f zqI0G>!KOekdJtsR0O|-1cX+|{&HrKHS;6pd^A3u84TJ<(Jf#GJhX zJ-Wieh@y5P(Az|XJS)rp87w|bfG9Q$;SgryTqzQroAtNbZEb77=LvG6L0;oO-)0Vj z59)Gm^W_20k}b&DgAj17bGPgN!z~sBcnfFjS{0?mR zTLzfvQD`*hg=Q~Nz?ICLg9Kr4Hd;IvIw&$l4VO9#t}Q=L%#F{myLy^n$XRnwpp>9G&w~Kg{_ks={H47BI+a03Y?f z)*=Vd9>{0#(s~!gGRq}S4T3pnMYM0-FGFSt)dc4gyoaETU=6`qf(r=R3Dyz3 zmtZ}?g#;H7ocH_R-!`)JWzPTCcS~z)4`zA3RsA!7OU@p>$(+YAk@q{SWGBE}%fFsS z*PcgvpV|76p7KZD9cPx_ziNKrDuP~1VfL4=0_g1pcygCzk?<|sAN2U6bYZxIw%_*p zqjNVAb&#hwfOs5#tOT_iZX4VVxL&vc6PKW!2%foikH7VL z+usInr606a7RqgHLuTb?fs8Q21QMo6xtrhxvcXvL_}6$4TV6oyEF+!*avan!1HX_h zhhus8{8YhSKyuEt5UeEd609N!qeglQ#1JcR$0D-7<5gm>x1h`#MFwj58Dt10#VG1A zTK|qBLxGU*s7!O6Qm6fv5-g5D%Q9BD8b_d zPoQHGO!Nl9Pe8ik?`fiQd(#roh*+ODx5nBiKwEDP!O*;Ug+dq>G|iWAW4pigW+Iv= z+@YB&k9nH%j(y62*PN25jlv zDA}}06qV}+tFh6Ik`1y%aW?|PJ`%pbR9?0U3^J+}}} z{OvlPn+Z3)K3LKDAJ_39RpRyLU&kNR@gRjSbn549^)*NNF3lp;@G1=1v_xPbNd$cS zAHJl;1Fa34LT{rniJd*TaIe)S0VBihN^{aub{pa}6hj+^B`;Z-V+zS2>eMtGZZdU{ zaSy*&an9p}!W_+NZYMjmI~ZQCIN)buf%zS_?e%hga7G?(3G9m$XUExjZ2P@V?dw(u z!edQkDD+u^u5t@J98rQ4#v+2yf-OmF9JVIWHY}#>xF&^d>j*8} zH1`2uldhg?kFxVIeMEX;4;&7!G!!$@xi3B#hQt&$_sEUp@?BvR(mE~4FaesJfK1F~ z`8lgJpqiD7^x;T7Vldol zI8A4eZy70A=^&oAl;2=|N|owV5vwYx#Uoj7uTKqPs!B&Z!5LgTC?L6gpv9A%VT5hB zWiA!F!gHPGYLTm1qrGm|a;IH>iR9yzrnnhEHo1N162qYRI7&E+gDBJsX4VWhX&C%) zg#*W^Dj@7yj76M~%nNYJoOwzjolN8)LuSy3E(Te?*A;*I1RD`p8R6)T=r*%x4?^_o zd1-EhzyjWIbejkjcV1(++<+y67H|?8lyj?5ce>1|3LbRmY#Zt;10!wkHE9{ZVhrL) z8*85atVFODiqijhJd-=v}9jvyQlT~=mzOq-NP_+ zzzczdeI|U^H(-zEaIMJT$`CyiH;+#{ysd2x7R|Y-a<)TkU5UaZQ>m^?PPo|h zMxa3&I#O??OIo?6#iK_VRlv!b47f(u!V+8KOaa$~fHKrLRHz%PC$pI>qT>WAX?UH}$@Lg;uo?|t zb~cXatdSYUyWp(l&DtB!mKoM~ZEk0+J-F>l&z7Ad&P<*-kFIHbO(1M{yJnm2oSJBC z+2jm)NtT%U9(`DaSb4NjTYpG?=>KpK${Di6Ze7`$h+sZqqVuAuHG#{fb_{nL1Omp6 zCYA*8j)1{7o=LS%+n2U@{MBm%H9Mo()Y9THw{ChJg_~PEcxk~|uL*4}9^DOfmR$I3 z>oIJvJTDrk}}M0FO2t8kdw|wvAzI99c$-(^t-32G^I)WQI1zdnEfDr^g%?&~1BVJMCCKNRFhL zZII6U9v`Hvm+t$X(|y81bEruY}FWt|D`g~c0cA7ct}9Y=cX%jSBvG!+;zmX+cTPgBPW@= z+&8*fDtgeJy9bxfU3Y^?jaED6a&q8~xr8cXEoR$ogffkJbh}&T?Musaj-BLATgr5MPa8z8WS3yX zwp~4-3Am1vvUEuIy?#tJmwwbfDFiy|dm!Wn%T;N4F)UmY&Z&F_8CVY*j5q4Jj z1^gde<8jN8jip;F301~af-p)EukT1TLD%C|+ycuSe$}amd&-DCU(K4;=4PdT9fQ>E zUt^Efu33lZ_ODs9l`(Z?qPu3Bad4qW$H)mcYy^I&oyRtO5u-8QzhN7+0*_+V3QwfP zqouUA1R^b76O`+7tQ?%8uYxMDo7?%A0+@v7_(FhD;f&Xu0kTj{FRq6v6o zDbkQa4l~yw>YjZG?+*0LbuEWzMH+%vMibS+nfA>*b!x+jIO-T7Ky7iAh_fQpw)|sk zmMHk>JBYhG!`;GaSXxqpWj0(ZvVwZ7eu|6pORe1GVJ?cda0rhs!!gxLWRBvnP1FO1 zHt8ILa_EH}DfVnQ{lZN$kHMn3aJX6FF~Hme?gwz_ha35j^6(-S2ClJniGrELFxo`F zSz#{m_|JGDsU!&;B3wt%!=(V&F^=5CbLjE!I0i)8>E0YKC15nPHS2KT0vJb7M znh(29VvRT}jBaRcBaX6K+oBtIk`~>--oQ3IBxi}d5ytF|w#XD|AoL%w^A2d>cVZCw2u`$-Qxoczh(eBAa*Y?ito(}wOg@tx(+RT3}P^r}KoIg&VEpJ05-uX3Ky_2)m zq0xcS&z+uoZPP^?22P(^`@qjHf8E164qS25z@D4%$>kHtbT)U>`1s)iLt{s}#{2j6 zjgAhE-ZXwS{)Wd1e4j6gIMY0^n?GP@KE*eClM{mv@7{zz{hGuF`5fA&T;eEe^zQwy z_g+0uSi>8Lx7V-hzA8TaiVJ^rbReDHk1s2#nL-?Y`XDKP(2r^V`$fp3r4K&<>{tBe z#cs7nU5)P*>{ZvOefaIm0mYAc9aM+Zs2aoXpRQHct0U?LQ)~ym@Y02k!u6;v_?E^t zd~rk%?*Dv#{0dPVKlb1+l&0__loWnXe+<8`nUNpEl|9i&!cmKkV+-OG%afPql=>KpnWF(d$z#D+GkSl*a$={6e$DBhLJ^pr? z|KU~-a162hNfW;_z+Z{!ui^-U`l=VzMIQVak@E$aa%JSz=_yx24*NsndIdS~eRR%NY0DSWCKmIaK|0I$hB4J8}*^F0!ZcE6)-(0g^ z{F!N`-nDN^I3CsM_$?pK+zLN`Nx0c{EGLX|*i-svy!x|=mD<(jzX@xEKkZalAM25B zAM)o9`mFkuD44ZoJCsnMSGmZ@DUO!X2bpMSYz5aDMe_&SW4USdy7b_HM x$o{V7U)t--`8_zxg^Vt;Om8juQX1jCWBF{14v~AnX7D literal 0 HcmV?d00001 diff --git a/Assets/Cyp/DOTween/DOTween.dll.meta b/Assets/Cyp/DOTween/DOTween.dll.meta new file mode 100644 index 00000000..37afb65d --- /dev/null +++ b/Assets/Cyp/DOTween/DOTween.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 08cc7e0f66446b04ba75e45c7b24653c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor.meta b/Assets/Cyp/DOTween/Editor.meta new file mode 100644 index 00000000..0616b239 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5bd109f9d3435fa4086af38943951e8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML b/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML new file mode 100644 index 00000000..9ebc2317 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML @@ -0,0 +1,107 @@ + + + + DOTweenEditor + + + +

+ Starts the update loop of tween in the editor. Has no effect during playMode. + + Eventual callback to call after every update + + + + Stops the update loop and clears the onPreviewUpdated callback. + + If TRUE also resets the tweened objects to their original state + + + + Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings. + + The tween to ready + If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc) + If TRUE prevents the tween from being auto-killed at completion + If TRUE starts playing the tween immediately + + + Full major version + first minor version (ex: 2018.1f) + + + Major version + + + First minor version (ex: in 2018.1 it would be 1) + + + + Checks that the given editor texture use the correct import settings, + and applies them if they're incorrect. + + + + + Returns TRUE if setup is required + + + + + Returns TRUE if the file/directory at the given path exists. + + Path, relative to Unity's project folder + + + + + Converts the given project-relative path to a full path, + with backward (\) slashes). + + + + + Converts the given full path to a path usable with AssetDatabase methods + (relative to Unity's project folder, and with the correct Unity forward (/) slashes). + + + + + Connects to a asset. + If the asset already exists at the given path, loads it and returns it. + Otherwise, either returns NULL or automatically creates it before loading and returning it + (depending on the given parameters). + + Asset type + File path (relative to Unity's project folder) + If TRUE and the requested asset doesn't exist, forces its creation + + + + Full path for the given loaded assembly, assembly file included + + + + + Adds the given global define if it's not already present + + + + + Removes the given global define if it's present + + + + + Returns TRUE if the given global define is present in all the + or only in the given , depending on passed parameters. + + + to use. Leave NULL to check in all of them. + + + + Not used as menu item anymore, but as a utiity function + + + + diff --git a/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML.meta b/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML.meta new file mode 100644 index 00000000..89041335 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/DOTweenEditor.XML.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5d818888072a944497927792f2a0d2d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor/DOTweenEditor.dll b/Assets/Cyp/DOTween/Editor/DOTweenEditor.dll new file mode 100644 index 0000000000000000000000000000000000000000..67927145c02223e00446612194d970b1d0e57c8a GIT binary patch literal 57344 zcmeFad3>A2wKqO`BtMenC6*V-OA^aY929RM30qhK&TdG^VkaSNiDD~>h;5liHi
(~_3le&X=`F7Qt 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 P00000NkvXXu0mjftl$Bl literal 0 HcmV?d00001 diff --git a/Assets/Cyp/DOTween/Editor/Imgs/DOTweenIcon.png.meta b/Assets/Cyp/DOTween/Editor/Imgs/DOTweenIcon.png.meta new file mode 100644 index 00000000..b556f4e0 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/Imgs/DOTweenIcon.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 20149745a4ba8ee48a506eb5c4676513 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Footer.png b/Assets/Cyp/DOTween/Editor/Imgs/Footer.png new file mode 100644 index 0000000000000000000000000000000000000000..e29d02fe18b777b1d316feb647b339803c5126de GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Footer.png.meta b/Assets/Cyp/DOTween/Editor/Imgs/Footer.png.meta new file mode 100644 index 00000000..f8567cba --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/Imgs/Footer.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 0bb7fcc0a5893cc4a87d7972d97eee40 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png b/Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e48db5ef7a2b83eff50d6e3b5fe9ba3bcd4a5015 GIT binary patch literal 4429 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 TqmFO~00000NkvXXu0mjf{EM6C literal 0 HcmV?d00001 diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png.meta b/Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png.meta new file mode 100644 index 00000000..7b522dd6 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/Imgs/Footer_dark.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: e7d251cea0af5d946b9d6ad10f66972a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 256 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Header.jpg b/Assets/Cyp/DOTween/Editor/Imgs/Header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d710d719075150879b1ee76680af87791c4d3b3 GIT binary patch literal 22787 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 QE#Li`lK-oJv9mh=KQ4fgsQ>@~ literal 0 HcmV?d00001 diff --git a/Assets/Cyp/DOTween/Editor/Imgs/Header.jpg.meta b/Assets/Cyp/DOTween/Editor/Imgs/Header.jpg.meta new file mode 100644 index 00000000..5cfc6720 --- /dev/null +++ b/Assets/Cyp/DOTween/Editor/Imgs/Header.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 5ecae3c8d7bfa544ab1cb284527e8d08 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules.meta b/Assets/Cyp/DOTween/Modules.meta new file mode 100644 index 00000000..025585c5 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05226964a51bfc849802886d60856486 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef b/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef new file mode 100644 index 00000000..42ef5aba --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef @@ -0,0 +1,3 @@ +{ + "name": "DOTween.Modules" +} diff --git a/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef.meta b/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef.meta new file mode 100644 index 00000000..7b77cd06 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTween.Modules.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dccc35bc96b1b844e9df479fdc5979a6 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs b/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs new file mode 100644 index 00000000..c195b6cc --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs @@ -0,0 +1,202 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +using UnityEngine; +#if UNITY_5 || UNITY_2017_1_OR_NEWER +using UnityEngine.Audio; // Required for AudioMixer +#endif + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleAudio + { + #region Shortcuts + + #region Audio + + /// Tweens an AudioSource's volume to the given value. + /// Also stores the AudioSource as the tween's target so it can be used for filtered operations + /// The end value to reach (0 to 1)The duration of the tween + public static TweenerCore DOFade(this AudioSource target, float endValue, float duration) + { + if (endValue < 0) endValue = 0; + else if (endValue > 1) endValue = 1; + TweenerCore t = DOTween.To(() => target.volume, x => target.volume = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an AudioSource's pitch to the given value. + /// Also stores the AudioSource as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPitch(this AudioSource target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + +#if UNITY_5 || UNITY_2017_1_OR_NEWER + #region AudioMixer (Unity 5 or Newer) + + /// Tweens an AudioMixer's exposed float to the given value. + /// Also stores the AudioMixer as the tween's target so it can be used for filtered operations. + /// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer. + /// Name given to the exposed float to set + /// The end value to reachThe duration of the tween + public static TweenerCore DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration) + { + TweenerCore t = DOTween.To(()=> { + float currVal; + target.GetFloat(floatName, out currVal); + return currVal; + }, x=> target.SetFloat(floatName, x), endValue, duration); + t.SetTarget(target); + return t; + } + + #region Operation Shortcuts + + /// + /// Completes all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens completed + /// (meaning the tweens that don't have infinite loops and were not already complete) + /// + /// For Sequences only: if TRUE also internal Sequence callbacks will be fired, + /// otherwise they will be ignored + public static int DOComplete(this AudioMixer target, bool withCallbacks = false) + { + return DOTween.Complete(target, withCallbacks); + } + + /// + /// Kills all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens killed. + /// + /// If TRUE completes the tween before killing it + public static int DOKill(this AudioMixer target, bool complete = false) + { + return DOTween.Kill(target, complete); + } + + /// + /// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens flipped. + /// + public static int DOFlip(this AudioMixer target) + { + return DOTween.Flip(target); + } + + /// + /// Sends to the given position all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens involved. + /// + /// Time position to reach + /// (if higher than the whole tween duration the tween will simply reach its end) + /// If TRUE will play the tween after reaching the given position, otherwise it will pause it + public static int DOGoto(this AudioMixer target, float to, bool andPlay = false) + { + return DOTween.Goto(target, to, andPlay); + } + + /// + /// Pauses all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens paused. + /// + public static int DOPause(this AudioMixer target) + { + return DOTween.Pause(target); + } + + /// + /// Plays all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlay(this AudioMixer target) + { + return DOTween.Play(target); + } + + /// + /// Plays backwards all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlayBackwards(this AudioMixer target) + { + return DOTween.PlayBackwards(target); + } + + /// + /// Plays forward all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlayForward(this AudioMixer target) + { + return DOTween.PlayForward(target); + } + + /// + /// Restarts all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens restarted. + /// + public static int DORestart(this AudioMixer target) + { + return DOTween.Restart(target); + } + + /// + /// Rewinds all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens rewinded. + /// + public static int DORewind(this AudioMixer target) + { + return DOTween.Rewind(target); + } + + /// + /// Smoothly rewinds all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens rewinded. + /// + public static int DOSmoothRewind(this AudioMixer target) + { + return DOTween.SmoothRewind(target); + } + + /// + /// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens involved. + /// + public static int DOTogglePause(this AudioMixer target) + { + return DOTween.TogglePause(target); + } + + #endregion + + #endregion +#endif + + #endregion + } +} +#endif diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs.meta new file mode 100644 index 00000000..59955d8e --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleAudio.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01ac86b18e4c5f84d8ddbef110e9a991 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs new file mode 100644 index 00000000..08b07006 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs @@ -0,0 +1,216 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Core.Enums; +using DG.Tweening.Plugins; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; +using UnityEngine; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModulePhysics + { + #region Shortcuts + + #region Rigidbody + + /// Tweens a Rigidbody's position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMove(this Rigidbody target, Vector3 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's X position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveX(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's Y position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveY(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's Z position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveZ(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's rotation to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// Rotation mode + public static TweenerCore DORotate(this Rigidbody target, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); + t.SetTarget(target); + t.plugOptions.rotateMode = mode; + return t; + } + + /// Tweens a Rigidbody's rotation so that it will look towards the given position. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The position to look atThe duration of the tween + /// Eventual axis constraint for the rotation + /// The vector that defines in which direction up is (default: Vector3.up) + public static TweenerCore DOLookAt(this Rigidbody target, Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3? up = null) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, towards, duration) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetLookAt); + t.plugOptions.axisConstraint = axisConstraint; + t.plugOptions.up = (up == null) ? Vector3.up : (Vector3)up; + return t; + } + + #region Special + + /// Tweens a Rigidbody's position to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJump(this Rigidbody target, Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, jumpPower, 0), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(() => startPosY = target.position.y); + s.Append(DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue.x, 0, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue.z), duration) + .SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + yTween.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector3 pos = target.position; + pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); + target.MovePosition(pos); + }); + return s; + } + + /// Tweens a Rigidbody's position through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations. + /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOPath. + /// The waypoints to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOPath( + this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, new Path(pathType, path, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + return t; + } + /// Tweens a Rigidbody's localPosition through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations + /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOLocalPath. + /// The waypoint to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOLocalPath( + this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + // Used by path editor when creating the actual tween, so it can pass a pre-compiled path + internal static TweenerCore DOPath( + this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + return t; + } + internal static TweenerCore DOLocalPath( + this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs.meta new file mode 100644 index 00000000..7b7c4839 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8c7032de82528f48b06a2999e912880 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs new file mode 100644 index 00000000..eab2cbf1 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs @@ -0,0 +1,168 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Plugins; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; +using UnityEngine; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModulePhysics2D + { + #region Shortcuts + + #region Rigidbody2D Shortcuts + + /// Tweens a Rigidbody2D's position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMove(this Rigidbody2D target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's X position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveX(this Rigidbody2D target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's Y position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveY(this Rigidbody2D target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's rotation to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DORotate(this Rigidbody2D target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); + t.SetTarget(target); + return t; + } + + #region Special + + /// Tweens a Rigidbody2D's position to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. + /// IMPORTANT: a rigidbody2D can't be animated in a jump arc using MovePosition, so the tween will directly set the position + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJump(this Rigidbody2D target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.position, x => target.position = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(() => startPosY = target.position.y); + s.Append(DOTween.To(() => target.position, x => target.position = x, new Vector2(endValue.x, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + yTween.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector3 pos = target.position; + pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); + target.MovePosition(pos); + }); + return s; + } + + /// Tweens a Rigidbody2D's position through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. + /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOPath. + /// The waypoints to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOPath( + this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + int len = path.Length; + Vector3[] path3D = new Vector3[len]; + for (int i = 0; i < len; ++i) path3D[i] = path[i]; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), new Path(pathType, path3D, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + return t; + } + /// Tweens a Rigidbody2D's localPosition through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOLocalPath. + /// The waypoint to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOLocalPath( + this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + int len = path.Length; + Vector3[] path3D = new Vector3[len]; + for (int i = 0; i < len; ++i) path3D[i] = path[i]; + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path3D, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs.meta new file mode 100644 index 00000000..1e0e27b8 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModulePhysics2D.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1642d6c12dcc0264695dd772af97676a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs b/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs new file mode 100644 index 00000000..549fff39 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs @@ -0,0 +1,93 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER +using System; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleSprite + { + #region Shortcuts + + #region SpriteRenderer + + /// Tweens a SpriteRenderer's color to the given value. + /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this SpriteRenderer target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Material's alpha color to the given value. + /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this SpriteRenderer target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a SpriteRenderer's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this SpriteRenderer target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #region Blendables + + #region SpriteRenderer + + /// Tweens a SpriteRenderer's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the SpriteRenderer as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this SpriteRenderer target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs.meta new file mode 100644 index 00000000..1ef6ecfd --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleSprite.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8a98320011f2824ea2cf9981be3e919 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs b/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs new file mode 100644 index 00000000..ee32bede --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs @@ -0,0 +1,634 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER + +using System; +using System.Globalization; +using UnityEngine; +using UnityEngine.UI; +using DG.Tweening.Core; +using DG.Tweening.Core.Enums; +using DG.Tweening.Plugins.Options; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleUI + { + #region Shortcuts + + #region CanvasGroup + + /// Tweens a CanvasGroup's alpha color to the given value. + /// Also stores the canvasGroup as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this CanvasGroup target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.alpha, x => target.alpha = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region Graphic + + /// Tweens an Graphic's color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Graphic target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Graphic's alpha color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Graphic target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region Image + + /// Tweens an Image's color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Image target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's alpha color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Image target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's fillAmount to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reach (0 to 1)The duration of the tween + public static TweenerCore DOFillAmount(this Image target, float endValue, float duration) + { + if (endValue > 1) endValue = 1; + else if (endValue < 0) endValue = 0; + TweenerCore t = DOTween.To(() => target.fillAmount, x => target.fillAmount = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's colors using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this Image target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #region LayoutElement + + /// Tweens an LayoutElement's flexibleWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => { + target.flexibleWidth = x.x; + target.flexibleHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens an LayoutElement's minWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => { + target.minWidth = x.x; + target.minHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens an LayoutElement's preferredWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => { + target.preferredWidth = x.x; + target.preferredHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + #endregion + + #region Outline + + /// Tweens a Outline's effectColor to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Outline target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.effectColor, x => target.effectColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Outline's effectColor alpha to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Outline target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.effectColor, x => target.effectColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Outline's effectDistance to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScale(this Outline target, Vector2 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.effectDistance, x => target.effectDistance = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region RectTransform + + /// Tweens a RectTransform's anchoredPosition to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPosX(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPosY(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchoredPosition3D to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3D(this RectTransform target, Vector3 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DX(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DY(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D Z to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DZ(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchorMax to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorMax(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchorMax, x => target.anchorMax = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchorMin to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorMin(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchorMin, x => target.anchorMin = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's pivot to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivot(this RectTransform target, Vector2 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, endValue, duration); + t.SetTarget(target); + return t; + } + /// Tweens a RectTransform's pivot X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivotX(this RectTransform target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X).SetTarget(target); + return t; + } + /// Tweens a RectTransform's pivot Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivotY(this RectTransform target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's sizeDelta to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOSizeDelta(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.sizeDelta, x => target.sizeDelta = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Punches a RectTransform's anchoredPosition towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The direction and strength of the punch (added to the RectTransform's current position) + /// The duration of the tween + /// Indicates how much will the punch vibrate + /// Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + /// 1 creates a full oscillation between the punch direction and the opposite direction, + /// while 0 oscillates only between the punch and the start position + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOPunchAnchorPos(this RectTransform target, Vector2 punch, float duration, int vibrato = 10, float elasticity = 1, bool snapping = false) + { + return DOTween.Punch(() => target.anchoredPosition, x => target.anchoredPosition = x, punch, duration, vibrato, elasticity) + .SetTarget(target).SetOptions(snapping); + } + + /// Shakes a RectTransform's anchoredPosition with the given values. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the tween will smoothly snap all values to integers + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, float strength = 100, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) + { + return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, true, fadeOut) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); + } + /// Shakes a RectTransform's anchoredPosition with the given values. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The shake strength on each axis + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the tween will smoothly snap all values to integers + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, Vector2 strength, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) + { + return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, fadeOut) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); + } + + #region Special + + /// Tweens a RectTransform's anchoredPosition to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJumpAnchorPos(this RectTransform target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + + // Separate Y Tween so we can elaborate elapsedPercentage on that insted of on the Sequence + // (in case users add a delay or other elements to the Sequence) + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(()=> startPosY = target.anchoredPosition.y); + s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + s.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector2 pos = target.anchoredPosition; + pos.y += DOVirtual.EasedValue(0, offsetY, s.ElapsedDirectionalPercentage(), Ease.OutQuad); + target.anchoredPosition = pos; + }); + return s; + } + + #endregion + + #endregion + + #region ScrollRect + + /// Tweens a ScrollRect's horizontal/verticalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false) + { + return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition), + x => { + target.horizontalNormalizedPosition = x.x; + target.verticalNormalizedPosition = x.y; + }, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + /// Tweens a ScrollRect's horizontalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOHorizontalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) + { + return DOTween.To(() => target.horizontalNormalizedPosition, x => target.horizontalNormalizedPosition = x, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + /// Tweens a ScrollRect's verticalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOVerticalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) + { + return DOTween.To(() => target.verticalNormalizedPosition, x => target.verticalNormalizedPosition = x, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + + #endregion + + #region Slider + + /// Tweens a Slider's value to the given value. + /// Also stores the Slider as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOValue(this Slider target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.value, x => target.value = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + #endregion + + #region Text + + /// Tweens a Text's color to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Text target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// + /// Tweens a Text's text from one integer to another, with options for thousands separators + /// + /// The value to start from + /// The end value to reach + /// The duration of the tween + /// If TRUE (default) also adds thousands separators + /// The to use (InvariantCulture if NULL) + public static TweenerCore DOCounter( + this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null + ){ + int v = fromValue; + CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; + TweenerCore t = DOTween.To(() => v, x => { + v = x; + target.text = addThousandsSeparator + ? v.ToString("N0", cInfo) + : v.ToString(); + }, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Text's alpha color to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Text target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Text's text to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end string to tween toThe duration of the tween + /// If TRUE (default), rich text will be interpreted correctly while animated, + /// otherwise all tags will be considered as normal text + /// The type of scramble mode to use, if any + /// A string containing the characters to use for scrambling. + /// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + /// Leave it to NULL (default) to use default ones + public static TweenerCore DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) + { + if (endValue == null) { + if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors"); + endValue = ""; + } + TweenerCore t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); + t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) + .SetTarget(target); + return t; + } + + #endregion + + #region Blendables + + #region Graphic + + /// Tweens a Graphic's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Graphic as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Graphic target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #region Image + + /// Tweens a Image's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Image as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Image target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #region Text + + /// Tweens a Text's color BY the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Text target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #endregion + + #endregion + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + public static class Utils + { + /// + /// Converts the anchoredPosition of the first RectTransform to the second RectTransform, + /// taking into consideration offset, anchors and pivot, and returns the new anchoredPosition + /// + public static Vector2 SwitchToRectTransform(RectTransform from, RectTransform to) + { + Vector2 localPoint; + Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * 0.5f + from.rect.xMin, from.rect.height * 0.5f + from.rect.yMin); + Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position); + screenP += fromPivotDerivedOffset; + RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint); + Vector2 pivotDerivedOffset = new Vector2(to.rect.width * 0.5f + to.rect.xMin, to.rect.height * 0.5f + to.rect.yMin); + return to.anchoredPosition + localPoint - pivotDerivedOffset; + } + } + } +} +#endif diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs.meta new file mode 100644 index 00000000..87aa256f --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b940c894434a6645b76282dd3490df9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs b/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs new file mode 100644 index 00000000..49a22bce --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs @@ -0,0 +1,403 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +using System; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) +using System.Threading.Tasks; +#endif + +#pragma warning disable 1591 +namespace DG.Tweening +{ + /// + /// Shortcuts/functions that are not strictly related to specific Modules + /// but are available only on some Unity versions + /// + public static class DOTweenModuleUnityVersion + { +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER + #region Unity 4.3 or Newer + + #region Material + + /// Tweens a Material's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this Material target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + /// Tweens a Material's named color property using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to use + /// The name of the material property to tween (like _Tint or _SpecColor) + /// The duration of the tween + public static Sequence DOGradientColor(this Material target, Gradient gradient, string property, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.SetColor(property, c.color); + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, property, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #endregion +#endif + +#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER + #region Unity 5.3 or Newer + + #region CustomYieldInstructions + + /// + /// Returns a that waits until the tween is killed or complete. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForCompletion(true); + /// + public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForCompletion(t); + } + + /// + /// Returns a that waits until the tween is killed or rewinded. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForRewind(); + /// + public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForRewind(t); + } + + /// + /// Returns a that waits until the tween is killed. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForKill(); + /// + public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForKill(t); + } + + /// + /// Returns a that waits until the tween is killed or has gone through the given amount of loops. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForElapsedLoops(2); + /// + /// Elapsed loops to wait for + public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForElapsedLoops(t, elapsedLoops); + } + + /// + /// Returns a that waits until the tween is killed + /// or has reached the given time position (loops included, delays excluded). + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForPosition(2.5f); + /// + /// Position (loops included, delays excluded) to wait for + public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForPosition(t, position); + } + + /// + /// Returns a that waits until the tween is killed or started + /// (meaning when the tween is set in a playing state the first time, after any eventual delay). + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForStart(); + /// + public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForStart(t); + } + + #endregion + + #endregion +#endif + +#if UNITY_2018_1_OR_NEWER + #region Unity 2018.1 or Newer + + #region Material + + /// Tweens a Material's named texture offset property with the given ID to the given value. + /// Also stores the material as the tween's target so it can be used for filtered operations + /// The end value to reach + /// The ID of the material property to tween (also called nameID in Unity's manual) + /// The duration of the tween + public static TweenerCore DOOffset(this Material target, Vector2 endValue, int propertyID, float duration) + { + if (!target.HasProperty(propertyID)) { + if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); + return null; + } + TweenerCore t = DOTween.To(() => target.GetTextureOffset(propertyID), x => target.SetTextureOffset(propertyID, x), endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Material's named texture scale property with the given ID to the given value. + /// Also stores the material as the tween's target so it can be used for filtered operations + /// The end value to reach + /// The ID of the material property to tween (also called nameID in Unity's manual) + /// The duration of the tween + public static TweenerCore DOTiling(this Material target, Vector2 endValue, int propertyID, float duration) + { + if (!target.HasProperty(propertyID)) { + if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); + return null; + } + TweenerCore t = DOTween.To(() => target.GetTextureScale(propertyID), x => target.SetTextureScale(propertyID, x), endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region .NET 4.6 or Newer + +#if (NET_4_6 || NET_STANDARD_2_0) + + #region Async Instructions + + /// + /// Returns an async that waits until the tween is killed or complete. + /// It can be used inside an async operation. + /// Example usage:await myTween.WaitForCompletion(); + /// + public static async Task AsyncWaitForCompletion(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && !t.IsComplete()) await Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or rewinded. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForRewind(); + /// + public static async Task AsyncWaitForRewind(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForKill(); + /// + public static async Task AsyncWaitForKill(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active) await Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or has gone through the given amount of loops. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForElapsedLoops(); + /// + /// Elapsed loops to wait for + public static async Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && t.CompletedLoops() < elapsedLoops) await Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or started + /// (meaning when the tween is set in a playing state the first time, after any eventual delay). + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForPosition(); + /// + /// Position (loops included, delays excluded) to wait for + public static async Task AsyncWaitForPosition(this Tween t, float position) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && t.position * (t.CompletedLoops() + 1) < position) await Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForKill(); + /// + public static async Task AsyncWaitForStart(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && !t.playedOnce) await Task.Yield(); + } + + #endregion +#endif + + #endregion + + #endregion +#endif + } + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ CLASSES █████████████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + +#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER + public static class DOTweenCYInstruction + { + public class WaitForCompletion : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && !t.IsComplete(); + }} + readonly Tween t; + public WaitForCompletion(Tween tween) + { + t = tween; + } + } + + public class WaitForRewind : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0); + }} + readonly Tween t; + public WaitForRewind(Tween tween) + { + t = tween; + } + } + + public class WaitForKill : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active; + }} + readonly Tween t; + public WaitForKill(Tween tween) + { + t = tween; + } + } + + public class WaitForElapsedLoops : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && t.CompletedLoops() < elapsedLoops; + }} + readonly Tween t; + readonly int elapsedLoops; + public WaitForElapsedLoops(Tween tween, int elapsedLoops) + { + t = tween; + this.elapsedLoops = elapsedLoops; + } + } + + public class WaitForPosition : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && t.position * (t.CompletedLoops() + 1) < position; + }} + readonly Tween t; + readonly float position; + public WaitForPosition(Tween tween, float position) + { + t = tween; + this.position = position; + } + } + + public class WaitForStart : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && !t.playedOnce; + }} + readonly Tween t; + public WaitForStart(Tween tween) + { + t = tween; + } + } + } +#endif +} diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta new file mode 100644 index 00000000..f4c1af2c --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2d2b0aa9e239b5440924a7bf168b9e55 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs b/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs new file mode 100644 index 00000000..8a1fb5f0 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs @@ -0,0 +1,155 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +using System; +using System.Reflection; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + /// + /// Utility functions that deal with available Modules. + /// Modules defines: + /// - DOTAUDIO + /// - DOTPHYSICS + /// - DOTPHYSICS2D + /// - DOTSPRITE + /// - DOTUI + /// Extra defines set and used for implementation of external assets: + /// - DOTWEEN_TMP ► TextMesh Pro + /// - DOTWEEN_TK2D ► 2D Toolkit + /// + public static class DOTweenModuleUtils + { + static bool _initialized; + + #region Reflection + + /// + /// Called via Reflection by DOTweenComponent on Awake + /// +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static void Init() + { + if (_initialized) return; + + _initialized = true; + DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath; + +#if UNITY_EDITOR +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 + UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged; +#else + UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged; +#endif +#endif + } + +#if UNITY_2018_1_OR_NEWER +#pragma warning disable + [UnityEngine.Scripting.Preserve] + // Just used to preserve methods when building, never called + static void Preserver() + { + Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub"); + } +#pragma warning restore +#endif + + #endregion + +#if UNITY_EDITOR + // Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime) +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 + static void PlaymodeStateChanged() + #else + static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) +#endif + { + if (DOTween.instance == null) return; + DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused); + } +#endif + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + public static class Physics + { + // Called via DOTweenExternalCommand callback + public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans) + { +#if true // PHYSICS_MARKER + if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot; + else trans.rotation = newRot; +#else + trans.rotation = newRot; +#endif + } + + // Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached + public static bool HasRigidbody2D(Component target) + { +#if true // PHYSICS2D_MARKER + return target.GetComponent() != null; +#else + return false; +#endif + } + + #region Called via Reflection + + + // Called via Reflection by DOTweenPathInspector + // Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static bool HasRigidbody(Component target) + { +#if true // PHYSICS_MARKER + return target.GetComponent() != null; +#else + return false; +#endif + } + + // Called via Reflection by DOTweenPath +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static TweenerCore CreateDOTweenPathTween( + MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode + ){ + TweenerCore t; +#if true // PHYSICS_MARKER + Rigidbody rBody = tweenRigidbody ? target.GetComponent() : null; + if (tweenRigidbody && rBody != null) { + t = isLocal + ? rBody.DOLocalPath(path, duration, pathMode) + : rBody.DOPath(path, duration, pathMode); + } else { + t = isLocal + ? target.transform.DOLocalPath(path, duration, pathMode) + : target.transform.DOPath(path, duration, pathMode); + } +#else + t = isLocal + ? target.transform.DOLocalPath(path, duration, pathMode) + : target.transform.DOPath(path, duration, pathMode); +#endif + return t; + } + + #endregion + } + } +} diff --git a/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs.meta b/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs.meta new file mode 100644 index 00000000..dc506af6 --- /dev/null +++ b/Assets/Cyp/DOTween/Modules/DOTweenModuleUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e1e50fd40010c744aa91dc2bef4f54b8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DOTween/readme.txt b/Assets/Cyp/DOTween/readme.txt new file mode 100644 index 00000000..37ff7ef5 --- /dev/null +++ b/Assets/Cyp/DOTween/readme.txt @@ -0,0 +1,29 @@ +DOTween and DOTween Pro are copyright (c) 2014-2018 Daniele Giardini - Demigiant + +// IMPORTANT!!! ///////////////////////////////////////////// +// Upgrading DOTween from versions older than 1.2.000 /////// +// (or DOTween Pro older than 1.0.000) ////////////////////// +------------------------------------------------------------- +If you're upgrading your project from a version of DOTween older than 1.2.000 (or DOTween Pro older than 1.0.000) please follow these instructions carefully. +1) Import the new version in the same folder as the previous one, overwriting old files. A lot of errors will appear but don't worry +2) Close and reopen Unity (and your project). This is fundamental: skipping this step will cause a bloodbath +3) Open DOTween's Utility Panel (Tools > Demigiant > DOTween Utility Panel) if it doesn't open automatically, then press "Setup DOTween...": this will run the upgrade setup +4) From the Add/Remove Modules panel that opens, activate/deactivate Modules for Unity systems and for external assets (Pro version only) + +// GET STARTED ////////////////////////////////////////////// + +- After importing a new DOTween update, select DOTween's Utility Panel from the "Tools/Demigiant" menu (if it doesn't open automatically) and press the "Setup DOTween..." button to activate/deactivate Modules. You can also access a Preferences Tab from there to choose default settings for DOTween. +- In your code, add "using DG.Tweening" to each class where you want to use DOTween. +- You're ready to tween. Check out the links below for full documentation and license info. + + +// LINKS /////////////////////////////////////////////////////// + +DOTween website (documentation, examples, etc): http://dotween.demigiant.com +DOTween license: http://dotween.demigiant.com/license.php +DOTween repository (Google Code): https://code.google.com/p/dotween/ +Demigiant website (documentation, examples, etc): http://www.demigiant.com + +// NOTES ////////////////////////////////////////////////////// + +- DOTween's Utility Panel can be found under "Tools > Demigiant > DOTween Utility Panel" and also contains other useful options, plus a tab to set DOTween's preferences \ No newline at end of file diff --git a/Assets/Cyp/DOTween/readme.txt.meta b/Assets/Cyp/DOTween/readme.txt.meta new file mode 100644 index 00000000..6d7abffb --- /dev/null +++ b/Assets/Cyp/DOTween/readme.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a0001e85e740be544ae393267014b871 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DemoShader.meta b/Assets/Cyp/DemoShader.meta new file mode 100644 index 00000000..b3661684 --- /dev/null +++ b/Assets/Cyp/DemoShader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5786aec61946927418871e60a0bc7c63 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DemoShader/ScrollTest.cs b/Assets/Cyp/DemoShader/ScrollTest.cs new file mode 100644 index 00000000..4c820882 --- /dev/null +++ b/Assets/Cyp/DemoShader/ScrollTest.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using UnityEngine; +using UnityEngine.UI; + +public class ScrollTest : MonoBehaviour +{ + // Start is called before the first frame update + private ScrollRect scroll; + void Start() + { + scroll = gameObject.GetComponent(); + } + private bool dir = true; + // Update is called once per frame + void Update() + { + if (dir) + { + scroll.horizontalNormalizedPosition += 0.01f; + if (scroll.horizontalNormalizedPosition >= 1) + { + dir = false; + } + } + else + { + scroll.horizontalNormalizedPosition -= 0.01f; + if (scroll.horizontalNormalizedPosition <= 0) + { + dir = true; + } + } + } +} diff --git a/Assets/Cyp/DemoShader/ScrollTest.cs.meta b/Assets/Cyp/DemoShader/ScrollTest.cs.meta new file mode 100644 index 00000000..033faa24 --- /dev/null +++ b/Assets/Cyp/DemoShader/ScrollTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6adf1f0c1d929374aac00f3a6a2445bf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/DemoShader/ScrollTest2.cs b/Assets/Cyp/DemoShader/ScrollTest2.cs new file mode 100644 index 00000000..91e31813 --- /dev/null +++ b/Assets/Cyp/DemoShader/ScrollTest2.cs @@ -0,0 +1,65 @@ +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using UnityEngine; +using UnityEngine.UI; + +public class ScrollTest2 : MonoBehaviour +{ + // Start is called before the first frame update + private ScrollRect scroll; + private Transform content; + private float contentSize; + [SerializeField] Button L, R; + void Start() + { + scroll = gameObject.GetComponent(); + content = gameObject.transform.Find("Viewport").Find("Content"); + + contentSize = 1f/(content.childCount-2); + scroll.horizontalNormalizedPosition = contentSize / 2; + if (L != null) + { + L.onClick.AddListener(goLeft); + } + if (R != null) + { + R.onClick.AddListener(goRight); + } + } + void goLeft() + { + if (scroll.horizontalNormalizedPosition <= contentSize) return; + start = true; + scrollValue = -1 * contentSize / 30; + } + void goRight() + { + if ((scroll.horizontalNormalizedPosition + contentSize)>=1) return; + start = true; + scrollValue = contentSize / 30; + } + private bool start = false, _lock = false; + private float scrollValue = 0,totalScrollValue = 0; + // Update is called once per frame + void Update() + { + if (start) + { + if (_lock) return; + _lock = true; + totalScrollValue += scrollValue; + if (System.Math.Abs(totalScrollValue) >= contentSize) + { + scrollValue = 0; + start = false; + totalScrollValue = 0; + } + else + { + scroll.horizontalNormalizedPosition += scrollValue; + } + _lock = false; + } + } +} diff --git a/Assets/Cyp/DemoShader/ScrollTest2.cs.meta b/Assets/Cyp/DemoShader/ScrollTest2.cs.meta new file mode 100644 index 00000000..f05a65b6 --- /dev/null +++ b/Assets/Cyp/DemoShader/ScrollTest2.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a77e784c857a15f4593d004821ce2757 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/ImageRotate.cs b/Assets/Cyp/ImageRotate.cs new file mode 100644 index 00000000..e753c01f --- /dev/null +++ b/Assets/Cyp/ImageRotate.cs @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class ImageRotate : MonoBehaviour +{ + float rotation = 360; + // Use this for initialization + void Start() + { + //Debug.Log ("Material used: "+animMat.name); + } + + void Update() + { + Debug.Log(Time.deltaTime); + transform.Rotate(Vector3.back); + //if (Time.frameCount % 1 == 0) + //{ + // float i = new System.Random().NextDouble() < .5 ? -0.5f : 2f; + // transform.rotation = Quaternion.Euler(0, 0, rotation += (float)(i * new System.Random().NextDouble())); + // if (rotation < 0) + // { + // rotation = 360; + // } + //} + + } +} diff --git a/Assets/Cyp/ImageRotate.cs.meta b/Assets/Cyp/ImageRotate.cs.meta new file mode 100644 index 00000000..dd744fc9 --- /dev/null +++ b/Assets/Cyp/ImageRotate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 219017a4cf0dd2d4b8118d5723644209 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/RotateUVs.shader b/Assets/Cyp/RotateUVs.shader new file mode 100644 index 00000000..8a464c52 --- /dev/null +++ b/Assets/Cyp/RotateUVs.shader @@ -0,0 +1,40 @@ +Shader "Custom/RotateUVs" { + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _RotationSpeed ("Rotation Speed", Float) = 2.0 + } + SubShader { + Tags { "RenderType"="Opaque" } + LOD 200 + + CGPROGRAM + #pragma surface surf Lambert vertex:vert + + sampler2D _MainTex; + + struct Input { + float2 uv_MainTex; + }; + + float _RotationSpeed; + void vert (inout appdata_full v) { + v.texcoord.xy -=0.5; + float s = sin ( _RotationSpeed * _Time ); + float c = cos ( _RotationSpeed * _Time ); + float2x2 rotationMatrix = float2x2( c, -s, s, c); + rotationMatrix *=0.5; + rotationMatrix +=0.5; + rotationMatrix = rotationMatrix * 2-1; + v.texcoord.xy = mul ( v.texcoord.xy, rotationMatrix ); + v.texcoord.xy += 0.5; + } + + void surf (Input IN, inout SurfaceOutput o) { + half4 c = tex2D (_MainTex, IN.uv_MainTex); + o.Albedo = c.rgb; + o.Alpha = c.a; + } + ENDCG + } + FallBack "Diffuse" + } \ No newline at end of file diff --git a/Assets/Cyp/RotateUVs.shader.meta b/Assets/Cyp/RotateUVs.shader.meta new file mode 100644 index 00000000..8a759b91 --- /dev/null +++ b/Assets/Cyp/RotateUVs.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5a1aa2bd026c81c48bdbc2d02be7dd04 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/intensive_line.png b/Assets/Cyp/intensive_line.png new file mode 100644 index 0000000000000000000000000000000000000000..3264a6bba2f9a1a85c646fb52d08126948a9ded5 GIT binary patch literal 603 zcmV-h0;K(kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxh5!H^h5=oo6M+B#0q{vgK~#8N?U~V% zf-n#S#sB~3yBmw8%9D_6GP7jCe!&;bc7rihEt=}HnGx=If0?pgRCiMTn9Ic(?!d z{G;a%GZ>WzLr;Lg7{m)}O-cX|8G*SLEdYp!z+QtI04O6UKARo@Cuvc4Sg*I`8(_WO7Mw05=K%KcLUj<5JOPTcmFm1k51>3)Dn6SUKq+sq*PsQ6 zkT;lXQ36ED8>}^l19%2$*~vY-JtM+U0Jgjl8KFCXO5TWy&=o)}Z$w0J2Z)k4)Dc_( zqU8-`gysNe$s4K&O##l9Hxv=70cMdm*bxo`%qDLzBNPM7DsQkN>;{-!-e5%d2#`hI z7>)22Ae+1~5@8FFRo>{0@CuM!-sp+&yo$Wxjj;PGutx@Y!!v7BfK2j6>&(>v8Rd?+yR} literal 0 HcmV?d00001 diff --git a/Assets/Cyp/intensive_line.png.meta b/Assets/Cyp/intensive_line.png.meta new file mode 100644 index 00000000..f697e808 --- /dev/null +++ b/Assets/Cyp/intensive_line.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 62645928dbf0a324b8a1492a94593da6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cyp/rect.png b/Assets/Cyp/rect.png new file mode 100644 index 0000000000000000000000000000000000000000..c36f7da9d94b56903f5314f163f0cefc9447dbbd GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(=