Effect.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. public class Effect
  6. {
  7. static int mAutoIncInstanceId = 1;
  8. #region Fields
  9. EffectData mData;
  10. GameObject mEffectGO;
  11. Transform mOwnerTransform;
  12. Transform mTargetTransform;
  13. Transform mBulletTransform;
  14. float mLifeTime;
  15. bool ignoreTimeScale = false;
  16. bool fixFloor = false;
  17. int lookType = 0;
  18. bool mirrorable = true;
  19. string mForceLayer = string.Empty;
  20. #endregion
  21. #region Properties
  22. public int InstanceID { get; private set; }
  23. public int EffectID { get { return mData.id; } }
  24. public float MaxLifeTime { get { return mData.lifeTime; } }
  25. public bool Valid { get { return mData != null && mData.valid; } }
  26. public EffectFollowType FollowType { get { return mData.followTargetType; } }
  27. public EffectTargetType TargetType { get { return mData.targetType; } }
  28. public GameObject EffectGo { get { return mEffectGO; } }
  29. public bool IsPaused { get; private set; }
  30. public bool IsDisposed { get; private set; }
  31. public Transform OwnerTransform { get { return mOwnerTransform; } }
  32. public Transform TargetTransform { get { return mTargetTransform; } }
  33. public Fighter OwnerFighter {get { return GetTransformFighter (mOwnerTransform);}}
  34. public Fighter TargetFighter {get { return GetTransformFighter (mTargetTransform);}}
  35. #endregion
  36. public Effect (EffectData data)
  37. {
  38. InstanceID = mAutoIncInstanceId++;
  39. mData = data;
  40. IsPaused = false;
  41. IsDisposed = false;
  42. mLifeTime = 0;
  43. }
  44. public void Play (Transform selfTransform, Transform targetTransform = null, Transform bulletTransform = null
  45. , bool ignoreTimescale = false, bool fixFloor = false, int lookType = 0, bool mirrorable = true, string forceLayer = "")
  46. {
  47. mOwnerTransform = selfTransform;
  48. mTargetTransform = targetTransform;
  49. mBulletTransform = bulletTransform;
  50. this.ignoreTimeScale = ignoreTimescale;
  51. this.fixFloor = fixFloor;
  52. this.lookType = lookType;
  53. this.mirrorable = mirrorable;
  54. this.mForceLayer = forceLayer;
  55. Initialze ();
  56. }
  57. public void Pause ()
  58. {
  59. if (IsPaused)
  60. return;
  61. UnityEngineUtils.PauseEffectParticle (mEffectGO);
  62. IsPaused = true;
  63. }
  64. public void ResumeFromPause ()
  65. {
  66. if (!IsPaused)
  67. return;
  68. UnityEngineUtils.ResumeEffectParticle (mEffectGO);
  69. IsPaused = false;
  70. }
  71. public void Update (float deltaTime)
  72. {
  73. if (IsPaused) {
  74. return;
  75. }
  76. mLifeTime += deltaTime;
  77. UpdateFollowFloorPosition ();
  78. if (mEffectGO == null || (mData.lifeTime > 0 && mLifeTime > MaxLifeTime))
  79. EffectManager.Instance.RemoveEffectByInstanceID (InstanceID);
  80. }
  81. void CreateEffectGo ()
  82. {
  83. if (mEffectGO != null)
  84. return;
  85. if (string.IsNullOrEmpty(mData.effect)) return;
  86. mEffectGO = EffectManager.Instance.CreateEffectGo(mData.effect);
  87. if (mEffectGO == null)
  88. {
  89. //DebugHelper.LogError("effect go is null" + mData.effect);
  90. return;
  91. }
  92. mEffectGO.name = mData.effect;
  93. if (ignoreTimeScale)
  94. UnityEngineUtils.SetUnscalTimePartical (mEffectGO);
  95. if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back)
  96. CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.BackScreenLayerName);
  97. else if (mOwnerTransform != null) {
  98. if (!string.IsNullOrEmpty (mForceLayer))
  99. CommonUtil.SetGameObjectLayer (mEffectGO, mForceLayer);
  100. else if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Normal)
  101. CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.SceneEffectLayerName);
  102. else
  103. CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.CurrentEffectLayerName);
  104. }
  105. }
  106. void SetFollowParent ()
  107. {
  108. if (mEffectGO == null)
  109. return;
  110. if (mData.followTargetType == EffectFollowType.Effect_Follow_None)
  111. {
  112. mEffectGO.transform.SetParent(null);
  113. return;
  114. }
  115. if (mData.followTargetType == EffectFollowType.Effect_Follow_Self
  116. || mData.followTargetType == EffectFollowType.Effect_Follow_Self_Bloodbar
  117. || mData.followTargetType == EffectFollowType.Effect_Follow_Self_Floor)
  118. {
  119. AttachTransform (mOwnerTransform, mEffectGO.transform, mData.targetObjName);
  120. }
  121. else if (mData.followTargetType == EffectFollowType.Effect_Follow_Target
  122. || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Bloodbar
  123. || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Floor)
  124. {
  125. AttachTransform (mTargetTransform, mEffectGO.transform, mData.targetObjName);
  126. }
  127. else if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back
  128. || mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Normal)
  129. {
  130. if (BattleCamera.Instance != null)
  131. mEffectGO.transform.SetParent (BattleCamera.Instance.RealCamera.transform);
  132. }
  133. mEffectGO.transform.localPosition = new Vector3 (0f, 0f, 0f);
  134. mEffectGO.transform.localEulerAngles = mData.rot;
  135. mEffectGO.transform.localScale = new Vector3 (1f, 1f, 1f);
  136. UpdateFollowFloorPosition ();
  137. }
  138. void AttachTransform (Transform tParent, Transform tChild, string name)
  139. {
  140. var attachParent = UnityEngineUtils.RecurisiveFindTransformChild (tParent, name);
  141. if (attachParent == null)
  142. attachParent = tParent;
  143. tChild.SetParent (attachParent);
  144. }
  145. void SyncPosition (Transform toSync, Transform targetTransform, string name)
  146. {
  147. if (toSync == null || targetTransform == null)
  148. return;
  149. Transform t = UnityEngineUtils.RecurisiveFindTransformChild (targetTransform, name);
  150. toSync.position = t != null ? targetTransform.TransformPoint (targetTransform.InverseTransformPoint (t.position)) : targetTransform.TransformPoint (Vector3.zero);
  151. }
  152. void SetTargetPosition ()
  153. {
  154. if (mEffectGO == null)
  155. return;
  156. //如果设置了跟随,忽略目标属性
  157. if (mData.followTargetType != EffectFollowType.Effect_Follow_None)
  158. return;
  159. LookAtOwnerForward ();
  160. mEffectGO.transform.localPosition = Vector3.zero;
  161. mEffectGO.transform.localEulerAngles = mData.rot;
  162. mEffectGO.transform.localScale = Vector3.one;
  163. if (mData.targetType == EffectTargetType.Effect_Target_Self || mData.targetType == EffectTargetType.Effect_Target_Self_Floor) {
  164. SyncPosition (mEffectGO.transform, mOwnerTransform, mData.targetObjName);
  165. } else if (mData.targetType == EffectTargetType.Effect_Target_Target || mData.targetType == EffectTargetType.Effect_Target_Target_Floor) {
  166. SyncPosition (mEffectGO.transform, mTargetTransform, mData.targetObjName);
  167. } else if (mData.targetType == EffectTargetType.Effect_Target_Bullet) {
  168. SyncPosition (mEffectGO.transform, mBulletTransform, mData.targetObjName);
  169. } else if (mData.targetType == EffectTargetType.Effect_Target_To_Self)
  170. {
  171. if (mOwnerTransform != null && mTargetTransform != null) {
  172. MoveFromToWithTransform moveFromTo = mEffectGO.GetComponent<MoveFromToWithTransform> (true);
  173. mEffectGO.transform.position = mTargetTransform.position;
  174. moveFromTo.from = mTargetTransform;
  175. moveFromTo.to = mOwnerTransform;
  176. moveFromTo.enabled = true;
  177. }
  178. return;
  179. } else if (mData.targetType == EffectTargetType.Effect_Self_To_Target)
  180. {
  181. if (mOwnerTransform != null && mTargetTransform != null) {
  182. MoveFromToWithTransform moveFromTo = mEffectGO.GetComponent<MoveFromToWithTransform> (true);
  183. mEffectGO.transform.position = mOwnerTransform.position;
  184. moveFromTo.from = mOwnerTransform;
  185. moveFromTo.to = mTargetTransform;
  186. moveFromTo.enabled = true;
  187. }
  188. return;
  189. }
  190. }
  191. void LookAtOwnerForward()
  192. {
  193. if (mEffectGO == null)
  194. return;
  195. if (mOwnerTransform != null)
  196. mEffectGO.transform.LookAt (mEffectGO.transform.position + mOwnerTransform.position);
  197. }
  198. void SetLocalTransform ()
  199. {
  200. if (mEffectGO == null)
  201. return;
  202. if (mData.followTargetType != EffectFollowType.Effect_Follow_None)
  203. {
  204. if (mData.followTargetType == EffectFollowType.Effect_Follow_Self_Bloodbar) {
  205. Fighter fighter = GetTransformFighter (mOwnerTransform);
  206. if (fighter != null)
  207. mEffectGO.transform.localPosition += fighter.Actor.AvatarData.bloodBarPos.y * Vector3.up;
  208. } else if (mData.followTargetType == EffectFollowType.Effect_Follow_Target_Bloodbar) {
  209. Fighter fighter = GetTransformFighter (mTargetTransform);
  210. if (fighter != null)
  211. mEffectGO.transform.localPosition += fighter.Actor.AvatarData.bloodBarPos.y * Vector3.up;
  212. }
  213. }
  214. }
  215. Fighter GetTransformFighter (Transform t)
  216. {
  217. if (t == null)
  218. return null;
  219. FighterGoCtrl fighterCtrl = t.GetComponent<FighterGoCtrl> ();
  220. return fighterCtrl == null ? null : fighterCtrl.Fighter;
  221. }
  222. void SetFloorPosition ()
  223. {
  224. if (mEffectGO == null)
  225. return;
  226. if (mData.followTargetType == EffectFollowType.Effect_Follow_None
  227. && (mData.targetType == EffectTargetType.Effect_Target_Self_Floor || mData.targetType == EffectTargetType.Effect_Target_Target_Floor)
  228. && BattleMgr.Instance != null && BattleMgr.Instance.Battle.CurBattleField != null)
  229. mEffectGO.transform.position = mEffectGO.transform.position.SetY (BattleMgr.Instance.Battle.CurBattleField.FloorY);
  230. }
  231. void UpdateFollowFloorPosition()
  232. {
  233. if (mEffectGO == null)
  234. return;
  235. if ((mData.followTargetType == EffectFollowType.Effect_Follow_Self_Floor || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Floor)
  236. && BattleMgr.Instance != null && BattleMgr.Instance.Battle.CurBattleField != null)
  237. mEffectGO.transform.position = mEffectGO.transform.position.SetY (BattleMgr.Instance.Battle.CurBattleField.FloorY);
  238. }
  239. void SetLookAt ()
  240. {
  241. if (lookType == 1 && mTargetTransform != null) {
  242. mEffectGO.transform.LookAt (mTargetTransform.position);
  243. }
  244. }
  245. void SetUnscalTimePartical ()
  246. {
  247. if (mEffectGO == null)
  248. return;
  249. UnityEngineUtils.SetUnscalTimePartical (mEffectGO);
  250. }
  251. void Show ()
  252. {
  253. if (mEffectGO != null)
  254. mEffectGO.SetActive (true);
  255. }
  256. void Initialze ()
  257. {
  258. CreateEffectGo ();
  259. SetFollowParent ();
  260. SetTargetPosition ();
  261. SetLocalTransform ();
  262. SetFloorPosition ();
  263. SetLookAt ();
  264. Show ();
  265. }
  266. public void Hide ()
  267. {
  268. if (EffectGo != null)
  269. CommonUtil.SetGameObjectLayer (EffectGo, BattleCamera.DisableLayerName);
  270. }
  271. public void UnHide ()
  272. {
  273. if (EffectGo != null) {
  274. if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back)
  275. CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.BackScreenLayerName);
  276. else if (mOwnerTransform != null) {
  277. if (!string.IsNullOrEmpty (mForceLayer))
  278. CommonUtil.SetGameObjectLayer (mEffectGO, mForceLayer);
  279. else
  280. CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.CurrentEffectLayerName);
  281. }
  282. }
  283. }
  284. public void SetScale(float scale)
  285. {
  286. if(EffectGo != null)
  287. {
  288. EffectGo.transform.localScale = new Vector3(scale, scale, scale);
  289. }
  290. }
  291. public void Dispose()
  292. {
  293. if (IsDisposed)
  294. return;
  295. if (mEffectGO != null)
  296. {
  297. ResourceMgr.Instance.RecycleGO(Constants.EffectPath, mData.effect, mEffectGO);
  298. mEffectGO = null;
  299. }
  300. IsDisposed = true;
  301. }
  302. public void Destroy()
  303. {
  304. Dispose();
  305. mData = null;
  306. mOwnerTransform = null;
  307. mTargetTransform = null;
  308. mBulletTransform = null;
  309. }
  310. }