FPlayEffectEvent.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Security;
  4. namespace Flux
  5. {
  6. [FEvent("Skill/美术/播放特效")]
  7. public class FPlayEffectEvent : FEvent
  8. {
  9. [HideInInspector]
  10. [SerializeField]
  11. private GameObject _effectPrefab = null;
  12. public GameObject EffectPrefab
  13. {
  14. get { return _effectPrefab; }
  15. }
  16. [HideInInspector]
  17. [SerializeField]
  18. private int _effectId;
  19. public int EffectId
  20. {
  21. get { return _effectId; }
  22. }
  23. [HideInInspector]
  24. [SerializeField]
  25. private string _effectLink;
  26. public string EffectLink
  27. {
  28. get { return _effectLink; }
  29. }
  30. private GameObject effectGo;
  31. private ParticleSystem effectParticleSystem;
  32. private Animator[] effectAnimators;
  33. private float _previousTimeSinceTrigger = 0;
  34. private float _previousSpeed = 0;
  35. public FPlayEffectEvent()
  36. {
  37. _eventType = SkillActionFrameEventType.FE_PlayEffect;
  38. }
  39. protected override void OnSetDefaultValues()
  40. {
  41. base.OnSetDefaultValues();
  42. }
  43. protected override void OnTrigger(float timeSinceTrigger)
  44. {
  45. base.OnTrigger(timeSinceTrigger);
  46. if (_effectPrefab != null)
  47. {
  48. Vector3 pos = _casterTrans.position;
  49. Transform parent = null;
  50. Transform linkPoint = UnityEngineUtils.RecurisiveFindTransformChild(_casterTrans, _effectLink);
  51. if (linkPoint != null)
  52. {
  53. parent = linkPoint;
  54. }
  55. effectGo = (GameObject)Instantiate(_effectPrefab);
  56. effectGo.transform.SetParent(parent);
  57. effectGo.transform.localPosition = Vector3.zero;
  58. effectGo.transform.localScale = Vector3.one;
  59. effectGo.transform.localRotation = Quaternion.identity;
  60. effectAnimators = effectGo.GetComponentsInChildren<Animator>();
  61. effectParticleSystem = effectGo.GetComponentInChildren<ParticleSystem>();
  62. if (effectParticleSystem != null)
  63. {
  64. ParticleSystem.MainModule mainModule = effectParticleSystem.main;
  65. mainModule.simulationSpeed = Sequence.Speed;
  66. }
  67. if(effectAnimators != null && effectAnimators.Length > 0)
  68. {
  69. for(int aid = 0; aid < effectAnimators.Length; aid++)
  70. {
  71. var animator = effectAnimators[aid];
  72. animator.enabled = true;
  73. animator.SetLayerWeight(0, 1);
  74. if (timeSinceTrigger > 0)
  75. {
  76. animator.Update(timeSinceTrigger - 0.001f);
  77. }
  78. else
  79. {
  80. animator.Update(0f);
  81. }
  82. }
  83. }
  84. }
  85. if (effectParticleSystem != null && Sequence.IsPlaying && Sequence.IsPlayingForward)
  86. effectParticleSystem.Play(true);
  87. _previousTimeSinceTrigger = timeSinceTrigger;
  88. _previousSpeed = Sequence.Speed;
  89. }
  90. protected override void OnPause()
  91. {
  92. if (effectParticleSystem != null)
  93. effectParticleSystem.Pause();
  94. if (effectAnimators != null && effectAnimators.Length > 0)
  95. {
  96. for (int idx = 0; idx < effectAnimators.Length; idx++)
  97. effectAnimators[idx].enabled = false;
  98. }
  99. }
  100. protected override void OnResume()
  101. {
  102. if (effectParticleSystem != null && Sequence.IsPlayingForward)
  103. effectParticleSystem.Play(true);
  104. if (effectAnimators != null && effectAnimators.Length > 0)
  105. {
  106. for (int idx = 0; idx < effectAnimators.Length; idx++)
  107. effectAnimators[idx].enabled = true;
  108. }
  109. }
  110. protected override void OnFinish()
  111. {
  112. if (effectParticleSystem != null)
  113. effectParticleSystem.Stop(true);
  114. if (effectGo != null)
  115. {
  116. if ((IsLastEvent || _track.GetEvent(GetId() + 1).Start != End))
  117. {
  118. if (effectAnimators != null && effectAnimators.Length > 0)
  119. {
  120. for (int idx = 0; idx < effectAnimators.Length; idx++)
  121. {
  122. effectAnimators[idx].SetLayerWeight(0, 0);
  123. effectAnimators[idx].enabled = false;
  124. }
  125. }
  126. }
  127. GameObject.DestroyImmediate(effectGo);
  128. effectGo = null;
  129. }
  130. }
  131. protected override void OnStop()
  132. {
  133. if (effectParticleSystem != null)
  134. {
  135. effectParticleSystem.Stop(true);
  136. effectParticleSystem.Clear(true);
  137. }
  138. if (effectGo != null)
  139. {
  140. if ((IsLastEvent || _track.GetEvent(GetId() + 1).Start != End))
  141. {
  142. if (effectAnimators != null)
  143. {
  144. for (int idx = 0; idx < effectAnimators.Length; idx++)
  145. {
  146. effectAnimators[idx].SetLayerWeight(0, 0);
  147. effectAnimators[idx].enabled = false;
  148. }
  149. }
  150. }
  151. GameObject.DestroyImmediate(effectGo);
  152. effectGo = null;
  153. }
  154. }
  155. protected override void OnUpdateEvent(float timeSinceTrigger)
  156. {
  157. float delta = timeSinceTrigger - _previousTimeSinceTrigger;
  158. _previousTimeSinceTrigger = timeSinceTrigger;
  159. if (effectParticleSystem != null)
  160. {
  161. if (!Sequence.IsPlaying || !Sequence.IsPlayingForward)
  162. {
  163. _previousSpeed = 1;
  164. ParticleSystem.MainModule mainModule = effectParticleSystem.main;
  165. mainModule.simulationSpeed = _previousSpeed;
  166. if (Sequence.IsPlayingForward && delta > 0)
  167. {
  168. effectParticleSystem.Simulate(delta, true, false);
  169. }
  170. }
  171. else if (_previousSpeed != Sequence.Speed)
  172. {
  173. _previousSpeed = Sequence.Speed;
  174. ParticleSystem.MainModule mainModule = effectParticleSystem.main;
  175. mainModule.simulationSpeed = Mathf.Abs(_previousSpeed);
  176. }
  177. }
  178. if(effectAnimators!= null && effectAnimators.Length > 0)
  179. {
  180. for (int idx = 0; idx < effectAnimators.Length; idx++)
  181. {
  182. var animator = effectAnimators[idx];
  183. if (!animator.enabled)
  184. animator.enabled = true;
  185. if (delta > 0)
  186. {
  187. animator.Update(delta);
  188. }
  189. }
  190. _previousTimeSinceTrigger = timeSinceTrigger;
  191. }
  192. }
  193. public override int GetMaxLength()
  194. {
  195. return base.GetMaxLength();
  196. }
  197. public override string Text
  198. {
  199. get { return "播放特效"; }
  200. set { }
  201. }
  202. public override SecurityElement SaveToXml()
  203. {
  204. SecurityElement node = base.SaveToXml();
  205. SecurityElement paramNode = WriteParamNode("effect",_effectId.ToString(),"int");
  206. node.AddChild(paramNode);
  207. if (_effectPrefab != null)
  208. {
  209. #if UNITY_EDITOR
  210. paramNode = WriteParamNode("effectPrefab", UnityEditor.AssetDatabase.GetAssetPath(_effectPrefab), "string");
  211. node.AddChild(paramNode);
  212. #endif
  213. }
  214. paramNode = WriteParamNode("effectLink", _effectLink, "string");
  215. if (paramNode != null)
  216. node.AddChild(paramNode);
  217. return node;
  218. }
  219. public override void LoadFromXml(SecurityElement eventNode)
  220. {
  221. base.LoadFromXml(eventNode);
  222. _effectId = GetNParam("effect");
  223. string effectPrefab = GetSParam("effectPrefab");
  224. if (!string.IsNullOrEmpty(effectPrefab))
  225. {
  226. #if UNITY_EDITOR
  227. _effectPrefab = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(effectPrefab);
  228. #endif
  229. }
  230. _effectLink = GetSParam("effectLink");
  231. }
  232. }
  233. }