| //-------------------------------------------------------- | 
| //    [Author]:           玩个游戏 | 
| //    [  Date ]:           Thursday, September 07, 2017 | 
| //-------------------------------------------------------- | 
| using UnityEngine; | 
| using System.Collections; | 
| using UnityEngine.UI; | 
| using System; | 
|   | 
| public class ScreenMoveTo : MonoBehaviour | 
| { | 
|   | 
|     [SerializeField] | 
|     LerpType m_LerpType = LerpType.Linear; | 
|   | 
|     [SerializeField] | 
|     Vector2 m_Destination; | 
|     public Vector2 destination { | 
|         get { return m_Destination; } | 
|         set { m_Destination = value; } | 
|     } | 
|   | 
|     [SerializeField] | 
|     float m_Duration = 0.5f; | 
|     public float duration { | 
|         get { return m_Duration; } | 
|         set { m_Duration = value; } | 
|     } | 
|   | 
|     [SerializeField] | 
|     bool m_IsLocal = true; | 
|     public bool isLocal { | 
|         get { return m_IsLocal; } | 
|     } | 
|   | 
|     bool disableOnEnd = true; | 
|     float endTime = 0f; | 
|   | 
|     Vector3 startPosition = Vector3.zero; | 
|     Vector3 startLocalPosition = Vector3.zero; | 
|     Vector3 refPosition = Vector3.zero; | 
|   | 
|     bool end = false; | 
|     Action endCallBack = null; | 
|   | 
|     public void Begin(bool _deActiveOnEnd = true) | 
|     { | 
|         endTime = Time.time + duration; | 
|         end = false; | 
|         disableOnEnd = _deActiveOnEnd; | 
|         startPosition = this.transform.position; | 
|         startLocalPosition = this.transform.localPosition; | 
|         refPosition = Vector3.zero; | 
|         endCallBack = null; | 
|   | 
|         this.enabled = true; | 
|         if (!this.gameObject.activeInHierarchy) | 
|         { | 
|             this.SetActive(true); | 
|         } | 
|     } | 
|   | 
|     public void Begin(Action _callBack, bool _disableOnEnd = true) | 
|     { | 
|         endTime = Time.time + duration; | 
|         end = false; | 
|         disableOnEnd = _disableOnEnd; | 
|         startPosition = this.transform.position; | 
|         startLocalPosition = this.transform.localPosition; | 
|         refPosition = Vector3.zero; | 
|         endCallBack = _callBack; | 
|   | 
|         this.enabled = true; | 
|         if (!this.gameObject.activeInHierarchy) | 
|         { | 
|             this.SetActive(true); | 
|         } | 
|     } | 
|   | 
|     private void LateUpdate() | 
|     { | 
|         switch (m_LerpType) | 
|         { | 
|             case LerpType.Linear: | 
|                 if (Time.time < endTime) | 
|                 { | 
|                     var t = Mathf.Clamp01(1f - (endTime - Time.time) / m_Duration); | 
|                     if (isLocal) | 
|                     { | 
|                         this.transform.localPosition = Vector3.Lerp(startLocalPosition, destination, t); | 
|                     } | 
|                     else | 
|                     { | 
|                         this.transform.position = Vector3.Lerp(startPosition, destination, t); | 
|                     } | 
|                 } | 
|                 else | 
|                 { | 
|                     end = true; | 
|                     if (isLocal) | 
|                     { | 
|                         this.transform.localPosition = destination; | 
|                     } | 
|                     else | 
|                     { | 
|                         this.transform.position = destination; | 
|                     } | 
|                 } | 
|                 break; | 
|             case LerpType.Smooth: | 
|   | 
|                 if (isLocal) | 
|                 { | 
|                     if (Vector3.Distance(this.transform.localPosition, new Vector3(destination.x, destination.y)) > 1) | 
|                     { | 
|                         this.transform.localPosition = Vector3.SmoothDamp(this.transform.localPosition, destination, ref refPosition, duration); | 
|                     } | 
|                     else | 
|                     { | 
|                         this.transform.localPosition = destination; | 
|                         end = true; | 
|                     } | 
|                 } | 
|                 else | 
|                 { | 
|                     if (Vector3.Distance(this.transform.position, new Vector3(destination.x, destination.y)) > 1) | 
|                     { | 
|                         this.transform.position = Vector3.SmoothDamp(this.transform.position, destination, ref refPosition, duration); | 
|                     } | 
|                     else | 
|                     { | 
|                         this.transform.position = destination; | 
|                         end = true; | 
|                     } | 
|                 } | 
|                 break; | 
|         } | 
|   | 
|         if (end) | 
|         { | 
|             if (endCallBack != null) | 
|             { | 
|                 endCallBack(); | 
|                 endCallBack = null; | 
|             } | 
|         } | 
|   | 
|         if (end && disableOnEnd) | 
|         { | 
|             this.enabled = false; | 
|         } | 
|   | 
|     } | 
|   | 
|   | 
|     public enum LerpType | 
|     { | 
|         Linear, | 
|         Smooth, | 
|     } | 
|   | 
| } |