Files
zeling_v2/Assets/_Game/Scripts/Spells/SpellSO.cs
2026-05-25 11:54:37 +08:00

89 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.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));
}
}
}