| //-------------------------------------------------------- | 
| //    [Author]:           玩个游戏 | 
| //    [  Date ]:           Thursday, September 07, 2017 | 
| //-------------------------------------------------------- | 
| using UnityEngine; | 
| using System.Collections; | 
| using UnityEngine.UI; | 
|   | 
|   | 
| public class ScreenDiffuseMove : MonoBehaviour | 
| { | 
|   | 
|     [SerializeField] DiffuseType m_MoveType = DiffuseType.MoveUp; | 
|     public DiffuseType moveType { get { return m_MoveType; } } | 
|   | 
|     [SerializeField] float m_Speed = 10f; | 
|     public float speed { | 
|         get { return m_Speed; } | 
|         set { m_Speed = value; } | 
|     } | 
|   | 
|     [SerializeField] TweenCurve m_SpeedRatioCurve; | 
|     [SerializeField] float m_Duration = 1f; | 
|     public float duration { | 
|         get { return m_Duration; } | 
|         set { m_Duration = value; } | 
|     } | 
|   | 
|     [SerializeField] float m_Delay = 0f; | 
|     public float delay { | 
|         get { return m_Delay; } | 
|         set { m_Delay = value; } | 
|     } | 
|   | 
|     [SerializeField] bool m_IsLocal = true; | 
|     public bool isLocal { | 
|         get { return m_IsLocal; } | 
|     } | 
|   | 
|     float beginTime = 0f; | 
|     float endTime = 0f; | 
|     Vector2 direction = Vector2.up; | 
|     bool disableOnEnd = true; | 
|   | 
|     public void Begin(bool _disableOnEnd = true) | 
|     { | 
|         beginTime = Time.time + delay; | 
|         endTime = Time.time + delay + duration; | 
|         disableOnEnd = _disableOnEnd; | 
|   | 
|         switch (m_MoveType) | 
|         { | 
|             case DiffuseType.MoveUp: | 
|                 direction = Vector2.up * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveDown: | 
|                 direction = Vector2.down * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveLeft: | 
|                 direction = Vector2.left * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveRight: | 
|                 direction = Vector2.right * m_Speed; | 
|                 break; | 
|             case DiffuseType.RelativePosition: | 
|                 direction = new Vector2(this.transform.position.x, this.transform.position.y).normalized * m_Speed; | 
|                 break; | 
|             case DiffuseType.ReversalRelativePosition: | 
|                 direction = new Vector2(-this.transform.position.x, this.transform.position.y).normalized * m_Speed; | 
|                 break; | 
|         } | 
|   | 
|         this.enabled = true; | 
|         if (!this.gameObject.activeInHierarchy) | 
|         { | 
|             this.SetActive(true); | 
|         } | 
|   | 
|     } | 
|   | 
|     public void Begin(Vector3 _direction, bool _disableOnEnd = true) | 
|     { | 
|         beginTime = Time.time + delay; | 
|         endTime = Time.time + delay + duration; | 
|         disableOnEnd = _disableOnEnd; | 
|   | 
|         switch (m_MoveType) | 
|         { | 
|             case DiffuseType.MoveUp: | 
|                 direction = Vector2.up * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveDown: | 
|                 direction = Vector2.down * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveLeft: | 
|                 direction = Vector2.left * m_Speed; | 
|                 break; | 
|             case DiffuseType.MoveRight: | 
|                 direction = Vector2.right * m_Speed; | 
|                 break; | 
|             case DiffuseType.RelativePosition: | 
|                 direction = new Vector2(_direction.x, _direction.y).normalized * m_Speed; | 
|                 break; | 
|             case DiffuseType.ReversalRelativePosition: | 
|                 direction = new Vector2(_direction.x, -_direction.y).normalized * m_Speed; | 
|                 break; | 
|         } | 
|   | 
|         this.enabled = true; | 
|         if (!this.gameObject.activeInHierarchy) | 
|         { | 
|             this.SetActive(true); | 
|         } | 
|     } | 
|   | 
|     private void LateUpdate() | 
|     { | 
|         if (Time.time < beginTime) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         if (Time.time < endTime) | 
|         { | 
|             var delta = direction * Time.deltaTime * m_SpeedRatioCurve.Evaluate((Time.time - beginTime) / duration); | 
|             if (isLocal) | 
|             { | 
|                 this.transform.localPosition += new Vector3(delta.x, delta.y, 0); | 
|             } | 
|             else | 
|             { | 
|                 this.transform.position += new Vector3(delta.x, delta.y, 0); | 
|             } | 
|         } | 
|         else | 
|         { | 
|             if (disableOnEnd) | 
|             { | 
|                 this.enabled = false; | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     public enum DiffuseType | 
|     { | 
|         MoveUp, | 
|         MoveDown, | 
|         MoveLeft, | 
|         MoveRight, | 
|         RelativePosition, | 
|         ReversalRelativePosition, | 
|     } | 
| } |