using System; using System.Collections; using System.Linq; using GAS.General; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Serialization; namespace GAS.Runtime { public abstract class AbilityAsset : ScriptableObject { protected const int WIDTH_LABEL = 70; public abstract Type AbilityType(); [TitleGroup("Base")] [HorizontalGroup("Base/H1", Width = 1 - 0.618f)] [TabGroup("Base/H1/V1", "Summary", SdfIconType.InfoSquareFill, TextColor = "#0BFFC5", Order = 1)] [HideLabel] [MultiLineProperty(10)] public string Description; [TabGroup("Base/H1/V2", "General", SdfIconType.AwardFill, TextColor = "#FF7F00", Order = 2)] [LabelText("所属能力", SdfIconType.FileCodeFill)] [LabelWidth(WIDTH_LABEL)] [ShowInInspector] [ValidateInput("@AbilityType() != null", "Ability Class is NULL!!! Please check.")] [PropertyOrder(-1)] public string InstanceAbilityClassFullName => AbilityType() != null ? AbilityType().FullName : null; #if UNITY_EDITOR [TabGroup("Base/H1/V2", "General")] [TabGroup("Base/H1/V2", "Detail", SdfIconType.TicketDetailedFill, TextColor = "#BC2FDE")] [LabelText("类型名称", SdfIconType.FileCodeFill)] [LabelWidth(WIDTH_LABEL)] [ShowInInspector] [PropertyOrder(-1)] public string TypeName => GetType().Name; [TabGroup("Base/H1/V2", "Detail")] [LabelText("类型全名", SdfIconType.FileCodeFill)] [LabelWidth(WIDTH_LABEL)] [ShowInInspector] [PropertyOrder(-1)] public string TypeFullName => GetType().FullName; [TabGroup("Base/H1/V2", "Detail")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, ShowPaging = false)] [ShowInInspector] [LabelText("继承关系")] [LabelWidth(WIDTH_LABEL)] [PropertyOrder(-1)] public string[] InheritanceChain => GetType().GetInheritanceChain().Reverse().ToArray(); #endif [TabGroup("Base/H1/V2", "General", SdfIconType.AwardFill)] [InfoBox(GASTextDefine.TIP_UNAME, InfoMessageType.None)] [LabelText("U-Name", SdfIconType.Fingerprint)] [LabelWidth(WIDTH_LABEL)] [ValidateInput("@GAS.General.Validation.Validations.IsValidVariableName($value)", "无效的名字 - 不符合C#标识符命名规则")] [InlineButton("@UniqueName = name", "Auto", Icon = SdfIconType.Hammer)] public string UniqueName; [TabGroup("Base/H1/V2", "General")] [Title("消耗&冷却", bold: true)] [LabelWidth(WIDTH_LABEL)] [AssetSelector] [LabelText(SdfIconType.HeartHalf, Text = GASTextDefine.ABILITY_EFFECT_COST)] public GameplayEffectAsset Cost; [TabGroup("Base/H1/V2", "General")] [LabelWidth(WIDTH_LABEL)] [AssetSelector] [LabelText(SdfIconType.StopwatchFill, Text = GASTextDefine.ABILITY_EFFECT_CD)] public GameplayEffectAsset Cooldown; [TabGroup("Base/H1/V2", "General")] [LabelWidth(WIDTH_LABEL)] [LabelText(SdfIconType.ClockFill, Text = GASTextDefine.ABILITY_CD_TIME)] [Unit(Units.Second)] public float CooldownTime; // Tags [TabGroup("Base/H1/V3", "Tags", SdfIconType.TagsFill, TextColor = "#45B1FF", Order = 3)] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@AssetTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [Tooltip("描述性质的标签,用来描述Ability的特性表现,比如伤害、治疗、控制等。")] [FormerlySerializedAs("AssetTag")] public GameplayTag[] AssetTags; [Space] [TabGroup("Base/H1/V3", "Tags")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@CancelAbilityTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [LabelText("CancelAbility With Tags ")] [Tooltip("Ability激活时,Ability持有者当前持有的所有Ability中,拥有【任意】这些标签的Ability会被取消。")] public GameplayTag[] CancelAbilityTags; [Space] [TabGroup("Base/H1/V3", "Tags")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@BlockAbilityTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [LabelText("BlockAbility With Tags ")] [Tooltip("Ability激活时,Ability持有者当前持有的所有Ability中,拥有【任意】这些标签的Ability会被阻塞激活。")] public GameplayTag[] BlockAbilityTags; [Space] [TabGroup("Base/H1/V3", "Tags")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@ActivationOwnedTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [Tooltip("Ability激活时,持有者会获得这些标签,Ability被失活时,这些标签也会被移除。")] [FormerlySerializedAs("ActivationOwnedTag")] public GameplayTag[] ActivationOwnedTags; [Space] [TabGroup("Base/H1/V3", "Tags")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@ActivationRequiredTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [Tooltip("Ability只有在其拥有者拥有【所有】这些标签时才可激活。")] public GameplayTag[] ActivationRequiredTags; [Space] [TabGroup("Base/H1/V3", "Tags")] [ListDrawerSettings(ShowFoldout = true, ShowItemCount = false, DraggableItems = false)] [DisableContextMenu(disableForMember: false, disableCollectionElements: true)] [CustomContextMenu("排序", "@ActivationBlockedTags = TagHelper.Sort($value)")] [ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", IsUniqueList = true, HideChildProperties = true)] [Tooltip("Ability在其拥有者拥有【任意】这些标签时不能被激活。")] public GameplayTag[] ActivationBlockedTags; // public GameplayTag[] SourceRequiredTags; // public GameplayTag[] SourceBlockedTags; // public GameplayTag[] TargetRequiredTags; // public GameplayTag[] TargetBlockedTags; } public abstract class AbilityAssetT : AbilityAsset where T : class { public sealed override Type AbilityType() { return typeof(T); } } }