//-------------------------------------------------------- // [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, } }