using UnityEngine; using UnityEngine.UI; using System.Collections; namespace UIWidgets { /// /// Animations. /// public static class Animations { /// /// Rotate animation. /// /// Animation. /// RectTransform. /// Time. /// Start rotation angle. /// End rotation angle. /// Use unscaled time. static public IEnumerator Rotate(RectTransform rectTransform, float time=0.5f, float start_angle = 0, float end_angle = 90, bool unscaledTime = false) { if (rectTransform!=null) { var start_rotarion = rectTransform.localRotation.eulerAngles; var end_time = (unscaledTime ? Time.unscaledTime : Time.time) + time; while ((unscaledTime ? Time.unscaledTime : Time.time) <= end_time) { var rotation_x = Mathf.Lerp(start_angle, end_angle, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.localRotation = Quaternion.Euler(rotation_x, start_rotarion.y, start_rotarion.z); yield return null; } //return rotation back for future use rectTransform.localRotation = Quaternion.Euler(start_rotarion); } } /// /// Rotate animation. /// /// Animation. /// RectTransform. /// Time. /// Start rotation angle. /// End rotation angle. /// Use unscaled time. static public IEnumerator RotateZ(RectTransform rectTransform, float time=0.5f, float start_angle = 0, float end_angle = 90, bool unscaledTime = false) { if (rectTransform!=null) { var start_rotarion = rectTransform.localRotation.eulerAngles; var end_time = (unscaledTime ? Time.unscaledTime : Time.time) + time; while ((unscaledTime ? Time.unscaledTime : Time.time) <= end_time) { var rotation_z = Mathf.Lerp(start_angle, end_angle, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.localRotation = Quaternion.Euler(start_rotarion.x, start_rotarion.y, rotation_z); yield return null; } //return rotation back for future use rectTransform.localRotation = Quaternion.Euler(start_rotarion); } } /// /// Collapse animation. /// /// Animation. /// RectTransform. /// Time. /// Is Horizontal animated width changes; otherwise height. /// Use unscaled time. static public IEnumerator Collapse(RectTransform rectTransform, float time=0.5f, bool isHorizontal = false, bool unscaledTime = false) { if (rectTransform!=null) { var size = rectTransform.rect.size; var layoutElement = rectTransform.GetComponent(); if (layoutElement==null) { layoutElement = rectTransform.gameObject.AddComponent(); } if (size.x==0 || size.y==0) { size = new Vector2(layoutElement.preferredWidth, layoutElement.preferredHeight); } var end_time = (unscaledTime ? Time.unscaledTime : Time.time) + time; while ((unscaledTime ? Time.unscaledTime : Time.time) <= end_time) { if (isHorizontal) { var width = Mathf.Lerp(size.x, 0, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width); layoutElement.preferredWidth = width; } else { var height = Mathf.Lerp(size.y, 0, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height); layoutElement.preferredHeight = height; } yield return null; } //return size back for future use if (isHorizontal) { rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x); layoutElement.preferredWidth = size.x; } else { rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y); layoutElement.preferredHeight = size.y; } } } /// /// Open animation. /// /// Animation. /// RectTransform. /// Time. /// Is Horizontal animated width changes; otherwise height. /// Use unscaled time. static public IEnumerator Open(RectTransform rectTransform, float time=0.5f, bool isHorizontal = false, bool unscaledTime = false) { if (rectTransform!=null) { var size = rectTransform.rect.size; var layoutElement = rectTransform.GetComponent(); if (layoutElement==null) { layoutElement = rectTransform.gameObject.AddComponent(); } if (size.x==0 || size.y==0) { size = new Vector2(layoutElement.preferredWidth, layoutElement.preferredHeight); } var end_time = (unscaledTime ? Time.unscaledTime : Time.time) + time; while ((unscaledTime ? Time.unscaledTime : Time.time) <= end_time) { if (isHorizontal) { var width = Mathf.Lerp(0, size.x, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width); layoutElement.preferredWidth = width; } else { var height = Mathf.Lerp(0, size.y, 1 - (end_time - (unscaledTime ? Time.unscaledTime : Time.time)) / time); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height); layoutElement.preferredHeight = height; } yield return null; } //return size back for future use if (isHorizontal) { rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x); layoutElement.preferredWidth = size.x; } else { rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y); layoutElement.preferredHeight = size.y; } } } } }