feat: 경직 면역 기반 시전 보호 및 지원 스킬 안정성 보강
- 경직 면역 이상상태와 시전 시작 효과를 추가해 철벽, 방어 태세, 치유, 광역 치유, 보호막에 데이터 기반 시전 보호를 연결 - AbnormalityManager와 HitReactionController가 경직 면역 상태를 존중하도록 보강해 일반 피격 반응으로 인한 즉시 취소를 줄임 - SkillData에 castStartEffects를 추가하고 SkillController가 시전 시작 효과를 실행하도록 확장 - 드로그전 재검증에서 철벽, 치유, 광역 치유가 실제 전투 중 취소 없이 완료되는 것을 확인하고 보호막의 후속 피격 체감을 추가 점검 대상으로 정리 - HUD/문서 반영 과정에서 필요한 TMP_MaruBuri, TMP_SuseongBatang 아틀라스 갱신을 함께 포함
This commit is contained in:
@@ -0,0 +1,27 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: b08cc671f858a3b409170a5356e960a0, type: 3}
|
||||||
|
m_Name: Data_Abnormality_Player_경직면역
|
||||||
|
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
|
||||||
|
abnormalityName: 경직 면역
|
||||||
|
icon: {fileID: 0}
|
||||||
|
duration: 0.6
|
||||||
|
level: 1
|
||||||
|
isDebuff: 0
|
||||||
|
showInUI: 0
|
||||||
|
ignoreHitReaction: 1
|
||||||
|
statModifiers: []
|
||||||
|
periodicInterval: 0
|
||||||
|
periodicValue: 0
|
||||||
|
controlType: 0
|
||||||
|
slowMultiplier: 0.5
|
||||||
|
incomingDamageMultiplier: 1
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f4f55b61c9d04fd2b83b9c80e81fa0a2
|
||||||
@@ -26,5 +26,7 @@ MonoBehaviour:
|
|||||||
blockOtherSkillsWhileCasting: 1
|
blockOtherSkillsWhileCasting: 1
|
||||||
cooldown: 16
|
cooldown: 16
|
||||||
manaCost: 30
|
manaCost: 30
|
||||||
|
castStartEffects:
|
||||||
|
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
|
||||||
effects:
|
effects:
|
||||||
- {fileID: 11400000, guid: d33ec3ec97ad8084e81bb5a60f1e0eca, type: 2}
|
- {fileID: 11400000, guid: d33ec3ec97ad8084e81bb5a60f1e0eca, type: 2}
|
||||||
|
|||||||
@@ -26,5 +26,7 @@ MonoBehaviour:
|
|||||||
blockOtherSkillsWhileCasting: 1
|
blockOtherSkillsWhileCasting: 1
|
||||||
cooldown: 10
|
cooldown: 10
|
||||||
manaCost: 12
|
manaCost: 12
|
||||||
|
castStartEffects:
|
||||||
|
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
|
||||||
effects:
|
effects:
|
||||||
- {fileID: 11400000, guid: a7024f38a9ce6c94ba466164604bde3b, type: 2}
|
- {fileID: 11400000, guid: a7024f38a9ce6c94ba466164604bde3b, type: 2}
|
||||||
|
|||||||
@@ -26,5 +26,7 @@ MonoBehaviour:
|
|||||||
blockOtherSkillsWhileCasting: 1
|
blockOtherSkillsWhileCasting: 1
|
||||||
cooldown: 18
|
cooldown: 18
|
||||||
manaCost: 24
|
manaCost: 24
|
||||||
|
castStartEffects:
|
||||||
|
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
|
||||||
effects:
|
effects:
|
||||||
- {fileID: 11400000, guid: 65ed1eabc2fb73d43b86230317222608, type: 2}
|
- {fileID: 11400000, guid: 65ed1eabc2fb73d43b86230317222608, type: 2}
|
||||||
|
|||||||
@@ -26,5 +26,7 @@ MonoBehaviour:
|
|||||||
blockOtherSkillsWhileCasting: 1
|
blockOtherSkillsWhileCasting: 1
|
||||||
cooldown: 18
|
cooldown: 18
|
||||||
manaCost: 20
|
manaCost: 20
|
||||||
|
castStartEffects:
|
||||||
|
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
|
||||||
effects:
|
effects:
|
||||||
- {fileID: 11400000, guid: bc418a5bb985ee34395994d50918086b, type: 2}
|
- {fileID: 11400000, guid: bc418a5bb985ee34395994d50918086b, type: 2}
|
||||||
|
|||||||
@@ -26,5 +26,7 @@ MonoBehaviour:
|
|||||||
blockOtherSkillsWhileCasting: 1
|
blockOtherSkillsWhileCasting: 1
|
||||||
cooldown: 8
|
cooldown: 8
|
||||||
manaCost: 18
|
manaCost: 18
|
||||||
|
castStartEffects:
|
||||||
|
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
|
||||||
effects:
|
effects:
|
||||||
- {fileID: 11400000, guid: fa5f619fe89f93f4293a0d5edcfe9592, type: 2}
|
- {fileID: 11400000, guid: fa5f619fe89f93f4293a0d5edcfe9592, type: 2}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 639a0e2e83c292b4aaf5bc4b1532f099, type: 3}
|
||||||
|
m_Name: Data_SkillEffect_Player_시전시경직면역_0_강화
|
||||||
|
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.CombatBuffEffect
|
||||||
|
targetType: 0
|
||||||
|
targetTeam: 0
|
||||||
|
areaCenter: 0
|
||||||
|
areaShape: 0
|
||||||
|
targetLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
areaRadius: 3
|
||||||
|
fanOriginDistance: 1
|
||||||
|
fanRadius: 3
|
||||||
|
fanHalfAngle: 45
|
||||||
|
abnormalityData: {fileID: 11400000, guid: f4f55b61c9d04fd2b83b9c80e81fa0a2, type: 2}
|
||||||
|
threatMultiplier: 1
|
||||||
|
threatMultiplierDuration: 0
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e7d0d605c1c2449ebc41f1a713670d6b
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -68,6 +68,9 @@ namespace Colosseum.Abnormalities
|
|||||||
[Tooltip("플레이어 HUD의 이상상태 UI에 표시할지 여부")]
|
[Tooltip("플레이어 HUD의 이상상태 UI에 표시할지 여부")]
|
||||||
public bool showInUI = true;
|
public bool showInUI = true;
|
||||||
|
|
||||||
|
[Tooltip("활성 중에는 일반 피격 반응(경직, 넉백, 다운)을 무시할지 여부")]
|
||||||
|
public bool ignoreHitReaction = false;
|
||||||
|
|
||||||
[Header("스탯 수정자")]
|
[Header("스탯 수정자")]
|
||||||
[Tooltip("스탯에 적용할 수정자 목록")]
|
[Tooltip("스탯에 적용할 수정자 목록")]
|
||||||
public List<AbnormalityStatModifier> statModifiers = new List<AbnormalityStatModifier>();
|
public List<AbnormalityStatModifier> statModifiers = new List<AbnormalityStatModifier>();
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace Colosseum.Abnormalities
|
|||||||
private int stunCount;
|
private int stunCount;
|
||||||
private int silenceCount;
|
private int silenceCount;
|
||||||
private int invincibleCount;
|
private int invincibleCount;
|
||||||
|
private int hitReactionImmuneCount;
|
||||||
private float slowMultiplier = 1f;
|
private float slowMultiplier = 1f;
|
||||||
private float incomingDamageMultiplier = 1f;
|
private float incomingDamageMultiplier = 1f;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ namespace Colosseum.Abnormalities
|
|||||||
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
|
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
|
||||||
private NetworkVariable<int> syncedSilenceCount = new NetworkVariable<int>(0);
|
private NetworkVariable<int> syncedSilenceCount = new NetworkVariable<int>(0);
|
||||||
private NetworkVariable<int> syncedInvincibleCount = new NetworkVariable<int>(0);
|
private NetworkVariable<int> syncedInvincibleCount = new NetworkVariable<int>(0);
|
||||||
|
private NetworkVariable<int> syncedHitReactionImmuneCount = new NetworkVariable<int>(0);
|
||||||
private NetworkVariable<float> syncedSlowMultiplier = new NetworkVariable<float>(1f);
|
private NetworkVariable<float> syncedSlowMultiplier = new NetworkVariable<float>(1f);
|
||||||
|
|
||||||
// 네트워크 동기화용 데이터
|
// 네트워크 동기화용 데이터
|
||||||
@@ -58,6 +60,11 @@ namespace Colosseum.Abnormalities
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsInvincible => GetCurrentInvincibleCount() > 0;
|
public bool IsInvincible => GetCurrentInvincibleCount() > 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 일반 피격 반응 무시 상태 여부
|
||||||
|
/// </summary>
|
||||||
|
public bool IsHitReactionImmune => GetCurrentHitReactionImmuneCount() > 0;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 이동 속도 배율 (1.0 = 기본, 0.5 = 50% 감소)
|
/// 이동 속도 배율 (1.0 = 기본, 0.5 = 50% 감소)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -131,6 +138,7 @@ namespace Colosseum.Abnormalities
|
|||||||
syncedStunCount.OnValueChanged += HandleSyncedStunChanged;
|
syncedStunCount.OnValueChanged += HandleSyncedStunChanged;
|
||||||
syncedSilenceCount.OnValueChanged += HandleSyncedSilenceChanged;
|
syncedSilenceCount.OnValueChanged += HandleSyncedSilenceChanged;
|
||||||
syncedInvincibleCount.OnValueChanged += HandleSyncedInvincibleChanged;
|
syncedInvincibleCount.OnValueChanged += HandleSyncedInvincibleChanged;
|
||||||
|
syncedHitReactionImmuneCount.OnValueChanged += HandleSyncedHitReactionImmuneChanged;
|
||||||
syncedSlowMultiplier.OnValueChanged += HandleSyncedSlowChanged;
|
syncedSlowMultiplier.OnValueChanged += HandleSyncedSlowChanged;
|
||||||
|
|
||||||
if (networkController != null)
|
if (networkController != null)
|
||||||
@@ -150,6 +158,7 @@ namespace Colosseum.Abnormalities
|
|||||||
syncedStunCount.OnValueChanged -= HandleSyncedStunChanged;
|
syncedStunCount.OnValueChanged -= HandleSyncedStunChanged;
|
||||||
syncedSilenceCount.OnValueChanged -= HandleSyncedSilenceChanged;
|
syncedSilenceCount.OnValueChanged -= HandleSyncedSilenceChanged;
|
||||||
syncedInvincibleCount.OnValueChanged -= HandleSyncedInvincibleChanged;
|
syncedInvincibleCount.OnValueChanged -= HandleSyncedInvincibleChanged;
|
||||||
|
syncedHitReactionImmuneCount.OnValueChanged -= HandleSyncedHitReactionImmuneChanged;
|
||||||
syncedSlowMultiplier.OnValueChanged -= HandleSyncedSlowChanged;
|
syncedSlowMultiplier.OnValueChanged -= HandleSyncedSlowChanged;
|
||||||
|
|
||||||
if (networkController != null)
|
if (networkController != null)
|
||||||
@@ -431,6 +440,11 @@ namespace Colosseum.Abnormalities
|
|||||||
{
|
{
|
||||||
bool enteredStun = false;
|
bool enteredStun = false;
|
||||||
|
|
||||||
|
if (data.ignoreHitReaction)
|
||||||
|
{
|
||||||
|
hitReactionImmuneCount++;
|
||||||
|
}
|
||||||
|
|
||||||
switch (data.controlType)
|
switch (data.controlType)
|
||||||
{
|
{
|
||||||
case ControlType.Stun:
|
case ControlType.Stun:
|
||||||
@@ -461,6 +475,11 @@ namespace Colosseum.Abnormalities
|
|||||||
|
|
||||||
private void RemoveControlEffect(AbnormalityData data)
|
private void RemoveControlEffect(AbnormalityData data)
|
||||||
{
|
{
|
||||||
|
if (data.ignoreHitReaction)
|
||||||
|
{
|
||||||
|
hitReactionImmuneCount = Mathf.Max(0, hitReactionImmuneCount - 1);
|
||||||
|
}
|
||||||
|
|
||||||
switch (data.controlType)
|
switch (data.controlType)
|
||||||
{
|
{
|
||||||
case ControlType.Stun:
|
case ControlType.Stun:
|
||||||
@@ -516,6 +535,8 @@ namespace Colosseum.Abnormalities
|
|||||||
|
|
||||||
private int GetCurrentInvincibleCount() => IsServer ? invincibleCount : syncedInvincibleCount.Value;
|
private int GetCurrentInvincibleCount() => IsServer ? invincibleCount : syncedInvincibleCount.Value;
|
||||||
|
|
||||||
|
private int GetCurrentHitReactionImmuneCount() => IsServer ? hitReactionImmuneCount : syncedHitReactionImmuneCount.Value;
|
||||||
|
|
||||||
private float GetCurrentSlowMultiplier() => IsServer ? slowMultiplier : syncedSlowMultiplier.Value;
|
private float GetCurrentSlowMultiplier() => IsServer ? slowMultiplier : syncedSlowMultiplier.Value;
|
||||||
|
|
||||||
private void SyncControlEffects()
|
private void SyncControlEffects()
|
||||||
@@ -526,6 +547,7 @@ namespace Colosseum.Abnormalities
|
|||||||
syncedStunCount.Value = stunCount;
|
syncedStunCount.Value = stunCount;
|
||||||
syncedSilenceCount.Value = silenceCount;
|
syncedSilenceCount.Value = silenceCount;
|
||||||
syncedInvincibleCount.Value = invincibleCount;
|
syncedInvincibleCount.Value = invincibleCount;
|
||||||
|
syncedHitReactionImmuneCount.Value = hitReactionImmuneCount;
|
||||||
syncedSlowMultiplier.Value = slowMultiplier;
|
syncedSlowMultiplier.Value = slowMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -606,6 +628,14 @@ namespace Colosseum.Abnormalities
|
|||||||
OnAbnormalitiesChanged?.Invoke();
|
OnAbnormalitiesChanged?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleSyncedHitReactionImmuneChanged(int oldValue, int newValue)
|
||||||
|
{
|
||||||
|
if (oldValue == newValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
OnAbnormalitiesChanged?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 사망 시 활성 이상 상태를 모두 제거합니다.
|
/// 사망 시 활성 이상 상태를 모두 제거합니다.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using UnityEngine;
|
|||||||
|
|
||||||
using Unity.Netcode;
|
using Unity.Netcode;
|
||||||
|
|
||||||
|
using Colosseum.Abnormalities;
|
||||||
using Colosseum.Skills;
|
using Colosseum.Skills;
|
||||||
|
|
||||||
namespace Colosseum.Player
|
namespace Colosseum.Player
|
||||||
@@ -24,6 +25,9 @@ namespace Colosseum.Player
|
|||||||
[Tooltip("플레이어 네트워크 상태")]
|
[Tooltip("플레이어 네트워크 상태")]
|
||||||
[SerializeField] private PlayerNetworkController networkController;
|
[SerializeField] private PlayerNetworkController networkController;
|
||||||
|
|
||||||
|
[Tooltip("이상상태 관리자")]
|
||||||
|
[SerializeField] private AbnormalityManager abnormalityManager;
|
||||||
|
|
||||||
[Tooltip("피격 애니메이션을 재생할 Animator")]
|
[Tooltip("피격 애니메이션을 재생할 Animator")]
|
||||||
[SerializeField] private Animator animator;
|
[SerializeField] private Animator animator;
|
||||||
|
|
||||||
@@ -54,6 +58,11 @@ namespace Colosseum.Player
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsKnockbackActive => playerMovement != null && playerMovement.IsForcedMoving;
|
public bool IsKnockbackActive => playerMovement != null && playerMovement.IsForcedMoving;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 피격 반응 무시 상태 여부
|
||||||
|
/// </summary>
|
||||||
|
public bool IsHitReactionImmune => abnormalityManager != null && abnormalityManager.IsHitReactionImmune;
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
ResolveReferences();
|
ResolveReferences();
|
||||||
@@ -89,6 +98,9 @@ namespace Colosseum.Player
|
|||||||
if (networkController != null && networkController.IsDead)
|
if (networkController != null && networkController.IsDead)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (IsHitReactionImmune)
|
||||||
|
return;
|
||||||
|
|
||||||
playerMovement?.ApplyForcedMovement(worldVelocity, duration);
|
playerMovement?.ApplyForcedMovement(worldVelocity, duration);
|
||||||
|
|
||||||
if (playHitAnimation)
|
if (playHitAnimation)
|
||||||
@@ -110,6 +122,9 @@ namespace Colosseum.Player
|
|||||||
if (networkController != null && networkController.IsDead)
|
if (networkController != null && networkController.IsDead)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (IsHitReactionImmune)
|
||||||
|
return;
|
||||||
|
|
||||||
downRemainingTime = Mathf.Max(downRemainingTime, duration);
|
downRemainingTime = Mathf.Max(downRemainingTime, duration);
|
||||||
|
|
||||||
if (isDowned.Value)
|
if (isDowned.Value)
|
||||||
@@ -204,6 +219,9 @@ namespace Colosseum.Player
|
|||||||
if (networkController == null)
|
if (networkController == null)
|
||||||
networkController = GetComponent<PlayerNetworkController>();
|
networkController = GetComponent<PlayerNetworkController>();
|
||||||
|
|
||||||
|
if (abnormalityManager == null)
|
||||||
|
abnormalityManager = GetComponent<AbnormalityManager>();
|
||||||
|
|
||||||
if (animator == null)
|
if (animator == null)
|
||||||
animator = GetComponentInChildren<Animator>();
|
animator = GetComponentInChildren<Animator>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,6 +167,8 @@ namespace Colosseum.Skills
|
|||||||
// 쿨타임 시작
|
// 쿨타임 시작
|
||||||
StartCooldown(skill);
|
StartCooldown(skill);
|
||||||
|
|
||||||
|
TriggerCastStartEffects(skill);
|
||||||
|
|
||||||
// 스킬 애니메이션 재생
|
// 스킬 애니메이션 재생
|
||||||
if (skill.SkillClip != null && animator != null)
|
if (skill.SkillClip != null && animator != null)
|
||||||
{
|
{
|
||||||
@@ -179,6 +181,29 @@ namespace Colosseum.Skills
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 시전 시작 즉시 발동하는 효과를 실행합니다.
|
||||||
|
/// 서버 권한으로만 처리해 실제 게임플레이 효과가 한 번만 적용되게 합니다.
|
||||||
|
/// </summary>
|
||||||
|
private void TriggerCastStartEffects(SkillData skill)
|
||||||
|
{
|
||||||
|
if (skill == null || skill.CastStartEffects == null || skill.CastStartEffects.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (NetworkManager.Singleton != null && !NetworkManager.Singleton.IsServer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < skill.CastStartEffects.Count; i++)
|
||||||
|
{
|
||||||
|
SkillEffect effect = skill.CastStartEffects[i];
|
||||||
|
if (effect == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (debugMode) Debug.Log($"[Skill] Cast start effect: {effect.name} (index {i})");
|
||||||
|
effect.ExecuteOnCast(gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 애니메이션 이벤트가 없는 자기 자신 대상 효과는 시전 즉시 발동합니다.
|
/// 애니메이션 이벤트가 없는 자기 자신 대상 효과는 시전 즉시 발동합니다.
|
||||||
/// 버프/무적 같은 자기 강화 스킬이 이벤트 누락으로 동작하지 않는 상황을 막기 위한 보정입니다.
|
/// 버프/무적 같은 자기 강화 스킬이 이벤트 누락으로 동작하지 않는 상황을 막기 위한 보정입니다.
|
||||||
@@ -188,6 +213,9 @@ namespace Colosseum.Skills
|
|||||||
if (skill == null || skill.Effects == null || skill.Effects.Count == 0)
|
if (skill == null || skill.Effects == null || skill.Effects.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (NetworkManager.Singleton != null && !NetworkManager.Singleton.IsServer)
|
||||||
|
return;
|
||||||
|
|
||||||
if (skill.SkillClip != null && skill.SkillClip.events != null && skill.SkillClip.events.Length > 0)
|
if (skill.SkillClip != null && skill.SkillClip.events != null && skill.SkillClip.events.Length > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ namespace Colosseum.Skills
|
|||||||
[Min(0f)] [SerializeField] private float cooldown = 1f;
|
[Min(0f)] [SerializeField] private float cooldown = 1f;
|
||||||
[Min(0f)] [SerializeField] private float manaCost = 0f;
|
[Min(0f)] [SerializeField] private float manaCost = 0f;
|
||||||
|
|
||||||
|
[Header("효과 목록")]
|
||||||
|
[Tooltip("시전 시작 즉시 발동하는 효과 목록. 시전 보호 버프 등에 사용됩니다.")]
|
||||||
|
[SerializeField] private List<SkillEffect> castStartEffects = new List<SkillEffect>();
|
||||||
|
|
||||||
[Header("효과 목록")]
|
[Header("효과 목록")]
|
||||||
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 리스트 순서 = 이벤트 인덱스")]
|
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 리스트 순서 = 이벤트 인덱스")]
|
||||||
[SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
|
[SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
|
||||||
@@ -62,6 +66,7 @@ namespace Colosseum.Skills
|
|||||||
public bool BlockMovementWhileCasting => blockMovementWhileCasting;
|
public bool BlockMovementWhileCasting => blockMovementWhileCasting;
|
||||||
public bool BlockJumpWhileCasting => blockJumpWhileCasting;
|
public bool BlockJumpWhileCasting => blockJumpWhileCasting;
|
||||||
public bool BlockOtherSkillsWhileCasting => blockOtherSkillsWhileCasting;
|
public bool BlockOtherSkillsWhileCasting => blockOtherSkillsWhileCasting;
|
||||||
|
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
|
||||||
public IReadOnlyList<SkillEffect> Effects => effects;
|
public IReadOnlyList<SkillEffect> Effects => effects;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user