using UnityEngine; [RequireComponent(typeof(SFXController))] public class WarnEffectController : MonoBehaviour { public Transform startEffect; public Transform scaleEffect; public Transform endEffect; public Renderer rectScale; public Vector3 baseScale; private Vector3 m_AtkSize; private float m_CurrentTime; private float m_TotalTime; private E_HitTestType m_HitTestType; private SFXController m_SfxController; private byte m_Step; public void Init(int skillId, int totalTime, int remainTime) { m_TotalTime = totalTime * Constants.F_GAMMA; m_CurrentTime = m_TotalTime - remainTime * Constants.F_GAMMA; m_SfxController = GetComponent(); m_Step = 0; if (startEffect) { startEffect.gameObject.SetActive(true); startEffect.localPosition = Constants.Special_Hide_Position; } if (scaleEffect) { scaleEffect.gameObject.SetActive(true); scaleEffect.localPosition = Constants.Special_Hide_Position; } if (endEffect != null) { endEffect.gameObject.SetActive(false); } } public void CalculateScale(E_HitTestType hitTestType, float range, float distance) { m_HitTestType = hitTestType; if (m_HitTestType == E_HitTestType.Sector) { m_AtkSize = distance * baseScale; } else if (m_HitTestType == E_HitTestType.Rect) { m_AtkSize.x = baseScale.x * range; m_AtkSize.y = 1; m_AtkSize.z = baseScale.z * distance; rectScale.material.SetTextureOffset("_MainTex", Vector2.up); } } // Update is called once per frame void Update() { switch (m_Step) { case 0:// 这个步骤是因为特效资源如果一开始就播放在指定位置就会出现很奇怪的表现... transform.localScale = m_AtkSize; if (startEffect) { startEffect.localPosition = Vector3.zero; } if (scaleEffect) { scaleEffect.localPosition = Vector3.zero; } m_Step = 1; break; case 1: m_CurrentTime += Time.deltaTime; if (scaleEffect) { if (m_HitTestType == E_HitTestType.Sector) { scaleEffect.localScale = Vector3.one * (m_CurrentTime / m_TotalTime); } else if (m_HitTestType == E_HitTestType.Rect) { float _val = m_CurrentTime / m_TotalTime; _val = 1.8f * _val; _val = 1 - _val; Vector2 _offset = new Vector2(0, _val); rectScale.material.SetTextureOffset("_MainTex", _offset); } } if (m_CurrentTime >= m_TotalTime) { m_CurrentTime = 0; m_Step = 2; if (endEffect) { endEffect.gameObject.SetActive(true); } } break; case 2: m_CurrentTime += Time.deltaTime; if (m_CurrentTime > 0.5f) { if (m_SfxController) { SFXPlayUtility.Instance.Release(m_SfxController); if (endEffect) { endEffect.gameObject.SetActive(false); } m_SfxController = null; } } break; } } }