349 lines
11 KiB
C#
349 lines
11 KiB
C#
|
|
/*
|
|||
|
|
********************************************************************************
|
|||
|
|
*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<AnimationProc> ();
|
|||
|
|
}
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Plaies the delay.延迟播放特效
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>The delay.</returns>
|
|||
|
|
/// <param name="name">Name.</param>
|
|||
|
|
/// <param name="pos">Position.</param>
|
|||
|
|
/// <param name="parent">Parent.</param>
|
|||
|
|
/// <param name="willFinishTimePercent">Will finish time.</param>
|
|||
|
|
/// <param name="willFinishCallback">Will finish callback.</param>
|
|||
|
|
/// <param name="willFinishCallbackPara">Will finish callback para.</param>
|
|||
|
|
/// <param name="finishCallback">Finish callback.</param>
|
|||
|
|
/// <param name="finishCallbackPara">Finish callback para.</param>
|
|||
|
|
/// <param name="delaySec">Delay sec.</param>
|
|||
|
|
/// <param name="returnAuto">If set to <c>true</c> return auto.</param>
|
|||
|
|
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<ParticleSystem> ();
|
|||
|
|
}
|
|||
|
|
return _particleSys;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Animator[] _animators;
|
|||
|
|
|
|||
|
|
public Animator[] animators {
|
|||
|
|
get {
|
|||
|
|
if (_animators == null) {
|
|||
|
|
_animators = gameObject.GetComponentsInChildren<Animator> ();
|
|||
|
|
}
|
|||
|
|
return _animators;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Animation[] _animations;
|
|||
|
|
|
|||
|
|
public Animator[] animations {
|
|||
|
|
get {
|
|||
|
|
if (_animations == null) {
|
|||
|
|
_animations = gameObject.GetComponentsInChildren<Animation> ();
|
|||
|
|
}
|
|||
|
|
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));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|