fix: 보스 패턴 애니메이션 전환 안정화
- SkillController를 패턴 경계 기준으로 분기해 보스 첫 스킬은 즉시 시작하고 마지막 스킬만 Idle로 부드럽게 복귀하도록 조정 - 보스 패턴 실행 중 현재 스킬이 첫/마지막 스텝인지 BossBehaviorRuntimeState와 패턴 실행 경로에서 공유하도록 확장 - 패턴 내부 연속 클립 전환은 하드 전환으로 유지해 시작 프레임 스킵과 중간 Idle 복귀 문제를 줄이고 종료 전환 시간을 별도 노출
This commit is contained in:
@@ -64,6 +64,9 @@ namespace Colosseum.Enemy
|
||||
protected float nextPatternReadyTime;
|
||||
protected BossPatternExecutionResult lastPatternExecutionResult;
|
||||
protected BossPatternData lastExecutedPattern;
|
||||
protected BossPatternData activePattern;
|
||||
protected bool currentPatternSkillStartsFromIdle;
|
||||
protected bool currentPatternSkillReturnsToIdle;
|
||||
protected GameObject lastReviveCaster;
|
||||
protected GameObject lastRevivedTarget;
|
||||
protected float lastReviveEventTime = float.NegativeInfinity;
|
||||
@@ -108,6 +111,21 @@ namespace Colosseum.Enemy
|
||||
/// </summary>
|
||||
public BossPatternData LastExecutedPattern => lastExecutedPattern;
|
||||
|
||||
/// <summary>
|
||||
/// 현재 패턴 실행 중인지 여부
|
||||
/// </summary>
|
||||
public bool IsExecutingPattern => activePattern != null && lastPatternExecutionResult == BossPatternExecutionResult.Running;
|
||||
|
||||
/// <summary>
|
||||
/// 현재 스킬 스텝이 패턴 시작에서 Idle과 이어져야 하는지 여부
|
||||
/// </summary>
|
||||
public bool CurrentPatternSkillStartsFromIdle => currentPatternSkillStartsFromIdle;
|
||||
|
||||
/// <summary>
|
||||
/// 현재 스킬 스텝이 패턴 종료에서 Idle로 돌아가야 하는지 여부
|
||||
/// </summary>
|
||||
public bool CurrentPatternSkillReturnsToIdle => currentPatternSkillReturnsToIdle;
|
||||
|
||||
/// <summary>
|
||||
/// EnemyBase 접근자
|
||||
/// </summary>
|
||||
@@ -204,8 +222,11 @@ namespace Colosseum.Enemy
|
||||
/// </summary>
|
||||
public void BeginPatternExecution(BossPatternData pattern)
|
||||
{
|
||||
activePattern = pattern;
|
||||
lastExecutedPattern = pattern;
|
||||
lastPatternExecutionResult = BossPatternExecutionResult.Running;
|
||||
currentPatternSkillStartsFromIdle = false;
|
||||
currentPatternSkillReturnsToIdle = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -215,11 +236,23 @@ namespace Colosseum.Enemy
|
||||
{
|
||||
lastExecutedPattern = pattern;
|
||||
lastPatternExecutionResult = result;
|
||||
activePattern = null;
|
||||
currentPatternSkillStartsFromIdle = false;
|
||||
currentPatternSkillReturnsToIdle = false;
|
||||
|
||||
if (pattern != null && IsTerminalPatternExecutionResult(result))
|
||||
StartCommonPatternInterval();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 실행할 패턴 스킬이 패턴 시작/종료 경계인지 기록합니다.
|
||||
/// </summary>
|
||||
public void SetCurrentPatternSkillBoundary(bool startsFromIdle, bool returnsToIdle)
|
||||
{
|
||||
currentPatternSkillStartsFromIdle = startsFromIdle;
|
||||
currentPatternSkillReturnsToIdle = returnsToIdle;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 부활 스킬 사용 사실을 보스 AI에 알립니다.
|
||||
/// </summary>
|
||||
|
||||
@@ -210,6 +210,10 @@ namespace Colosseum.Enemy
|
||||
yield break;
|
||||
}
|
||||
|
||||
runtimeState.SetCurrentPatternSkillBoundary(
|
||||
startsFromIdle: IsFirstSkillStep(pattern, i),
|
||||
returnsToIdle: IsLastSkillStep(pattern, i));
|
||||
|
||||
GameObject stepTarget = currentTarget;
|
||||
if (step.Skill.JumpToTarget)
|
||||
{
|
||||
@@ -339,6 +343,8 @@ namespace Colosseum.Enemy
|
||||
if (isChargeWaiting)
|
||||
EndChargeWait(broken: false);
|
||||
|
||||
runtimeState?.SetCurrentPatternSkillBoundary(false, false);
|
||||
|
||||
if (currentPattern != null && runtimeState != null)
|
||||
{
|
||||
if (applyCooldown)
|
||||
@@ -355,6 +361,36 @@ namespace Colosseum.Enemy
|
||||
chargeTelegraphApplied = false;
|
||||
}
|
||||
|
||||
private static bool IsFirstSkillStep(BossPatternData pattern, int stepIndex)
|
||||
{
|
||||
if (pattern == null || pattern.Steps == null)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < pattern.Steps.Count; i++)
|
||||
{
|
||||
PatternStep candidate = pattern.Steps[i];
|
||||
if (candidate != null && candidate.Type == PatternStepType.Skill && candidate.Skill != null)
|
||||
return i == stepIndex;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool IsLastSkillStep(BossPatternData pattern, int stepIndex)
|
||||
{
|
||||
if (pattern == null || pattern.Steps == null)
|
||||
return false;
|
||||
|
||||
for (int i = pattern.Steps.Count - 1; i >= 0; i--)
|
||||
{
|
||||
PatternStep candidate = pattern.Steps[i];
|
||||
if (candidate != null && candidate.Type == PatternStepType.Skill && candidate.Skill != null)
|
||||
return i == stepIndex;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void ApplyPatternFlowState(BossPatternData pattern)
|
||||
{
|
||||
if (runtimeState == null || pattern == null)
|
||||
|
||||
Reference in New Issue
Block a user