feat: 채널링 빔 스킬 시스템 구현 및 PolygonParticleFX VFX 에셋 추가
- SkillData: 채널링 필드 추가 (지속시간, 틱 간격, 틱/종료 효과, VFX 프리팹, 마운트 경로, 크기 배율) - SkillController: 채널링 상태 관리 (Start/Update/End), VFX 생성/파괴, 틱 효과 주기 발동, 버튼 해제로 중단 - SkillEffect: Beam(원통) 범위 판정 추가 (OverlapCapsule), 디버그 시각화 - PlayerSkillInput: 스킬 취소(canceled) 이벤트 구독 → 채널링 중단 통지 - SkillLoadoutEntry: 채널링 틱/종료 효과 수집 메서드 추가 - 스킬 데이터/이펙트/애니메이션/VFX 에셋 추가 (채널링 스킬용) - PolygonParticleFX VFX 에셋 패키지 추가 (Materials, Models, Prefabs, Textures, Scenes)
This commit is contained in:
@@ -67,35 +67,9 @@ namespace Colosseum.Skills
|
||||
/// </summary>
|
||||
private void OnValidate()
|
||||
{
|
||||
MigrateLegacyEffects();
|
||||
RefreshAnimationClips();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 레거시 flat effects 리스트를 grouped triggeredEffects 구조로 마이그레이션합니다.
|
||||
/// </summary>
|
||||
private void MigrateLegacyEffects()
|
||||
{
|
||||
if (effects == null || effects.Count == 0)
|
||||
return;
|
||||
if (triggeredEffects != null && triggeredEffects.Count > 0)
|
||||
return;
|
||||
|
||||
triggeredEffects = new List<SkillTriggeredEffectEntry>();
|
||||
for (int i = 0; i < effects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = effects[i];
|
||||
if (effect == null)
|
||||
continue;
|
||||
|
||||
triggeredEffects.Add(new SkillTriggeredEffectEntry(i, new List<SkillEffect> { effect }));
|
||||
}
|
||||
|
||||
effects.Clear();
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
Debug.Log($"[SkillData] '{name}' effects 마이그레이션 완료: {triggeredEffects.Count}개 엔트리", this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 애셋 이름 기반으로 매칭되는 애니메이션 클립을 자동 수집합니다.
|
||||
/// SkillData 이름이 'Data_Skill_'으로 시작하면 'Anim_{key}_{순서}' 클립을 찾아 animationClips에 채웁니다.
|
||||
@@ -226,10 +200,25 @@ namespace Colosseum.Skills
|
||||
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 각 엔트리의 Trigger Index가 이벤트 인덱스와 매칭됩니다.")]
|
||||
[SerializeField] private List<SkillTriggeredEffectEntry> triggeredEffects = new();
|
||||
|
||||
/// <summary>
|
||||
/// 레거시 flat effects 리스트. OnValidate에서 triggeredEffects로 자동 마이그레이션됩니다.
|
||||
/// </summary>
|
||||
[HideInInspector] [SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
|
||||
[Header("채널링")]
|
||||
[Tooltip("이 스킬이 채널링 스킬인지 여부. 캐스트 애니메이션 종료 후 채널링이 시작됩니다.")]
|
||||
[SerializeField] private bool isChanneling = false;
|
||||
[Tooltip("채널링 최대 지속 시간 (초)")]
|
||||
[Min(0.1f)] [SerializeField] private float channelDuration = 3f;
|
||||
[Tooltip("채널링 틱 간격 (초). 이 간격마다 channelTickEffects가 발동합니다.")]
|
||||
[Min(0.05f)] [SerializeField] private float channelTickInterval = 0.5f;
|
||||
[Tooltip("채널링 중 주기적으로 발동하는 효과 목록")]
|
||||
[SerializeField] private List<SkillEffect> channelTickEffects = new();
|
||||
[Tooltip("채널링 종료 시 발동하는 효과 목록 (지속 시간 만료 시)")]
|
||||
[SerializeField] private List<SkillEffect> channelEndEffects = new();
|
||||
[Tooltip("채널링 중 지속되는 VFX 프리팹. 채널링 시작에 시전자 위치에 생성되고 종료에 파괴됩니다.")]
|
||||
[SerializeField] private GameObject channelVfxPrefab;
|
||||
[Tooltip("VFX 생성 기준 위치의 Transform 경로. Animator 본 이름 (예: RightHand, Head) 또는 자식 GameObject 경로. 비어있으면 루트 위치.")]
|
||||
[SerializeField] private string channelVfxMountPath;
|
||||
[Tooltip("채널링 VFX 길이 배율. 빔의 진행 방향 (z축) 크기를 조절합니다.")]
|
||||
[Min(0.01f)] [SerializeField] private float channelVfxLengthScale = 1f;
|
||||
[Tooltip("채널링 VFX 폭 배율. 빔의 너비 (x/y축) 크기를 조절합니다.")]
|
||||
[Min(0.01f)] [SerializeField] private float channelVfxWidthScale = 1f;
|
||||
|
||||
// Properties
|
||||
public string SkillName => skillName;
|
||||
@@ -260,6 +249,15 @@ namespace Colosseum.Skills
|
||||
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
|
||||
public IReadOnlyList<SkillTriggeredEffectEntry> TriggeredEffects => triggeredEffects;
|
||||
public WeaponTrait AllowedWeaponTraits => allowedWeaponTraits;
|
||||
public bool IsChanneling => isChanneling;
|
||||
public float ChannelDuration => channelDuration;
|
||||
public float ChannelTickInterval => channelTickInterval;
|
||||
public IReadOnlyList<SkillEffect> ChannelTickEffects => channelTickEffects;
|
||||
public IReadOnlyList<SkillEffect> ChannelEndEffects => channelEndEffects;
|
||||
public GameObject ChannelVfxPrefab => channelVfxPrefab;
|
||||
public string ChannelVfxMountPath => channelVfxMountPath;
|
||||
public float ChannelVfxLengthScale => channelVfxLengthScale;
|
||||
public float ChannelVfxWidthScale => channelVfxWidthScale;
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 장착 조건과 현재 스킬 분류가 맞는지 확인합니다.
|
||||
|
||||
Reference in New Issue
Block a user