feat: 젬 분류 사양과 장착 UI 반영

- 옵시디언 기준의 역할/발동 타입 분류를 스킬·젬 데이터와 장착 검증 로직에 반영
- 젬 보관 UI와 퀵슬롯 표시를 새 분류 및 실제 마나/쿨타임 계산 기준으로 갱신
- 테스트 스킬/젬 자산을 에디터 메뉴로 동기화하고 Unity 컴파일 및 플레이 검증 완료
This commit is contained in:
2026-03-26 16:18:45 +09:00
parent 1261d4dc3c
commit a94daf7968
27 changed files with 1738 additions and 59 deletions

View File

@@ -615,7 +615,7 @@ namespace Colosseum.Editor
CrushGemPath,
"파쇄",
"고위력 기술의 단일 피해를 강화하는 테스트용 젬",
SkillGemCategory.Attack,
SkillGemCategory.Damage,
1.15f,
1.1f,
1f,
@@ -625,13 +625,15 @@ namespace Colosseum.Editor
1f,
0,
damageEffect,
allowedSkillRoles: SkillRoleType.Attack,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
ChallengerGemPath,
"도전자",
"고위력 기술에 위협 선점 기능을 얹는 테스트용 젬",
SkillGemCategory.Threat,
SkillGemCategory.Special,
1f,
1f,
1f,
@@ -641,13 +643,15 @@ namespace Colosseum.Editor
1.5f,
0,
tauntEffect,
allowedSkillRoles: SkillRoleType.Attack | SkillRoleType.Defense,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
GuardianGemPath,
"수호",
"고위력 기술에 보호막 보조를 얹는 테스트용 젬",
SkillGemCategory.Support,
SkillGemCategory.Survival,
1.05f,
1.1f,
1f,
@@ -657,13 +661,15 @@ namespace Colosseum.Editor
1f,
0,
shieldEffect,
allowedSkillRoles: SkillRoleType.All,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
RepeatGemPath,
"연속",
"붙은 스킬을 한 번 더 반복 시전하는 테스트용 젬",
SkillGemCategory.Efficiency,
SkillGemCategory.Special,
1.2f,
1.15f,
1.1f,
@@ -673,13 +679,15 @@ namespace Colosseum.Editor
1f,
1,
null,
allowedSkillRoles: SkillRoleType.Attack,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
FortitudeGemPath,
"강인함",
"스킬 사용 시 자신에게 경직 면역을 부여하는 테스트용 방어 젬",
SkillGemCategory.Defense,
SkillGemCategory.Survival,
1.05f,
1.05f,
1f,
@@ -689,13 +697,15 @@ namespace Colosseum.Editor
1f,
0,
null,
new[] { hitReactionImmuneAbnormality });
new[] { hitReactionImmuneAbnormality },
allowedSkillRoles: SkillRoleType.All,
allowedSkillActivationTypes: SkillActivationType.All);
CreateOrUpdateGemAsset(
WitherGemPath,
"약화",
"스킬 적중 대상에게 테스트 디버프를 부여하는 제어 젬",
SkillGemCategory.Control,
SkillGemCategory.Special,
1.05f,
1.05f,
1f,
@@ -707,13 +717,15 @@ namespace Colosseum.Editor
null,
null,
0,
new[] { testDebuffAbnormality });
new[] { testDebuffAbnormality },
allowedSkillRoles: SkillRoleType.All,
allowedSkillActivationTypes: SkillActivationType.Instant);
CreateOrUpdateGemAsset(
EdgeGemPath,
"예리함",
"고정 추가 피해를 부여하는 테스트용 공격 젬",
SkillGemCategory.Attack,
SkillGemCategory.Damage,
1f,
1f,
1f,
@@ -723,13 +735,15 @@ namespace Colosseum.Editor
1f,
0,
edgeDamageEffect,
allowedSkillRoles: SkillRoleType.Attack,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
ImpactGemPath,
"충격",
"중간 고정 추가 피해를 부여하는 테스트용 공격 젬",
SkillGemCategory.Attack,
SkillGemCategory.Damage,
1f,
1f,
1f,
@@ -739,13 +753,15 @@ namespace Colosseum.Editor
1f,
0,
impactDamageEffect,
allowedSkillRoles: SkillRoleType.Attack,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
CreateOrUpdateGemAsset(
BreachGemPath,
"관통",
"높은 고정 추가 피해를 부여하는 테스트용 공격 젬",
SkillGemCategory.Attack,
SkillGemCategory.Damage,
1f,
1f,
1f,
@@ -755,6 +771,8 @@ namespace Colosseum.Editor
1f,
0,
breachDamageEffect,
allowedSkillRoles: SkillRoleType.Attack,
allowedSkillActivationTypes: SkillActivationType.Instant,
allowedSkillTypes: SkillBaseType.Attack);
AssetDatabase.SaveAssets();
@@ -793,19 +811,19 @@ namespace Colosseum.Editor
SkillGemData impactGem = AssetDatabase.LoadAssetAtPath<SkillGemData>(ImpactGemPath);
SkillGemData breachGem = AssetDatabase.LoadAssetAtPath<SkillGemData>(BreachGemPath);
SetSkillBaseTypes(slashSkill, SkillBaseType.Attack);
SetSkillBaseTypes(tauntSkill, SkillBaseType.Control | SkillBaseType.Utility);
SetSkillBaseTypes(guardSkill, SkillBaseType.Defense);
SetSkillBaseTypes(dashSkill, SkillBaseType.Mobility);
SetSkillBaseTypes(ironWallSkill, SkillBaseType.Defense | SkillBaseType.Support);
SetSkillBaseTypes(pierceSkill, SkillBaseType.Attack);
SetSkillBaseTypes(gemTestSkill, SkillBaseType.Attack);
SetSkillBaseTypes(healSkill, SkillBaseType.Support);
SetSkillBaseTypes(areaHealSkill, SkillBaseType.Support);
SetSkillBaseTypes(shieldSkill, SkillBaseType.Defense | SkillBaseType.Support);
SetSkillBaseTypes(projectileSkill, SkillBaseType.Attack);
SetSkillBaseTypes(spinSkill, SkillBaseType.Attack);
SetSkillBaseTypes(evadeSkill, SkillBaseType.Mobility);
SetSkillClassification(slashSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(tauntSkill, SkillRoleType.Defense, SkillActivationType.Instant, SkillBaseType.Defense);
SetSkillClassification(guardSkill, SkillRoleType.Defense, SkillActivationType.Buff, SkillBaseType.Defense);
SetSkillClassification(dashSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(ironWallSkill, SkillRoleType.Defense, SkillActivationType.Buff, SkillBaseType.Defense);
SetSkillClassification(pierceSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(gemTestSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(healSkill, SkillRoleType.Support, SkillActivationType.Instant, SkillBaseType.Support);
SetSkillClassification(areaHealSkill, SkillRoleType.Support, SkillActivationType.Instant, SkillBaseType.Support);
SetSkillClassification(shieldSkill, SkillRoleType.Support, SkillActivationType.Instant, SkillBaseType.Support);
SetSkillClassification(projectileSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(spinSkill, SkillRoleType.Attack, SkillActivationType.Instant, SkillBaseType.Attack);
SetSkillClassification(evadeSkill, SkillRoleType.Defense, SkillActivationType.Instant, SkillBaseType.Defense);
EnsureGemTestSkillSlotCount(gemTestSkill, 3);
@@ -1336,6 +1354,8 @@ namespace Colosseum.Editor
AbnormalityData[] selfAbnormalities = null,
int triggeredAbnormalityIndex = -1,
AbnormalityData[] onHitAbnormalities = null,
SkillRoleType allowedSkillRoles = SkillRoleType.All,
SkillActivationType allowedSkillActivationTypes = SkillActivationType.All,
SkillBaseType allowedSkillTypes = SkillBaseType.All,
SkillGemCategory[] incompatibleCategories = null,
SkillGemData[] incompatibleGems = null)
@@ -1356,6 +1376,8 @@ namespace Colosseum.Editor
serializedGem.FindProperty("gemName").stringValue = gemName;
serializedGem.FindProperty("description").stringValue = description;
serializedGem.FindProperty("category").enumValueIndex = (int)category;
serializedGem.FindProperty("allowedSkillRoles").intValue = (int)allowedSkillRoles;
serializedGem.FindProperty("allowedSkillActivationTypes").intValue = (int)allowedSkillActivationTypes;
serializedGem.FindProperty("manaCostMultiplier").floatValue = manaCostMultiplier;
serializedGem.FindProperty("cooldownMultiplier").floatValue = cooldownMultiplier;
serializedGem.FindProperty("castSpeedMultiplier").floatValue = castSpeedMultiplier;
@@ -1424,17 +1446,42 @@ namespace Colosseum.Editor
EditorUtility.SetDirty(gem);
}
private static void SetSkillBaseTypes(SkillData skill, SkillBaseType baseTypes)
private static void SetSkillClassification(
SkillData skill,
SkillRoleType skillRole,
SkillActivationType activationType,
SkillBaseType baseTypes)
{
if (skill == null)
return;
SerializedObject serializedSkill = new SerializedObject(skill);
bool hasChanges = false;
SerializedProperty skillRoleProperty = serializedSkill.FindProperty("skillRole");
if (skillRoleProperty != null && skillRoleProperty.intValue != (int)skillRole)
{
skillRoleProperty.intValue = (int)skillRole;
hasChanges = true;
}
SerializedProperty activationTypeProperty = serializedSkill.FindProperty("activationType");
if (activationTypeProperty != null && activationTypeProperty.intValue != (int)activationType)
{
activationTypeProperty.intValue = (int)activationType;
hasChanges = true;
}
SerializedProperty baseTypesProperty = serializedSkill.FindProperty("baseTypes");
if (baseTypesProperty == null || baseTypesProperty.intValue == (int)baseTypes)
if (baseTypesProperty != null && baseTypesProperty.intValue != (int)baseTypes)
{
baseTypesProperty.intValue = (int)baseTypes;
hasChanges = true;
}
if (!hasChanges)
return;
baseTypesProperty.intValue = (int)baseTypes;
serializedSkill.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(skill);
}
@@ -1571,7 +1618,7 @@ namespace Colosseum.Editor
if (hasGem)
categoryBuilder.Append(", ");
categoryBuilder.Append(gem.Category);
categoryBuilder.Append(SkillClassificationUtility.GetGemCategoryLabel(gem.Category));
hasGem = true;
}