/* ******************************************************************************** *Copyright(C),coolae.net *Author: chenbin *Version: 2.0 *Date: 2017-01-09 *Description: 特效 *Others: *History: ********************************************************************************* */ using UnityEngine; using System.Collections; namespace Coolape { [RequireComponent (typeof(AnimationProc))] public class CLEffect : MonoBehaviour { AnimationProc _animationProc; public AnimationProc animationProc { get { if (_animationProc == null) { _animationProc = GetComponent (); } return _animationProc; } } Transform _tr; public Transform transform { get { if (_tr == null) { _tr = gameObject.transform; } return _tr; } } // public string effectName = ""; public object willFinishCallback = null; public object willFinishCallbackPara; //回调数 public object finishCallback = null; public object finishCallbackPara; //回调数 public bool returnAuto = true; public float willFinishTimePercent = 0; /// /// Plaies the delay.延迟播放特效 /// /// The delay. /// Name. /// Position. /// Parent. /// Will finish time. /// Will finish callback. /// Will finish callback para. /// Finish callback. /// Finish callback para. /// Delay sec. /// If set to true return auto. public static CLEffect playDelay (string name, Vector3 pos, Transform parent, float willFinishTimePercent, object willFinishCallback, object willFinishCallbackPara, object finishCallback, object finishCallbackPara, float delaySec, bool returnAuto = true) { if (string.IsNullOrEmpty (name)) { return null; } if (!CLEffectPool.havePrefab (name)) { ArrayList list = new ArrayList (); list.Add (name); list.Add (pos); list.Add (parent); list.Add (willFinishTimePercent); list.Add (willFinishCallback); list.Add (willFinishCallbackPara); list.Add (finishCallback); list.Add (finishCallbackPara); list.Add (delaySec); list.Add (returnAuto); // CLEffectPool.setPrefab (name, (Callback)onFinishSetPrefab2, list, null); CLEffectPool.borrowObjAsyn (name, (Callback)onFinishSetPrefab2, list); return null; } CLEffect effect = CLEffectPool.borrowObj (name); if (effect == null) { return null; } NGUITools.SetActive (effect.gameObject, false); CLMainBase.self.StartCoroutine (effect.playDelay (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, delaySec, returnAuto)); return effect; } public IEnumerator playDelay (Vector3 pos, Transform parent, float willFinishTimePercent, object willFinishCallback, object willFinishCallbackPara, object finishCallback, object finishCallbackPara, float delaySec, bool returnAuto) { yield return new WaitForSeconds (delaySec); show (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, returnAuto); } public static CLEffect play (string name, Vector3 pos, Transform parent, object finishCallback, object finishCallbackPara) { return play (name, pos, parent, 0, null, null, finishCallback, finishCallbackPara, true); } public static CLEffect play (string name, Vector3 pos, object finishCallback, object finishCallbackPara) { return play (name, pos, null, 0, null, null, finishCallback, finishCallbackPara, true); } public static CLEffect play (string name, Vector3 pos, Transform parent) { return play (name, pos, parent, 0, null, null, null, null, true); } public static CLEffect play (string name, Vector3 pos) { return play (name, pos, null, 0, null, null, null, null, true); } public static CLEffect play (string name, Vector3 pos, Transform parent, float willFinishTimePercent, object willFinishCallback, object willFinishCallbackPara, object finishCallback, object finishCallbackPara, bool returnAuto) { try { if (string.IsNullOrEmpty (name)) { return null; } if (!CLEffectPool.havePrefab (name)) { ArrayList list = new ArrayList (); list.Add (name); list.Add (pos); list.Add (parent); list.Add (willFinishTimePercent); list.Add (willFinishCallback); list.Add (willFinishCallbackPara); list.Add (finishCallback); list.Add (finishCallbackPara); list.Add (returnAuto); CLEffectPool.borrowObjAsyn (name, (Callback)onFinishSetPrefab, list); return null; } CLEffect effect = CLEffectPool.borrowObj (name); if (effect == null) { return null; } // effect.effectName = name; effect.show (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, returnAuto); return effect; } catch (System.Exception e) { Debug.LogError (e); return null; } } public static void onFinishSetPrefab (params object[] args) { CLEffect effect = (CLEffect)(args [1]); if (effect != null) { ArrayList list = (ArrayList)(args [2]); string name = list [0].ToString (); Vector3 pos = (Vector3)(list [1]); Transform parent = (Transform)(list [2]); float willFinishTimePercent = (float)(list [3]); object willFinishCallback = list [4]; object willFinishCallbackPara = list [5]; object finishCallback = list [6]; object finishCallbackPara = list [7]; bool returnAuto = (bool)(list [8]); effect.show (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, returnAuto); } } public static void onFinishSetPrefab2 (params object[] args) { // string effectName = args [0].ToString (); CLEffect effect = (CLEffect)(args [1]); if (effect != null) { ArrayList list = (ArrayList)(args [2]); string name = list [0].ToString (); Vector3 pos = (Vector3)(list [1]); Transform parent = (Transform)(list [2]); float willFinishTimePercent = (float)(list [3]); object willFinishCallback = list [4]; object willFinishCallbackPara = list [5]; object finishCallback = list [6]; object finishCallbackPara = list [7]; float delaySec = (float)(list [8]); bool returnAuto = (bool)(list [9]); CLMainBase.self.StartCoroutine (effect.playDelay (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, delaySec, returnAuto)); } } public void show ( Vector3 pos, Transform parent, float willFinishTimePercent, object willFinishCallback, object willFinishCallbackPara, object finishCallback, object finishCallbackPara, bool returnAuto = true) { this.willFinishTimePercent = willFinishTimePercent; transform.parent = parent; transform.position = pos; transform.localScale = Vector3.one; transform.localEulerAngles = Vector3.zero; this.willFinishCallback = willFinishCallback; this.willFinishCallbackPara = willFinishCallbackPara; this.finishCallback = finishCallback; this.finishCallbackPara = finishCallbackPara; animationProc.callbackPara = finishCallbackPara; this.returnAuto = returnAuto; Callback cb = onFinish; animationProc.onFinish = cb; NGUITools.SetActive (gameObject, true); if (willFinishTimePercent > 0.00001f) { Invoke ("doWillfinishCallback", willFinishTimePercent * animationProc.timeOut); } } void doWillfinishCallback () { Utl.doCallback (willFinishCallback, this, willFinishCallbackPara); } public void onFinish (params object[] obj) { if (returnAuto || obj == null) { CLEffectPool.returnObj (name, this); NGUITools.SetActive (gameObject, false); if (returnAuto) { transform.parent = null; } } Utl.doCallback (finishCallback, this, finishCallbackPara); } public void Start () { #if UNITY_EDITOR //因为是通过assetebundle加载的,在真机上不需要处理,只有在pc上需要重设置shader // if (Application.isPlaying) { // Utl.setBodyMatEdit (transform); // } #endif } ParticleSystem[] _particleSys; public ParticleSystem[] particleSys { get { if (_particleSys == null) { _particleSys = gameObject.GetComponentsInChildren (); } return _particleSys; } } Animator[] _animators; public Animator[] animators { get { if (_animators == null) { _animators = gameObject.GetComponentsInChildren (); } return _animators; } } Animation[] _animations; public Animator[] animations { get { if (_animations == null) { _animations = gameObject.GetComponentsInChildren (); } return _animators; } } // Hashtable particlesTimes = new Hashtable(); public void pause () { if (particleSys != null && particleSys.Length > 0) { for (int i = 0; i < particleSys.Length - 1; i++) { particleSys [i].Pause (); // particlesTimes[particleSys[i].GetInstanceID()] = particleSys[i].time; } } if (animations != null && animations.Length > 0) { for (int i = 0; i < animations.Length - 1; i++) { animations [i].enabled = false; } } if (animators != null && animators.Length > 0) { for (int i = 0; i < animators.Length - 1; i++) { animators [i].enabled = false; } } } public void regain () { if (particleSys != null && particleSys.Length > 0) { for (int i = 0; i < particleSys.Length - 1; i++) { // particleSys[i].time = (float)(particlesTimes[particleSys[i].GetInstanceID()]); // particleSys[i].Simulate((float)(particlesTimes[particleSys[i].GetInstanceID()])); particleSys [i].Play (); } } if (animations != null && animations.Length > 0) { for (int i = 0; i < animations.Length - 1; i++) { animations [i].enabled = true; } } if (animators != null && animators.Length > 0) { for (int i = 0; i < animators.Length - 1; i++) { animators [i].enabled = true; } } } public void playSC (Vector3 pos, Transform parent, float willFinishTimePercent, object willFinishCallback, object willFinishCallbackPara, object finishCallback, object finishCallbackPara, float delaySec, bool returnAuto) { StartCoroutine (playDelay (pos, parent, willFinishTimePercent, willFinishCallback, willFinishCallbackPara, finishCallback, finishCallbackPara, delaySec, returnAuto)); } } }