Files
huadexuan 11f1af357d 根据提供的code differences信息,由于没有具体的代码变更内容,我将生成一个通用的commit message模板:
```
docs(readme): 更新文档说明

- 添加项目使用指南
- 完善API接口说明
- 修正错误的配置示例
```

注意:由于您提供的code differences部分为空,以上是一个示例模板。当您有具体的代码变更时,请提供详细的变更内容以便生成更准确的commit message。
2026-10-02 10:04:12 +08:00

138 lines
3.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
/// <summary>
/// AI 召唤师控制器:自动召唤单位攻击玩家
/// </summary>
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<MainCharacterCombat>();
if (combat == null)
{
Debug.LogError($"[AISummoner] {name} 缺少 MainCharacterCombat 组件!");
enabled = false;
return;
}
manaSystem = FindObjectOfType<ManaSystem>();
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;
}
/// <summary>
/// 启用/禁用 AI
/// </summary>
public void SetActive(bool active)
{
isActive = active;
Debug.Log($"[AISummoner] {name} AI {(active ? "启用" : "禁用")}");
}
/// <summary>
/// 调整难度(实时修改召唤速度)
/// </summary>
public void SetDifficulty(float scale)
{
difficultyScale = Mathf.Clamp(scale, 0.5f, 2f);
Debug.Log($"[AISummoner] {name} 难度调整为 {difficultyScale}");
}
}