LogicBattleFieldStateEnd.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class LogicBattleFieldStateEnd : LogicBattleFieldState
  5. {
  6. public static LogicBattleFieldState Creator (LogicBattleField field)
  7. {
  8. return new LogicBattleFieldStateEnd (field);
  9. }
  10. public LogicBattleFieldStateEnd (LogicBattleField field)
  11. : base (field, LogicBattleFieldStateType.End)
  12. {
  13. }
  14. private BattleEndInfo mEndInfo;
  15. bool isPlayRecord = false;
  16. float mWaitTime = 0;
  17. FighterManager mFighterMgr;
  18. const int m_relive_delay_time_cfgid = 31;
  19. public override void OnEnter ()
  20. {
  21. switch (mField.Result)
  22. {
  23. case FightingResult.Failed:
  24. BattleMgr.Instance.OnBattleFailed(mField.killBoss);
  25. break;
  26. case FightingResult.Win:
  27. BattleMgr.Instance.OnBattleWin(mField.killBoss);
  28. break;
  29. case FightingResult.Peace:
  30. BattleMgr.Instance.OnBattleForceStop(mField.killBoss);
  31. break;
  32. }
  33. mWaitTime = mField.killBoss ? GlobalConfig.Instance.GetConfigFloatValue(m_relive_delay_time_cfgid) : GlobalConfig.Instance.GetConfigFloatValue(52);
  34. mFighterMgr = mField.Battle.FighterMgr;
  35. mField.Battle.NeedBackToLastPos = mField.killBoss;
  36. mField.Battle.BackToPos = mField.PreSpawnPos;
  37. isPlayRecord = mField.Battle.IsPlayRecord;
  38. mEndInfo = new BattleEndInfo();
  39. mEndInfo.IsPlayRecord = isPlayRecord;
  40. mField.Battle.EndStatistics();
  41. if (mField.killBoss) {
  42. mField.Battle.Factors = null;
  43. mField.Battle.BattleScene.RestoreSkyboxMat();
  44. EventMgr.DispatchEvent<bool>(new CoreEvent<bool>(ECoreEventType.EID_RESTORE_SCENE, true));
  45. }
  46. else {
  47. FadeOut();
  48. mField.DropItems();
  49. }
  50. ReliveFighters(); //复活我方 清空敌方
  51. if (mField.HasTeamMemberDead())
  52. BattleMgr.Instance.PlayCameraReliveEffect();
  53. if (mField.Battle.Recorder != null)
  54. {
  55. mField.Battle.CloseRecorder();
  56. }
  57. if(isPlayRecord)
  58. {
  59. mWaitTime = 0;
  60. }
  61. }
  62. void ReliveFighters()
  63. {
  64. List<Fighter> fighters = mField.Fighters;
  65. for (int idx = fighters.Count - 1; idx >= 0; idx--)
  66. {
  67. Fighter fighter = fighters[idx];
  68. if (fighter.IsTeamMember)
  69. {
  70. if (!fighter.IsAlive)
  71. {
  72. fighter.Relive(100);
  73. }
  74. else
  75. {
  76. fighter.ResetLife();
  77. fighter.ForceIdle();
  78. }
  79. }
  80. else
  81. {
  82. if (fighter.IsDisposed && fighter.Ctrl != null)
  83. fighter.Ctrl.OnDisposed(true);
  84. else if (fighter.IsSpawned && !fighter.IsDisposed)
  85. fighter.Dispose();
  86. }
  87. }
  88. }
  89. void FadeOut()
  90. {
  91. List<Fighter> fighters = mField.Fighters;
  92. for (int idx = fighters.Count - 1; idx >= 0; idx--)
  93. {
  94. Fighter fighter = fighters[idx];
  95. if (fighter.Actor.IsNpc)
  96. {
  97. if (fighter.IsSpawned && !fighter.IsAlive)
  98. fighter.Ctrl.FadeOut(mWaitTime);
  99. }
  100. }
  101. }
  102. public override void OnLeave ()
  103. {
  104. Dispose();
  105. mField.ClearFighter();
  106. mField.Battle.PreviousFightingTime = mField.FightingTime;
  107. BattleMgr.Instance.OnBattleEnd(0,mEndInfo); //传递mEndInfo 防止在等待中 原值修改
  108. if (isPlayRecord)
  109. {
  110. mField.Battle.FighterMgr.RestoreTeamFighters();
  111. }
  112. }
  113. public override void Update (float deltaTime)
  114. {
  115. mWaitTime -= deltaTime;
  116. if (mWaitTime <= 0)
  117. ChangeState (LogicBattleFieldStateType.None);
  118. }
  119. public override void OnDataChanged()
  120. {
  121. }
  122. void Dispose()
  123. { //刪除存活的敌方
  124. List<Fighter> fighters = mField.Fighters;
  125. for (int i = fighters.Count - 1; i >= 0; i--)
  126. {
  127. Fighter fighter = fighters[i];
  128. if (fighter.IsTeamMember)//如果非正常失败 角色没有死亡 会被删除 后续无法复活
  129. continue;
  130. if (fighter.IsAlive)
  131. {
  132. fighter.Dispose();
  133. }
  134. }
  135. }
  136. }