feat: 젬 분류 사양과 장착 UI 반영
- 옵시디언 기준의 역할/발동 타입 분류를 스킬·젬 데이터와 장착 검증 로직에 반영 - 젬 보관 UI와 퀵슬롯 표시를 새 분류 및 실제 마나/쿨타임 계산 기준으로 갱신 - 테스트 스킬/젬 자산을 에디터 메뉴로 동기화하고 Unity 컴파일 및 플레이 검증 완료
This commit is contained in:
@@ -22,6 +22,32 @@ namespace Colosseum.Skills
|
||||
All = Attack | Defense | Support | Control | Mobility | Utility,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 스킬의 역할 분류입니다.
|
||||
/// 젬 장착 조건에는 비트 마스크 형태로도 사용합니다.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum SkillRoleType
|
||||
{
|
||||
None = 0,
|
||||
Attack = 1 << 0,
|
||||
Defense = 1 << 1,
|
||||
Support = 1 << 2,
|
||||
All = Attack | Defense | Support,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 스킬의 발동 타입 분류입니다.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum SkillActivationType
|
||||
{
|
||||
None = 0,
|
||||
Instant = 1 << 0,
|
||||
Buff = 1 << 1,
|
||||
All = Instant | Buff,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 스킬 데이터. 스킬의 기본 정보와 효과 목록을 관리합니다.
|
||||
/// </summary>
|
||||
@@ -34,8 +60,14 @@ namespace Colosseum.Skills
|
||||
[SerializeField] private string description;
|
||||
[SerializeField] private Sprite icon;
|
||||
|
||||
[Header("기반 스킬 분류")]
|
||||
[Tooltip("젬 장착 가능 조건에 사용하는 기반 스킬 분류")]
|
||||
[Header("스킬 분류")]
|
||||
[Tooltip("이 스킬의 주 역할입니다.")]
|
||||
[SerializeField] private SkillRoleType skillRole = SkillRoleType.Attack;
|
||||
[Tooltip("이 스킬의 발동 타입입니다.")]
|
||||
[SerializeField] private SkillActivationType activationType = SkillActivationType.Instant;
|
||||
|
||||
[Header("레거시 기반 스킬 분류")]
|
||||
[Tooltip("기존 테스트 데이터와의 호환을 위한 기반 분류입니다.")]
|
||||
[SerializeField] private SkillBaseType baseTypes = SkillBaseType.None;
|
||||
|
||||
[Header("애니메이션")]
|
||||
@@ -82,6 +114,8 @@ namespace Colosseum.Skills
|
||||
public string SkillName => skillName;
|
||||
public string Description => description;
|
||||
public Sprite Icon => icon;
|
||||
public SkillRoleType SkillRole => skillRole;
|
||||
public SkillActivationType ActivationType => activationType;
|
||||
public SkillBaseType BaseTypes => baseTypes;
|
||||
public AnimationClip SkillClip => skillClip;
|
||||
public AnimationClip EndClip => endClip;
|
||||
@@ -97,5 +131,104 @@ namespace Colosseum.Skills
|
||||
public bool BlockOtherSkillsWhileCasting => blockOtherSkillsWhileCasting;
|
||||
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
|
||||
public IReadOnlyList<SkillEffect> Effects => effects;
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 장착 조건과 현재 스킬 분류가 맞는지 확인합니다.
|
||||
/// </summary>
|
||||
public bool MatchesClassification(SkillRoleType allowedRoles, SkillActivationType allowedActivationTypes)
|
||||
{
|
||||
bool matchesRole = allowedRoles == SkillRoleType.None ||
|
||||
allowedRoles == SkillRoleType.All ||
|
||||
(allowedRoles & skillRole) != 0;
|
||||
|
||||
bool matchesActivationType = allowedActivationTypes == SkillActivationType.None ||
|
||||
allowedActivationTypes == SkillActivationType.All ||
|
||||
(allowedActivationTypes & activationType) != 0;
|
||||
|
||||
return matchesRole && matchesActivationType;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 스킬/젬 분류를 UI 친화적인 문자열로 변환하는 유틸리티입니다.
|
||||
/// </summary>
|
||||
public static class SkillClassificationUtility
|
||||
{
|
||||
public static string GetRoleLabel(SkillRoleType role)
|
||||
{
|
||||
return role switch
|
||||
{
|
||||
SkillRoleType.Attack => "공격",
|
||||
SkillRoleType.Defense => "방어",
|
||||
SkillRoleType.Support => "지원",
|
||||
SkillRoleType.All => "전체",
|
||||
_ => "미분류",
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetActivationTypeLabel(SkillActivationType activationType)
|
||||
{
|
||||
return activationType switch
|
||||
{
|
||||
SkillActivationType.Instant => "즉발",
|
||||
SkillActivationType.Buff => "버프",
|
||||
SkillActivationType.All => "전체",
|
||||
_ => "미분류",
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetSkillClassificationLabel(SkillData skill)
|
||||
{
|
||||
if (skill == null)
|
||||
return "미분류";
|
||||
|
||||
return $"{GetRoleLabel(skill.SkillRole)}/{GetActivationTypeLabel(skill.ActivationType)}";
|
||||
}
|
||||
|
||||
public static string GetGemCategoryLabel(SkillGemCategory category)
|
||||
{
|
||||
return category switch
|
||||
{
|
||||
SkillGemCategory.Damage => "데미지",
|
||||
SkillGemCategory.Survival => "생존",
|
||||
SkillGemCategory.Mana => "마나",
|
||||
SkillGemCategory.Special => "특수",
|
||||
SkillGemCategory.BuffPower => "효과 강화",
|
||||
SkillGemCategory.Duration => "지속시간",
|
||||
SkillGemCategory.Area => "범위",
|
||||
SkillGemCategory.Cost => "비용",
|
||||
_ => "공용",
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetAllowedRoleSummary(SkillRoleType roles)
|
||||
{
|
||||
if (roles == SkillRoleType.None || roles == SkillRoleType.All)
|
||||
return "전체";
|
||||
|
||||
List<string> labels = new List<string>();
|
||||
if ((roles & SkillRoleType.Attack) != 0)
|
||||
labels.Add("공격");
|
||||
if ((roles & SkillRoleType.Defense) != 0)
|
||||
labels.Add("방어");
|
||||
if ((roles & SkillRoleType.Support) != 0)
|
||||
labels.Add("지원");
|
||||
|
||||
return labels.Count > 0 ? string.Join(" + ", labels) : "미분류";
|
||||
}
|
||||
|
||||
public static string GetAllowedActivationSummary(SkillActivationType activationTypes)
|
||||
{
|
||||
if (activationTypes == SkillActivationType.None || activationTypes == SkillActivationType.All)
|
||||
return "전체";
|
||||
|
||||
List<string> labels = new List<string>();
|
||||
if ((activationTypes & SkillActivationType.Instant) != 0)
|
||||
labels.Add("즉발");
|
||||
if ((activationTypes & SkillActivationType.Buff) != 0)
|
||||
labels.Add("버프");
|
||||
|
||||
return labels.Count > 0 ? string.Join(" + ", labels) : "미분류";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user