using UnityEngine; /// /// AI 召唤师控制器:自动召唤单位攻击玩家 /// public class AISummoner : MonoBehaviour { [Header("AI 配置")] [Tooltip("召唤间隔(秒)")] [Min(1f)] public float summonInterval = 3f; [Tooltip("随机偏移范围(秒),避免太规律")] [Min(0f)] public float summonRandomOffset = 1f; [Tooltip("AI 难度:召唤CD缩放(越小越快)")] [Range(0.5f, 2f)] public float difficultyScale = 1f; [Header("能量管理")] [Tooltip("AI 初始能量")] [Min(0)] public int startingMana = 150; [Tooltip("AI 是否使用无限能量")] public bool unlimitedMana = false; private MainCharacterCombat combat; private ManaSystem manaSystem; private float summonCooldown; private bool isActive; private void Start() { combat = GetComponent(); if (combat == null) { Debug.LogError($"[AISummoner] {name} 缺少 MainCharacterCombat 组件!"); enabled = false; return; } manaSystem = FindObjectOfType(); if (manaSystem == null) { Debug.LogWarning($"[AISummoner] 场景中没有 ManaSystem,AI 将无法检查能量"); } // 初始延迟,避免开局立刻召唤 summonCooldown = summonInterval * difficultyScale; isActive = true; Debug.Log($"[AISummoner] {name} AI 初始化完成,召唤间隔: {summonInterval}s"); } private void Update() { if (!isActive) return; // AI 被眩晕时停止召唤 if (combat.IsStunned) return; summonCooldown -= Time.deltaTime; if (summonCooldown <= 0f) { TrySummon(); ResetCooldown(); } } private void TrySummon() { // 随机选择一个可召唤的角色槽位(1-5) var characters = combat.summonableCharacters; if (characters == null || characters.Length == 0) { Debug.LogWarning($"[AISummoner] {name} 没有可召唤的角色"); return; } // 过滤出有效的角色数据 int[] validSlots = new int[characters.Length]; int validCount = 0; for (int i = 0; i < characters.Length; i++) { if (characters[i] != null && characters[i].unitPrefab != null) { validSlots[validCount++] = i + 1; } } if (validCount == 0) { // 没有可召唤的角色(能量不足或没有有效角色) return; } // 随机选择一个有效槽位 int randomIndex = Random.Range(0, validCount); int selectedSlot = validSlots[randomIndex]; // 执行召唤(使用 MainCharacterCombat.RequestSummon) bool success = combat.RequestSummon(selectedSlot); if (success) { var selectedCharacter = characters[selectedSlot - 1]; Debug.Log($"[AISummoner] {name} 召唤了 {selectedCharacter.characterName} (槽位: {selectedSlot})"); } } private void ResetCooldown() { float randomOffset = Random.Range(-summonRandomOffset, summonRandomOffset); summonCooldown = summonInterval * difficultyScale + randomOffset; } /// /// 启用/禁用 AI /// public void SetActive(bool active) { isActive = active; Debug.Log($"[AISummoner] {name} AI {(active ? "启用" : "禁用")}"); } /// /// 调整难度(实时修改召唤速度) /// public void SetDifficulty(float scale) { difficultyScale = Mathf.Clamp(scale, 0.5f, 2f); Debug.Log($"[AISummoner] {name} 难度调整为 {difficultyScale}"); } }