using UnityEngine; using System.Collections; using UnityEngine.UI; public class ObjectTween : MonoBehaviour { private delegate void OperationFun(); public enum Operation { None, rotation, ChangeSize, FowardCamera, RectMoveTo, MoveTo, ImageAphla, ControlOtherMove, SizeW, WorldMoveTo, Shock, ShockRate, } public AnimationCurve[] _AnimationCurves; public float durtion = 0; public float DelayTime = 0; private float startTime = -1; private Vector3 OldPosition = Vector3.zero; private Vector3 OldEulerAngles = Vector3.zero; public Operation[] m_operas; public float m_speedX = 1.0f; public float m_speedY = 1.0f; public float m_speedZ = 1.0f; private Vector3 startPos = Vector3.zero; public Vector3 destantPos = Vector3.zero; public bool isDestroy = true; public bool ReSetOnDisable = false; public int Axis; //1X轴 2Y轴 4Z轴 private int axisX = 1; private int axisY = 2; private int axisZ = 4; private float StartAphla = -1; public float ImageEndAphla = 0; public Image m_Image; private RectTransform m_rect; public float StartW; public float EndW; private bool m_IsOver = false; private void OnDisable() { if (ReSetOnDisable) Reset(); } public void Reset() { startPos = Vector3.zero; startTime = -1; StartAphla = -1; m_rect = null; m_IsOver = false; } private OperationFun m_operaFun = null; // Use this for initialization void DoAction () { for(int i=0;i(); } SizeWFresh(); break; } case Operation.Shock: { if (startTime == 0) { startTime = Time.unscaledTime + DelayTime; } if(OldPosition == Vector3.zero) OldPosition = transform.localPosition; float timeRate = Time.unscaledTime - startTime; if(timeRate>0) { float rate = timeRate; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); transform.localPosition = OldPosition + new Vector3(x, y, z); } break; } case Operation.ShockRate: { if (startTime == 0) { startTime = Time.unscaledTime + DelayTime; } if (OldEulerAngles == Vector3.zero) OldEulerAngles = transform.localEulerAngles; float timeRate = Time.unscaledTime - startTime; if (timeRate > 0) { float rate = timeRate; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); transform.localEulerAngles = OldEulerAngles + new Vector3(x, y, z); } break; } } } } // Update is called once per frame void Update () { if (startTime > 0 && durtion > 0 && Time.unscaledTime - startTime >= durtion) { if (m_IsOver == false) { DoAction(); m_IsOver = true; return; } m_IsOver = false; if (isDestroy) { gameObject.SetActive(false); GameObject.Destroy(gameObject); } if (OldPosition != Vector3.zero) transform.localPosition = OldPosition; if (OldEulerAngles != Vector3.zero) transform.localEulerAngles = OldEulerAngles; OldPosition = Vector3.zero; return; } if(startTime <= 0 && durtion > 0) { startTime = Time.unscaledTime + DelayTime; } if (Time.unscaledTime - startTime < 0) return; DoAction(); } void SizeWFresh() { if(m_rect!=null) { Vector2 sizeDelta = m_rect.sizeDelta; sizeDelta.x = Mathf.Lerp(StartW, EndW, (Time.unscaledTime - startTime) / durtion); m_rect.sizeDelta = sizeDelta; } } void RationSelf() { transform.Rotate(new Vector3(axisX*m_speedX,axisY*m_speedY, axisZ*m_speedZ)); } void ChangeSizeSelf() { Projector pro = GetComponentInChildren(); if (pro != null) pro.orthographicSize = (transform.localScale.x + transform.localScale.y + transform.localScale.z) / 3; } void FowardCamera() { if(Camera.main!=null) { Vector3 lookAt = new Vector3(Camera.main.transform.position.x, transform.position.y, Camera.main.transform.position.z); transform.LookAt(lookAt); } } void RectMoveTo() { RectTransform rect = transform as RectTransform; if(_AnimationCurves.Length>=3) { float rate = (Time.unscaledTime - startTime) / durtion; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); rect.anchoredPosition = new Vector3(x, y, z); } else { if (rect != null) { rect.anchoredPosition = Vector2.Lerp(rect.anchoredPosition, destantPos, (Time.unscaledTime - startTime) / durtion); } } } void MoveTo() { if (_AnimationCurves.Length >= 3) { float rate = (Time.unscaledTime - startTime) / durtion; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); transform.localPosition = new Vector3(x, y, z); } else { transform.localPosition = Vector3.Lerp(transform.localPosition, destantPos, (Time.unscaledTime - startTime) / durtion); } } void WorldMoveTo() { if (_AnimationCurves.Length >= 3) { float rate = (Time.unscaledTime - startTime) / durtion; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); transform.position = new Vector3(x, y, z); } else { transform.position = Vector3.Lerp(transform.position, destantPos, (Time.unscaledTime - startTime) / durtion); } } void ImageColorTween() { if (m_Image == null) return; if (_AnimationCurves.Length >= 1) { float rate = (Time.unscaledTime - startTime) / durtion; float x = _AnimationCurves[0].Evaluate(rate); float y = _AnimationCurves[1].Evaluate(rate); float z = _AnimationCurves[2].Evaluate(rate); transform.position = new Vector3(x, y, z); } else if(StartAphla != -1) { Color newColor = m_Image.color; newColor.a = Mathf.Lerp(StartAphla, ImageEndAphla, (Time.unscaledTime - startTime) / durtion); m_Image.color = newColor; } } }