123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class BattleManager : MonoBehaviour
- {
- // 死亡时角色使用的材质
- public Material DeathMaterial;
- // 角色贴图数组(用于不同状态或类型)
- public Texture[] CharacterTextures;
- // 玩家战士预制体
- public GameObject PlayerWarriorPrefab;
- // 玩家弓箭手预制体
- public GameObject PlayerArcherPrefab;
- // 敌人战士预制体
- public GameObject EnemyWarriorPrefab;
- // 敌人弓箭手预制体
- public GameObject EnemyArcherPrefab;
- // 死亡掉落金币的预制体
- public GameObject GoldForDeadPrefab;
- // 战士升级等级数组
- public UpgradeLevels[] WarriorUpgradeLevel;
- // 当前关卡的敌方战士列表
- [HideInInspector] public List<Warrior> EnemyStageWarriors = new List<Warrior>();
- // 当前关卡的玩家战士列表
- [HideInInspector] public List<Warrior> PlayerStageWarriors = new List<Warrior>();
- // 用于记录玩家移动到下一个点的计数器
- private int _counter;
- // 标记当前关卡是否已经结束
- private bool _isStageEnd;
- /// <summary>
- /// 开始战斗,初始化敌我双方单位,重置状态并开始寻敌
- /// </summary>
- public void StartBattle()
- {
- // EnemyStageWarriors.Clear(); // 预留清空敌人列表
- _isStageEnd = false;
- // 获取当前关卡的敌人和玩家单位
- EnemyStageWarriors = ComponentsManager.StagesManager.GetCurrentStageItem.Enemys;
- PlayerStageWarriors = ComponentsManager.PlayerArmyManager.PlayerWarriors;
- // 初始化敌方单位,解除停止状态并开始寻敌
- for (int i = 0; i < EnemyStageWarriors.Count; i++)
- {
- EnemyStageWarriors[i].IsStop = false;
- EnemyStageWarriors[i].SearchTarget();
- }
- // 初始化玩家单位,解除停止状态并开始寻敌
- for (int i = 0; i < PlayerStageWarriors.Count; i++)
- {
- PlayerStageWarriors[i].IsStop = false;
- PlayerStageWarriors[i].SearchTarget();
- }
- }
- /// <summary>
- /// 检查当前战斗状态,判断胜负并处理关卡切换或结算
- /// </summary>
- public void CheckStatus()
- {
- // 实时获取最新的敌我双方单位列表
- EnemyStageWarriors = ComponentsManager.StagesManager.GetCurrentStageItem.Enemys;
- PlayerStageWarriors = ComponentsManager.PlayerArmyManager.PlayerWarriors;
- // 玩家胜利判定:敌人全部消灭
- if (EnemyStageWarriors.Count <= 0)
- {
- if (!_isStageEnd)
- {
- _isStageEnd = true;
- // 还有下一关,进入下一关
- if (ComponentsManager.StagesManager.NextStage())
- {
- _counter = 0;
- // 玩家单位移动到下一关的起点
- for (int i = 0; i < PlayerStageWarriors.Count; i++)
- {
- PlayerStageWarriors[i].IsStop = true;
- PlayerStageWarriors[i]
- .GoToNextPoint(ComponentsManager.StagesManager.GetCurrentStageItem.GetPlayerPoint(_counter).position);
- _counter++;
- }
- // 协程处理关卡胜利后的过渡
- StartCoroutine(StageWin());
- }
- else
- {
- // 没有下一关,玩家全体胜利
- for (int i = 0; i < PlayerStageWarriors.Count; i++)
- PlayerStageWarriors[i].PlayerWinner();
- ComponentsManager.GameUI.PlayerWinner();
- }
- }
- }
- // 玩家失败判定:玩家单位全部消灭
- if (PlayerStageWarriors.Count <= 0)
- {
- if (!_isStageEnd)
- {
- _isStageEnd = true;
- // 敌人单位播放胜利动画
- for (int i = 0; i < EnemyStageWarriors.Count; i++)
- {
- EnemyStageWarriors[i].IsStop = true;
- EnemyStageWarriors[i].PlayerWinner();
- }
- ComponentsManager.GameUI.PlayerLose();
- }
- }
- }
- /// <summary>
- /// 关卡胜利后的过渡协程,切换镜头、重置玩家单位、返回菜单
- /// </summary>
- IEnumerator StageWin()
- {
- yield return new WaitForSeconds(1.5f); // 等待1.5秒
- ComponentsManager.CameraScript.SetCameraPosition(new Vector3(-3.75f, 13f,
- -16f + (ComponentsManager.StagesManager.StageLevel * 23)));
- yield return new WaitForSeconds(4f); // 再等待4秒
- ComponentsManager.PlayerArmyManager.ResetPlayerWarriors(); // 重置玩家单位
- ComponentsManager.MenuUI.ActivateMenu(true); // 返回菜单界面
- }
- }
|