- 기반 스킬 분류를 도입하고 젬별 장착 가능 스킬 타입 조건을 추가함 - 동일 젬 중복 장착, 카테고리 상호 배타, 특정 젬 상호 배타를 로드아웃 검증에 반영함 - 테스트용 젬/스킬 자산과 디버그 생성 메뉴를 새 제약 구조에 맞게 갱신함 - Unity 재컴파일과 콘솔 확인으로 신규 컴파일 에러가 없음을 검증함
102 lines
4.4 KiB
C#
102 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
|
|
namespace Colosseum.Skills
|
|
{
|
|
/// <summary>
|
|
/// 젬 장착 조건에서 사용하는 기반 스킬 분류입니다.
|
|
/// 하나의 스킬이 여러 분류를 동시에 가질 수 있습니다.
|
|
/// </summary>
|
|
[Flags]
|
|
public enum SkillBaseType
|
|
{
|
|
None = 0,
|
|
Attack = 1 << 0,
|
|
Defense = 1 << 1,
|
|
Support = 1 << 2,
|
|
Control = 1 << 3,
|
|
Mobility = 1 << 4,
|
|
Utility = 1 << 5,
|
|
All = Attack | Defense | Support | Control | Mobility | Utility,
|
|
}
|
|
|
|
/// <summary>
|
|
/// 스킬 데이터. 스킬의 기본 정보와 효과 목록을 관리합니다.
|
|
/// </summary>
|
|
[CreateAssetMenu(fileName = "NewSkill", menuName = "Colosseum/Skill")]
|
|
public class SkillData : ScriptableObject
|
|
{
|
|
[Header("기본 정보")]
|
|
[SerializeField] private string skillName;
|
|
[TextArea(2, 4)]
|
|
[SerializeField] private string description;
|
|
[SerializeField] private Sprite icon;
|
|
|
|
[Header("기반 스킬 분류")]
|
|
[Tooltip("젬 장착 가능 조건에 사용하는 기반 스킬 분류")]
|
|
[SerializeField] private SkillBaseType baseTypes = SkillBaseType.None;
|
|
|
|
[Header("애니메이션")]
|
|
[Tooltip("기본 Animator Controller의 'Skill' 상태에 덮어씌워질 클립")]
|
|
[SerializeField] private AnimationClip skillClip;
|
|
[Tooltip("종료 애니메이션 (선택)")]
|
|
[SerializeField] private AnimationClip endClip;
|
|
[Tooltip("애니메이션 재생 속도 (1 = 기본, 2 = 2배속)")]
|
|
[Min(0.1f)] [SerializeField] private float animationSpeed = 1f;
|
|
|
|
[Header("루트 모션")]
|
|
[Tooltip("애니메이션의 이동/회전 데이터를 캐릭터에 적용")]
|
|
[SerializeField] private bool useRootMotion = false;
|
|
[Tooltip("루트 모션 적용 시 Y축 이동 무시 (중력과 충돌)")]
|
|
[SerializeField] private bool ignoreRootMotionY = true;
|
|
[Tooltip("스킬 시전 시 대상 위치로 점프 이동 (UseRootMotion + IgnoreRootMotionY=false 필요)")]
|
|
[SerializeField] private bool jumpToTarget = false;
|
|
|
|
[Header("행동 제한")]
|
|
[Tooltip("시전 중 이동 입력 차단 여부")]
|
|
[SerializeField] private bool blockMovementWhileCasting = true;
|
|
[Tooltip("시전 중 점프 입력 차단 여부")]
|
|
[SerializeField] private bool blockJumpWhileCasting = true;
|
|
[Tooltip("시전 중 다른 스킬 입력 차단 여부")]
|
|
[SerializeField] private bool blockOtherSkillsWhileCasting = true;
|
|
|
|
[Header("쿨타임 & 비용")]
|
|
[Min(0f)] [SerializeField] private float cooldown = 1f;
|
|
[Min(0f)] [SerializeField] private float manaCost = 0f;
|
|
|
|
[Header("젬 슬롯")]
|
|
[Tooltip("이 스킬에 장착 가능한 젬 슬롯 수")]
|
|
[Min(0)] [SerializeField] private int maxGemSlotCount = 2;
|
|
|
|
[Header("효과 목록")]
|
|
[Tooltip("시전 시작 즉시 발동하는 효과 목록. 시전 보호 버프 등에 사용됩니다.")]
|
|
[SerializeField] private List<SkillEffect> castStartEffects = new List<SkillEffect>();
|
|
|
|
[Header("효과 목록")]
|
|
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 리스트 순서 = 이벤트 인덱스")]
|
|
[SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
|
|
|
|
// Properties
|
|
public string SkillName => skillName;
|
|
public string Description => description;
|
|
public Sprite Icon => icon;
|
|
public SkillBaseType BaseTypes => baseTypes;
|
|
public AnimationClip SkillClip => skillClip;
|
|
public AnimationClip EndClip => endClip;
|
|
public float AnimationSpeed => animationSpeed;
|
|
public float Cooldown => cooldown;
|
|
public float ManaCost => manaCost;
|
|
public int MaxGemSlotCount => maxGemSlotCount;
|
|
public bool UseRootMotion => useRootMotion;
|
|
public bool IgnoreRootMotionY => ignoreRootMotionY;
|
|
public bool JumpToTarget => jumpToTarget;
|
|
public bool BlockMovementWhileCasting => blockMovementWhileCasting;
|
|
public bool BlockJumpWhileCasting => blockJumpWhileCasting;
|
|
public bool BlockOtherSkillsWhileCasting => blockOtherSkillsWhileCasting;
|
|
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
|
|
public IReadOnlyList<SkillEffect> Effects => effects;
|
|
}
|
|
}
|