업그레이드 데이터 입력 로직 및 기능 추가
캐릭터 스탯을 PlayerStats 컴포넌트에서 모아서 관리하도록 변경 코드에서도 마찬가지
This commit is contained in:
144
Assets/Scripts/PlayerStats.cs
Normal file
144
Assets/Scripts/PlayerStats.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Northbound.Data;
|
||||
|
||||
namespace Northbound
|
||||
{
|
||||
/// <summary>
|
||||
/// 플레이어 스탯 계산 컴포넌트
|
||||
/// 기본 스탯 + 업그레이드 보너스를 계산하여 반환
|
||||
/// </summary>
|
||||
public class PlayerStats : MonoBehaviour
|
||||
{
|
||||
[Header("Base Stats")]
|
||||
[SerializeField] private int baseMaxHp = 100;
|
||||
[SerializeField] private int baseDamage = 10;
|
||||
[SerializeField] private int baseCapacity = 100;
|
||||
[SerializeField] private float baseManpower = 10f;
|
||||
[SerializeField] private float baseMoveSpeed = 5f;
|
||||
[SerializeField] private float baseSight = 10f;
|
||||
[SerializeField] private float baseAttackRange = 2f;
|
||||
|
||||
private PlayerUpgradeManager _upgradeManager;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_upgradeManager = GetComponent<PlayerUpgradeManager>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 스탯에 대한 업그레이드 보너스 계산 (ADD만 지원)
|
||||
/// </summary>
|
||||
private float CalculateStatBonus(string statName)
|
||||
{
|
||||
float bonus = 0f;
|
||||
|
||||
if (_upgradeManager == null)
|
||||
return bonus;
|
||||
|
||||
var ownedUpgrades = _upgradeManager.GetOwnedUpgradeData();
|
||||
|
||||
foreach (var upgrade in ownedUpgrades)
|
||||
{
|
||||
if (upgrade == null) continue;
|
||||
|
||||
// effectStatList에서 해당 스탯 찾기
|
||||
for (int i = 0; i < upgrade.effectStatList.Count; i++)
|
||||
{
|
||||
if (i >= upgrade.effectOpList.Count || i >= upgrade.effectValueList.Count)
|
||||
continue;
|
||||
|
||||
if (upgrade.effectStatList[i] == statName)
|
||||
{
|
||||
string op = upgrade.effectOpList[i];
|
||||
float value = upgrade.effectValueList[i];
|
||||
|
||||
// ADD 연산만 지원
|
||||
if (op == "add")
|
||||
{
|
||||
bonus += value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 최대 체력 반환
|
||||
/// </summary>
|
||||
public int GetMaxHp()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_max_hp");
|
||||
return baseMaxHp + (int)bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 공격력 반환
|
||||
/// </summary>
|
||||
public int GetDamage()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_atk_damage");
|
||||
return baseDamage + (int)bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 자원 용량 반환
|
||||
/// </summary>
|
||||
public int GetCapacity()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_capacity");
|
||||
return baseCapacity + (int)bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 노동력(건설/채굴 작업량) 반환
|
||||
/// </summary>
|
||||
public float GetManpower()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_manpower");
|
||||
return baseManpower + bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이동 속도 반환
|
||||
/// </summary>
|
||||
public float GetMoveSpeed()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_move_speed");
|
||||
// move_speed는 mul 연산이지만, 우선 ADD만 지원하므로 add로 처리
|
||||
return baseMoveSpeed + bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 시야 범위 반환
|
||||
/// </summary>
|
||||
public float GetSight()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_sight");
|
||||
return baseSight + bonus;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 공격 범위 반환
|
||||
/// </summary>
|
||||
public float GetAttackRange()
|
||||
{
|
||||
float bonus = CalculateStatBonus("player_atk_range");
|
||||
return baseAttackRange + bonus;
|
||||
}
|
||||
|
||||
#region Base Stat Setters (에디터/초기화용)
|
||||
|
||||
public void SetBaseMaxHp(int value) => baseMaxHp = value;
|
||||
public void SetBaseDamage(int value) => baseDamage = value;
|
||||
public void SetBaseCapacity(int value) => baseCapacity = value;
|
||||
public void SetBaseManpower(float value) => baseManpower = value;
|
||||
public void SetBaseMoveSpeed(float value) => baseMoveSpeed = value;
|
||||
public void SetBaseSight(float value) => baseSight = value;
|
||||
public void SetBaseAttackRange(float value) => baseAttackRange = value;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user