BattleManager.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class BattleManager : MonoBehaviour
  5. {
  6. // 死亡时角色使用的材质
  7. public Material DeathMaterial;
  8. // 角色贴图数组(用于不同状态或类型)
  9. public Texture[] CharacterTextures;
  10. // 玩家战士预制体
  11. public GameObject PlayerWarriorPrefab;
  12. // 玩家弓箭手预制体
  13. public GameObject PlayerArcherPrefab;
  14. // 敌人战士预制体
  15. public GameObject EnemyWarriorPrefab;
  16. // 敌人弓箭手预制体
  17. public GameObject EnemyArcherPrefab;
  18. // 死亡掉落金币的预制体
  19. public GameObject GoldForDeadPrefab;
  20. // 战士升级等级数组
  21. public UpgradeLevels[] WarriorUpgradeLevel;
  22. // 当前关卡的敌方战士列表
  23. [HideInInspector] public List<Warrior> EnemyStageWarriors = new List<Warrior>();
  24. // 当前关卡的玩家战士列表
  25. [HideInInspector] public List<Warrior> PlayerStageWarriors = new List<Warrior>();
  26. // 用于记录玩家移动到下一个点的计数器
  27. private int _counter;
  28. // 标记当前关卡是否已经结束
  29. private bool _isStageEnd;
  30. /// <summary>
  31. /// 开始战斗,初始化敌我双方单位,重置状态并开始寻敌
  32. /// </summary>
  33. public void StartBattle()
  34. {
  35. // EnemyStageWarriors.Clear(); // 预留清空敌人列表
  36. _isStageEnd = false;
  37. // 获取当前关卡的敌人和玩家单位
  38. EnemyStageWarriors = ComponentsManager.StagesManager.GetCurrentStageItem.Enemys;
  39. PlayerStageWarriors = ComponentsManager.PlayerArmyManager.PlayerWarriors;
  40. // 初始化敌方单位,解除停止状态并开始寻敌
  41. for (int i = 0; i < EnemyStageWarriors.Count; i++)
  42. {
  43. EnemyStageWarriors[i].IsStop = false;
  44. EnemyStageWarriors[i].SearchTarget();
  45. }
  46. // 初始化玩家单位,解除停止状态并开始寻敌
  47. for (int i = 0; i < PlayerStageWarriors.Count; i++)
  48. {
  49. PlayerStageWarriors[i].IsStop = false;
  50. PlayerStageWarriors[i].SearchTarget();
  51. }
  52. }
  53. /// <summary>
  54. /// 检查当前战斗状态,判断胜负并处理关卡切换或结算
  55. /// </summary>
  56. public void CheckStatus()
  57. {
  58. // 实时获取最新的敌我双方单位列表
  59. EnemyStageWarriors = ComponentsManager.StagesManager.GetCurrentStageItem.Enemys;
  60. PlayerStageWarriors = ComponentsManager.PlayerArmyManager.PlayerWarriors;
  61. // 玩家胜利判定:敌人全部消灭
  62. if (EnemyStageWarriors.Count <= 0)
  63. {
  64. if (!_isStageEnd)
  65. {
  66. _isStageEnd = true;
  67. // 还有下一关,进入下一关
  68. if (ComponentsManager.StagesManager.NextStage())
  69. {
  70. _counter = 0;
  71. // 玩家单位移动到下一关的起点
  72. for (int i = 0; i < PlayerStageWarriors.Count; i++)
  73. {
  74. PlayerStageWarriors[i].IsStop = true;
  75. PlayerStageWarriors[i]
  76. .GoToNextPoint(ComponentsManager.StagesManager.GetCurrentStageItem.GetPlayerPoint(_counter).position);
  77. _counter++;
  78. }
  79. // 协程处理关卡胜利后的过渡
  80. StartCoroutine(StageWin());
  81. }
  82. else
  83. {
  84. // 没有下一关,玩家全体胜利
  85. for (int i = 0; i < PlayerStageWarriors.Count; i++)
  86. PlayerStageWarriors[i].PlayerWinner();
  87. ComponentsManager.GameUI.PlayerWinner();
  88. }
  89. }
  90. }
  91. // 玩家失败判定:玩家单位全部消灭
  92. if (PlayerStageWarriors.Count <= 0)
  93. {
  94. if (!_isStageEnd)
  95. {
  96. _isStageEnd = true;
  97. // 敌人单位播放胜利动画
  98. for (int i = 0; i < EnemyStageWarriors.Count; i++)
  99. {
  100. EnemyStageWarriors[i].IsStop = true;
  101. EnemyStageWarriors[i].PlayerWinner();
  102. }
  103. ComponentsManager.GameUI.PlayerLose();
  104. }
  105. }
  106. }
  107. /// <summary>
  108. /// 关卡胜利后的过渡协程,切换镜头、重置玩家单位、返回菜单
  109. /// </summary>
  110. IEnumerator StageWin()
  111. {
  112. yield return new WaitForSeconds(1.5f); // 等待1.5秒
  113. ComponentsManager.CameraScript.SetCameraPosition(new Vector3(-3.75f, 13f,
  114. -16f + (ComponentsManager.StagesManager.StageLevel * 23)));
  115. yield return new WaitForSeconds(4f); // 再等待4秒
  116. ComponentsManager.PlayerArmyManager.ResetPlayerWarriors(); // 重置玩家单位
  117. ComponentsManager.MenuUI.ActivateMenu(true); // 返回菜单界面
  118. }
  119. }