Files
Colosseum/Assets/_Game/Scripts/Abnormalities/ActiveAbnormality.cs
dal4segno c265f980db chore: Assets 디렉토리 구조 정리 및 네이밍 컨벤션 적용
- Assets/_Game/ 하위로 게임 에셋 통합
- External/ 패키지 벤더별 분류 (Synty, Animations, UI)
- 에셋 네이밍 컨벤션 확립 및 적용
  (Data_Skill_, Data_SkillEffect_, Prefab_, Anim_, Model_, BT_ 등)
- pre-commit hook으로 네이밍 컨벤션 자동 검사 추가
- RESTRUCTURE_CHECKLIST.md 작성

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16 19:08:27 +09:00

135 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using Colosseum.Stats;
namespace Colosseum.Abnormalities
{
/// <summary>
/// 런타임 활성 이상 상태 인스턴스
/// AbnormalityData의 인스턴스로, 실제 적용 중인 이상 상태를 관리합니다.
/// </summary>
public class ActiveAbnormality
{
/// <summary>
/// 이상 상태 데이터
/// </summary>
public AbnormalityData Data { get; }
/// <summary>
/// 효과를 건 대상 (버프/디버프 시전자)
/// </summary>
public GameObject Source { get; }
/// <summary>
/// 남은 지속 시간
/// </summary>
public float RemainingDuration { get; set; }
/// <summary>
/// 적용된 스탯 수정자 목록
/// </summary>
public List<StatModifier> AppliedModifiers { get; }
/// <summary>
/// 주기적 효과 타이머
/// </summary>
public float PeriodicTimer { get; set; }
/// <summary>
/// 고유 식별자 (네트워크 동기화용)
/// </summary>
public Guid Id { get; }
/// <summary>
/// 활성 이상 상태 생성
/// </summary>
/// <param name="data">이상 상태 데이터</param>
/// <param name="source">효과 시전자</param>
public ActiveAbnormality(AbnormalityData data, GameObject source)
{
Data = data;
Source = source;
RemainingDuration = data.duration;
PeriodicTimer = 0f;
Id = Guid.NewGuid();
AppliedModifiers = new List<StatModifier>();
}
/// <summary>
/// 지속 시간 갱신
/// </summary>
public void RefreshDuration()
{
RemainingDuration = Data.duration;
PeriodicTimer = 0f;
}
/// <summary>
/// 시간 경과 처리
/// </summary>
/// <param name="deltaTime">경과 시간</param>
/// <returns>효과가 만료되었으면 true</returns>
public bool Tick(float deltaTime)
{
// 영구 효과는 시간 감소 없음
if (Data.IsPermanent)
return false;
RemainingDuration -= deltaTime;
// 주기적 효과 타이머 업데이트
if (Data.HasPeriodicEffect)
{
PeriodicTimer += deltaTime;
}
return RemainingDuration <= 0f;
}
/// <summary>
/// 주기적 효과 발동 가능 여부 확인
/// </summary>
/// <returns>발동 가능하면 true</returns>
public bool CanTriggerPeriodic()
{
if (!Data.HasPeriodicEffect)
return false;
if (PeriodicTimer >= Data.periodicInterval)
{
PeriodicTimer -= Data.periodicInterval;
return true;
}
return false;
}
/// <summary>
/// 진행률 (0~1)
/// </summary>
public float Progress
{
get
{
if (Data.IsPermanent)
return 1f;
return Mathf.Clamp01(1f - (RemainingDuration / Data.duration));
}
}
/// <summary>
/// 남은 시간 비율 (1~0, UI 표시용)
/// </summary>
public float RemainingRatio
{
get
{
if (Data.IsPermanent)
return 1f;
return Mathf.Clamp01(RemainingDuration / Data.duration);
}
}
}
}