XffectCache.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace Xft
  6. {
  7. [AddComponentMenu("Xffect/XffectCache")]
  8. public class XffectCache : MonoBehaviour
  9. {
  10. private void Awake()
  11. {
  12. this.mInited = false;
  13. this.Init();
  14. }
  15. public bool IsInited()
  16. {
  17. return this.mInited;
  18. }
  19. public void Init()
  20. {
  21. IEnumerator enumerator = base.transform.GetEnumerator();
  22. try
  23. {
  24. while (enumerator.MoveNext())
  25. {
  26. object obj = enumerator.Current;
  27. Transform transform = (Transform)obj;
  28. XffectComponent component = transform.GetComponent<XffectComponent>();
  29. if (component != null)
  30. {
  31. component.Initialize();
  32. if (!this.EffectDic.ContainsKey(transform.name))
  33. {
  34. this.EffectDic[transform.name] = new List<XffectComponent>();
  35. }
  36. this.EffectDic[transform.name].Add(component);
  37. }
  38. CompositeXffect component2 = transform.GetComponent<CompositeXffect>();
  39. if (component2 != null)
  40. {
  41. component2.Initialize();
  42. if (!this.CompEffectDic.ContainsKey(transform.name))
  43. {
  44. this.CompEffectDic[transform.name] = new List<CompositeXffect>();
  45. }
  46. this.CompEffectDic[transform.name].Add(component2);
  47. }
  48. }
  49. }
  50. finally
  51. {
  52. IDisposable disposable;
  53. if ((disposable = (enumerator as IDisposable)) != null)
  54. {
  55. disposable.Dispose();
  56. }
  57. }
  58. this.mInited = true;
  59. }
  60. public XffectComponent AddXffect(string name)
  61. {
  62. Transform transform = base.transform.Find(name);
  63. if (transform == null)
  64. {
  65. UnityEngine.Debug.Log("object:" + name + "doesn't exist!");
  66. return null;
  67. }
  68. Transform transform2 = UnityEngine.Object.Instantiate<Transform>(transform, Vector3.zero, Quaternion.identity);
  69. transform2.parent = base.transform;
  70. XffectComponent.SetActive(transform2.gameObject, false);
  71. transform2.gameObject.name = transform.gameObject.name;
  72. XffectComponent component = transform2.GetComponent<XffectComponent>();
  73. this.EffectDic[name].Add(component);
  74. if (component != null)
  75. {
  76. component.Initialize();
  77. }
  78. return component;
  79. }
  80. public bool ContainsEffect(string name)
  81. {
  82. return this.EffectDic.ContainsKey(name);
  83. }
  84. public XffectComponent GetEffect(string name)
  85. {
  86. if (!this.EffectDic.ContainsKey(name))
  87. {
  88. UnityEngine.Debug.LogError("there is no effect:" + name + " in effect cache!");
  89. return null;
  90. }
  91. List<XffectComponent> list = this.EffectDic[name];
  92. if (list == null)
  93. {
  94. return null;
  95. }
  96. foreach (XffectComponent xffectComponent in list)
  97. {
  98. if (!(xffectComponent == null))
  99. {
  100. if (!XffectComponent.IsActive(xffectComponent.gameObject))
  101. {
  102. return xffectComponent;
  103. }
  104. }
  105. }
  106. return this.AddXffect(name);
  107. }
  108. public CompositeXffect GetCompositeXffect(string name)
  109. {
  110. List<CompositeXffect> list = this.CompEffectDic[name];
  111. if (list == null)
  112. {
  113. return null;
  114. }
  115. foreach (CompositeXffect compositeXffect in list)
  116. {
  117. if (!XffectComponent.IsActive(compositeXffect.gameObject))
  118. {
  119. return compositeXffect;
  120. }
  121. }
  122. return null;
  123. }
  124. public EffectNode EmitNode(string eftName, Vector3 pos)
  125. {
  126. List<XffectComponent> list = this.EffectDic[eftName];
  127. if (list == null)
  128. {
  129. UnityEngine.Debug.LogError(base.name + ": cache doesnt exist!");
  130. return null;
  131. }
  132. if (list.Count > 1)
  133. {
  134. UnityEngine.Debug.LogWarning("EmitNode() only support only-one xffect cache!");
  135. }
  136. XffectComponent xffectComponent = list[0];
  137. if (!XffectComponent.IsActive(xffectComponent.gameObject))
  138. {
  139. xffectComponent.Active();
  140. }
  141. EffectNode effectNode = xffectComponent.EmitByPos(pos);
  142. if (effectNode == null)
  143. {
  144. UnityEngine.Debug.LogError("emit node error! may be node max count is not enough:" + eftName);
  145. }
  146. return effectNode;
  147. }
  148. public XffectComponent ReleaseEffect(string name, Vector3 pos)
  149. {
  150. XffectComponent effect = this.GetEffect(name);
  151. if (effect == null)
  152. {
  153. UnityEngine.Debug.LogWarning("can't find available effect in cache!:" + name);
  154. return null;
  155. }
  156. effect.Active();
  157. effect.SetClient(base.transform);
  158. effect.SetEmitPosition(pos);
  159. return effect;
  160. }
  161. public XffectComponent ReleaseEffect(string name, Transform client)
  162. {
  163. XffectComponent effect = this.GetEffect(name);
  164. if (effect == null)
  165. {
  166. UnityEngine.Debug.LogWarning("can't find available effect in cache!:" + name);
  167. return null;
  168. }
  169. effect.Active();
  170. effect.SetClient(client);
  171. return effect;
  172. }
  173. public XffectComponent ReleaseEffect(string name)
  174. {
  175. XffectComponent effect = this.GetEffect(name);
  176. if (effect == null)
  177. {
  178. return null;
  179. }
  180. effect.Active();
  181. return effect;
  182. }
  183. public void StopEffect(string eftName, float fadeTime)
  184. {
  185. List<XffectComponent> list = this.EffectDic[eftName];
  186. if (list == null)
  187. {
  188. UnityEngine.Debug.LogError(base.name + ": cache doesnt exist!");
  189. return;
  190. }
  191. for (int i = 0; i < list.Count; i++)
  192. {
  193. XffectComponent xffectComponent = list[i];
  194. if (XffectComponent.IsActive(xffectComponent.gameObject))
  195. {
  196. xffectComponent.StopSmoothly(fadeTime);
  197. }
  198. }
  199. }
  200. public void DeActiveEffect(string eftName)
  201. {
  202. List<XffectComponent> list = this.EffectDic[eftName];
  203. if (list == null)
  204. {
  205. UnityEngine.Debug.LogError(base.name + ": cache doesnt exist!");
  206. return;
  207. }
  208. for (int i = 0; i < list.Count; i++)
  209. {
  210. XffectComponent xffectComponent = list[i];
  211. if (XffectComponent.IsActive(xffectComponent.gameObject))
  212. {
  213. xffectComponent.DeActive();
  214. }
  215. }
  216. }
  217. public bool IsEffectActive(string eftName)
  218. {
  219. List<XffectComponent> list = this.EffectDic[eftName];
  220. if (list == null)
  221. {
  222. UnityEngine.Debug.LogError(base.name + ": cache doesnt exist!");
  223. return true;
  224. }
  225. if (list.Count > 1)
  226. {
  227. UnityEngine.Debug.LogWarning("DeActive() only support one Xffect cache!");
  228. }
  229. XffectComponent xffectComponent = list[0];
  230. return XffectComponent.IsActive(xffectComponent.gameObject);
  231. }
  232. public void StopEffect(string eftName)
  233. {
  234. List<XffectComponent> list = this.EffectDic[eftName];
  235. if (list == null)
  236. {
  237. UnityEngine.Debug.LogError(base.name + ": cache doesnt exist!");
  238. return;
  239. }
  240. if (list.Count > 1)
  241. {
  242. UnityEngine.Debug.LogWarning("DeActive() only support one Xffect cache!");
  243. }
  244. XffectComponent xffectComponent = list[0];
  245. if (!XffectComponent.IsActive(xffectComponent.gameObject))
  246. {
  247. return;
  248. }
  249. xffectComponent.StopEmit();
  250. }
  251. public int GetAvailableEffectCount(string eftName)
  252. {
  253. List<XffectComponent> list = this.EffectDic[eftName];
  254. if (list == null)
  255. {
  256. return 0;
  257. }
  258. int num = 0;
  259. for (int i = 0; i < list.Count; i++)
  260. {
  261. XffectComponent xffectComponent = list[i];
  262. if (!(xffectComponent == null))
  263. {
  264. if (!XffectComponent.IsActive(xffectComponent.gameObject))
  265. {
  266. num++;
  267. }
  268. }
  269. }
  270. return num;
  271. }
  272. private Dictionary<string, List<XffectComponent>> EffectDic = new Dictionary<string, List<XffectComponent>>();
  273. private Dictionary<string, List<CompositeXffect>> CompEffectDic = new Dictionary<string, List<CompositeXffect>>();
  274. protected bool mInited;
  275. }
  276. }