- 이상 상태 데이터 (버프/디버프) ScriptableObject 정의 - 런타임임 활성 이상 상태 관리 (ActiveAbnormality) - 캐릭터터별 AbnormalityManager 컴포넌트로 이상 상태 적용/제거 - 스킬 효과(AbnormalityEffect)로 스킬에 이상 상태 연동 - UI 슬롯 및 목록 표시 구현 (버프/디버프 구분) - 테스트 코드 및 씬 설정 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
3.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|