# Skill 系统总结

# Skill

Skill 类是所有技能类的基础类,提供通用的技能逻辑和方法。


# 主要特点

# 1. 冷却机制

  • 通过 cooldowncooldownTimer 属性管理技能的冷却时间。

  • 每帧更新冷却计时器。

# 实现方式:

row
1
2
3
4
protected virtual void Update()
{
cooldownTimer -= Time.deltaTime;
}

# 2. 技能使用逻辑

  • 提供 CanUseSkill() 方法检查技能是否可以使用。

  • 如果可以使用技能,则重置冷却时间并调用 UseSkill()

# 实现方式:

row
1
2
3
4
5
6
7
8
9
10
11
12
public virtual bool CanUseSkill()
{
if (cooldownTimer < 0)
{
UseSkill();
cooldownTimer = cooldown;
return true;
}

player.fx.CreatePopUpText("Cooldown");
return false;
}

# 3. 解锁检测

  • 提供 CheckUnlock() 方法,用于子类实现具体的解锁逻辑。

  • Start() 方法中调用。

# 实现方式:

row
1
2
3
4
5
protected virtual void Start()
{
player = PlayerManager.instance.player;
CheckUnlock();
}

# 4. 最近敌人查找

  • 提供 FindClosestEnemy() 方法,用于查找指定范围内最近的敌人。

# 实现方式:

row
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
protected virtual Transform FindClosestEnemy(Transform _checkTransform)
{
// 在指定的 Transform(_checkTransform)周围的半径为25的范围内查找所有的碰撞体
Collider2D[] colliders = Physics2D.OverlapCircleAll(_checkTransform.position, 25);

// 初始化最近敌人的距离为正无穷大,以便找到最近的敌人
float closestDistance = Mathf.Infinity;
// 初始化最近敌人的 Transform 变量为 null
Transform closestEnemy = null;

// 遍历所有检测到的碰撞体
foreach (var hit in colliders)
{
// 检查当前碰撞体是否附加了一个 Enemy 脚本(表示这是一个敌人)
if (hit.GetComponent<Enemy>() != null)
{
// 计算 _checkTransform 到当前敌人的距离
float distanceToEnemy = Vector2.Distance(_checkTransform.position, hit.transform.position);

// 如果当前敌人距离小于之前记录的最近距离
if (distanceToEnemy < closestDistance)
{
// 更新最近的距离
closestDistance = distanceToEnemy;
// 更新最近敌人的 Transform
closestEnemy = hit.transform;
}
}
}

// 返回最近敌人的 Transform(如果没有敌人,则返回 null)
return closestEnemy;
}


# 子类继承

Skill 类提供了基础功能,供所有技能类继承和扩展。例如:

  • Sword_Skill

  • Dash_Skill

  • Clone_Skill

子类可以重写以下方法以实现自定义逻辑:

  • Start()

  • Update()

  • UseSkill()

  • CheckUnlock()


# SkillManager

SkillManager 类是技能系统的核心组件,负责初始化并提供对所有技能实例的全局访问。


# 主要特点

# 1. 单例模式

  • 确保 SkillManager 全局仅有一个实例。

  • 可通过静态属性 instance 进行访问。

# 实现方式:

1
2
3
4
5
6
7
private void Awake()
{
if (instance != null)
Destroy(instance.gameObject);
else
instance = this;
}

  • 如果已有另一个实例,销毁当前游戏对象。

  • 否则,将当前对象设置为全局实例。


# 2. 技能实例管理

  • 为每个技能维护私有字段,并通过只读公共属性提供访问。

  • 动态加载附加在同一游戏对象上的技能组件。

# 初始化方式:

1
2
3
4
5
6
7
8
9
10
private void Start()
{
dash = GetComponent<Dash_Skill>();
clone = GetComponent<Clone_Skill>();
sword = GetComponent<Sword_Skill>();
blackhole = GetComponent<Blackhole_Skill>();
crystal = GetComponent<Crystal_Skill>();
parry = GetComponent<Parry_Skill>();
dodge = GetComponent<Dodge_Skill>();
}

  • 使用 GetComponent<T>() 获取以下组件:

    • Dash_Skill

    • Clone_Skill

    • Sword_Skill

    • Blackhole_Skill

    • Crystal_Skill

    • Parry_Skill

    • Dodge_Skill


# 管理的技能字段

  • dash : 对应 Dash_Skill 实例。

  • clone : 对应 Clone_Skill 实例。

  • sword : 对应 Sword_Skill 实例。

  • blackhole : 对应 Blackhole_Skill 实例。

  • crystal : 对应 Crystal_Skill 实例。

  • parry : 对应 Parry_Skill 实例。

  • dodge : 对应 Dodge_Skill 实例。


# 系统角色

  • SkillManager 是所有技能相关操作的主要访问点。

  • 其他游戏组件通过该管理器与技能交互,确保操作集中化。


# 各技能类

# 1. Sword_Skill

Sword_SkillSkill 的派生类,专注于与剑相关的技能逻辑,包括多种剑类型及其相应的解锁和使用机制。

# 主要特点

# 1. 剑的类型
  • 提供 4 种剑类型:

    • Regular(普通)

    • Bounce(弹射)

    • Pierce(穿刺)

    • Spin(旋转)

  • 不同类型剑有独特的属性,如重力、弹射次数、旋转持续时间等。

# 类型定义:

row
1
2
3
4
5
6
7
public enum SwordType
{
Regular,
Bounce,
Pierce,
Spin
}


# 2. 解锁机制

  • 每种剑类型通过解锁按钮控制。

  • 提供以下方法来解锁对应剑类型:

    • UnlockSword()

    • UnlockBounceSword()

    • UnlockPierceSword()

    • UnlockSpinSword()

    • UnlockTimeStop() (时间停止被动技能)

    • UnlockVulnurable() (脆弱被动技能)

# 解锁逻辑:

row
1
2
3
4
5
6
7
8
private void UnlockSword()
{
if (swordUnlockButton.unlocked)
{
swordType = SwordType.Regular;
swordUnlocked = true;
}
}


# 3. 辅助瞄准

  • 提供瞄准点(Aim Dots)功能,显示剑的预计轨迹。

  • 瞄准点的位置由抛物线计算决定。

# 实现方式:

row
1
2
3
4
5
6
7
8
public Vector2 AimDirection()
{
Vector2 playerPosition = player.transform.position;
Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = mousePosition - playerPosition;

return direction;
}


# 4. 创建剑

  • CreateSword() 方法用于生成剑,并根据当前剑类型配置剑的行为。

  • 每种剑类型调用对应的 Setup 方法配置独特行为。

# 实现方式:

row
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void CreateSword()

    {
        // 创建新的剑实例,并将其位置设置为玩家的位置,方向与当前物体一致
        GameObject newSword = Instantiate(swordPrefab, player.transform.position, transform.rotation);

        // 获取新剑对象的 Sword_Skill_Controller 脚本
        Sword_Skill_Controller newSwordScript = newSword.GetComponent<Sword_Skill_Controller>();
        // 根据剑的类型设置对应的技能效果
        if (swordType == SwordType.Bounce)
            newSwordScript.SetupBounce(true, bounceAmount, bounceSpeed); // 设置反弹剑效果
        else if (swordType == SwordType.Pierce)
            newSwordScript.SetupPierce(pierceAmount); // 设置穿刺剑效果
        else if (swordType == SwordType.Spin)
            newSwordScript.SetupSpin(true, maxTravelDistance, spinDuration, hitCooldown); // 设置旋转剑效果
           
        // 设置通用剑属性,如方向、重力、玩家引用、冻结时间和返回速度
        newSwordScript.SetupSword(finalDir, swordGravity, player, freezeTimeDuration, returnSpeed);
       
        // 将新创建的剑分配给玩家
        player.AssignNewSword(newSword);

        // 禁用某些点的显示(具体作用依赖于实现)
        DotsActive(false);

    }

# 5. 其他功能

  • 时间停止(Time Stop)和脆弱(Vulnerable)被动技能

    • 解锁后会自动激活对应效果。
  • 解锁状态检测:在 CheckUnlock() 方法中检查所有解锁按钮状态。

# 总结

  • 提供与剑相关的技能逻辑和实现。

  • 支持多种剑类型和扩展功能,如辅助瞄准和被动技能。

  • Skill 基类和 SkillManager 交互,共享技能系统的框架。

# 2. Blackhole_Skill.cs

  • 功能:实现黑洞技能,生成黑洞并吸引敌人,同时支持黑洞的生长和收缩机制。
  • 特性
    • 黑洞的大小、持续时间、以及攻击次数可配置。
    • 可在特定状态下触发结束。
  • 技能关联
    • 调用 SkillManager.instance 来播放音效或控制黑洞状态。

# 3. Clone_Skill.cs

  • 功能:实现召唤克隆体的技能,并支持多种克隆相关特性。
  • 特性
    • 支持攻击型克隆、侵略性克隆、多重克隆和水晶替代克隆。
    • 提供克隆生成的延迟机制。
  • 技能关联
    • Crystal_Skill 可以替代克隆生成。
    • 与其他技能(如 Dash_SkillDodge_Skill )的特性协同。

# 4. Crystal_Skill.cs

  • 功能:实现水晶技能,水晶可以作为防御机制,也支持爆炸和移动特性。
  • 特性
    • 支持多层堆叠水晶的生成和使用。
    • 提供爆炸型和移动型水晶解锁机制。
    • 可与克隆技能互相替代。
  • 技能关联
    • Clone_Skill 协作实现水晶和克隆的互相替代功能。

# 5. Dash_Skill.cs

  • 功能:实现冲刺技能,支持冲刺时生成克隆体或抵达目标位置后生成克隆体。
  • 特性
    • 可解锁冲刺克隆和到达克隆两种特性。
  • 技能关联
    • 调用 Clone_Skill 来生成克隆。

# 6. Dodge_Skill.cs

  • 功能:实现闪避技能,支持闪避镜像功能。
  • 特性
    • 提升闪避数值,并提供镜像闪避的解锁选项。
  • 技能关联
    • 使用 Clone_Skill 生成镜像。

# 7. Parry_Skill.cs

  • 功能:实现格挡技能,可恢复生命值或生成镜像。
  • 特性
    • 支持恢复生命值的解锁选项。
    • 在成功格挡时触发镜像生成。
  • 技能关联
    • 通过 Clone_Skill 实现镜像生成。

# 文件之间的联系

  1. SkillManager.cs 负责管理所有技能类,是各技能的单一入口。
  2. 技能之间的交互
    • 多个技能通过 SkillManager 调用其他技能实例。例如:
      • Dash_SkillDodge_Skill 会调用 Clone_Skill
      • Sword_SkillCrystal_Skill 之间有能力互相替代。
    • 大部分技能类使用基础类 Skill.cs 提供的通用逻辑。

如需进一步补充或优化,请告诉我!