89 lines
3.0 KiB
C#
89 lines
3.0 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Animancer;
|
|
using BaseGames.Combat;
|
|
using BaseGames.Skills; // FeedbackPresetSO
|
|
using BaseGames.Localization;
|
|
|
|
namespace BaseGames.Spells
|
|
{
|
|
/// <summary>
|
|
/// 法术消耗的资源类型。
|
|
/// </summary>
|
|
public enum SpellResourceType { SoulPower, SpiritPower }
|
|
|
|
/// <summary>
|
|
/// 法术效果分类(决定施放时的逻辑分支)。
|
|
/// </summary>
|
|
public enum SpellEffectType
|
|
{
|
|
Projectile, // 投射物法术
|
|
AreaOfEffect, // 范围爆炸
|
|
SelfBuff, // 自身增益(护盾/加速/再生)
|
|
SummonShade, // 召唤投影
|
|
TeleportBlink, // 瞬移
|
|
}
|
|
|
|
/// <summary>
|
|
/// 法术数据 SO(架构 BaseGames.Spells)。
|
|
/// 创建路径:Assets/Data/Spells/SPL_{spellId}.asset
|
|
/// </summary>
|
|
[CreateAssetMenu(menuName = "BaseGames/Spells/Spell")]
|
|
public class SpellSO : ScriptableObject, ILocalizableAsset
|
|
{
|
|
[Header("Identity")]
|
|
[Tooltip("全局唯一 ID,建议使用 GameIds 域中的常量")]
|
|
public string spellId;
|
|
[Tooltip("本地化 Key(从 LocalizationManager.Get(displayNameKey, \"Spells\") 获取)")]
|
|
public string displayNameKey;
|
|
[Tooltip("本地化 Key,格式如 \"SPL_Fireball_Desc\"。通过 LocalizationManager.Get(descriptionKey, LocalizationTable.Spells) 获取。")]
|
|
[TextArea(1, 3)]
|
|
public string descriptionKey;
|
|
public Sprite icon;
|
|
|
|
[Header("Resource")]
|
|
public SpellResourceType resourceType;
|
|
[Min(1)]
|
|
public int baseCost;
|
|
[Min(0f)]
|
|
public float cooldown;
|
|
|
|
[Header("Effect")]
|
|
public SpellEffectType effectType;
|
|
public DamageSourceSO damageSource;
|
|
|
|
[Header("Projectile")]
|
|
public ProjectileConfigSO projectileConfig;
|
|
[Tooltip("是否追踪最近敌人")]
|
|
public bool isHoming;
|
|
|
|
[Header("AoE")]
|
|
[Min(0f)] public float explosionRadius;
|
|
[Min(0f)] public float explosionDelay;
|
|
|
|
[Header("Buff")]
|
|
[Min(0f)] public float buffDuration;
|
|
[Min(0f)] public float buffValue; // 含义由 effectType 决定(如护盾量、速度倍率)
|
|
|
|
[Header("Animation")]
|
|
public ClipTransition castAnimation;
|
|
[Min(0f)]
|
|
public float castLockDuration; // 施放锁定时长(秒)
|
|
|
|
[Header("HitBox Prefab")]
|
|
[Tooltip("近战/爆炸类法术的命中盒 Prefab(投射物法术留空)")]
|
|
public GameObject spellHitBoxPrefab;
|
|
|
|
[Header("Feedback")]
|
|
public FeedbackPresetSO castFeedback;
|
|
|
|
public IEnumerable<LocalizationKeyRef> GetLocalizationKeys()
|
|
{
|
|
if (!string.IsNullOrEmpty(displayNameKey))
|
|
yield return new LocalizationKeyRef(displayNameKey, "Spells", nameof(displayNameKey));
|
|
if (!string.IsNullOrEmpty(descriptionKey))
|
|
yield return new LocalizationKeyRef(descriptionKey, "Spells", nameof(descriptionKey));
|
|
}
|
|
}
|
|
}
|