Files
Cielonos/Assets/Scripts/MainGame/AttackArea/Submodules/EventSubmodule.cs
SoulliesOfficial 39b43680a9 爆更
2026-07-18 03:16:20 -04:00

72 lines
3.0 KiB
C#
Raw 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 System;
using System.Collections.Generic;
using Cielonos.MainGame.Characters;
using SLSUtilities.General;
using SoftCircuits.Collections;
using UnityEngine;
namespace Cielonos.MainGame
{
public partial class AttackAreaBase
{
/// <summary>
/// 统一管理 AttackArea 生命周期内的事件,避免事件数据散落在不同子模块中。
/// </summary>
public class EventSubmodule : AttackAreaSubmoduleBase
{
/// <summary>
/// 每次有效命中都会执行的通用命中事件,适合处理 Buff、印记、装备联动等命中后逻辑。
/// </summary>
public readonly List<Action<CharacterBase, Vector3>> onHit =
new List<Action<CharacterBase, Vector3>>();
/// <summary>
/// 只在指定 hitIndex 命中时执行的事件,用于多段攻击中某一段具有特殊效果的情况。
/// </summary>
public readonly SortedList<int, Action<CharacterBase, Vector3>> onIndexedHit =
new SortedList<int, Action<CharacterBase, Vector3>>();
/// <summary>
/// 成功触发 Breakthrough 时执行的事件,使用 key + priority 支持同一区域内多来源的有序处理。
/// </summary>
public readonly OrderedDictionary<string, PrioritizedAction<CharacterBase, Vector3>> onBreakthrough =
new OrderedDictionary<string, PrioritizedAction<CharacterBase, Vector3>>();
/// <summary>
/// 单次攻击结算完成后执行的事件,传入完整 Attack.Result适合根据 Outcome 播放反馈或触发后续机制。
/// </summary>
public readonly OrderedDictionary<string, PrioritizedAction<CharacterBase, Attack.Result>> onAttackFinished =
new OrderedDictionary<string, PrioritizedAction<CharacterBase, Attack.Result>>();
public EventSubmodule(AttackAreaBase owner) : base(owner)
{
}
public void InvokeHitEvents(CharacterBase target, Vector3 hitPosition, int hitIndex, bool canTriggerHitEvent)
{
if (!canTriggerHitEvent) return;
foreach (Action<CharacterBase, Vector3> hitEvent in onHit)
{
hitEvent.Invoke(target, hitPosition);
}
if (onIndexedHit.TryGetValue(hitIndex, out Action<CharacterBase, Vector3> action))
{
action.Invoke(target, hitPosition);
}
}
public void InvokeBreakthrough(CharacterBase target, Vector3 hitPosition)
{
onBreakthrough.Invoke(target, hitPosition);
}
public void InvokeAttackFinished(CharacterBase target, Attack.Result attackResult)
{
if (target == null || attackResult == null || attackResult.isReactionOnlyCheck) return;
onAttackFinished.Invoke(target, attackResult);
}
}
}
}