[Abnormality] 이상 상태 시스템 구현
- 이상 상태 데이터 (버프/디버프) ScriptableObject 정의 - 런타임임 활성 이상 상태 관리 (ActiveAbnormality) - 캐릭터터별 AbnormalityManager 컴포넌트로 이상 상태 적용/제거 - 스킬 효과(AbnormalityEffect)로 스킬에 이상 상태 연동 - UI 슬롯 및 목록 표시 구현 (버프/디버프 구분) - 테스트 코드 및 씬 설정 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
134
Assets/Scripts/Abnormalities/ActiveAbnormality.cs
Normal file
134
Assets/Scripts/Abnormalities/ActiveAbnormality.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user