75 lines
2.7 KiB
C#
75 lines
2.7 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public class Stats : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
[Header("--- 기본 능력치 ---")]
|
|||
|
|
[SerializeField] private float baseMaxHealth = 100f;
|
|||
|
|
[SerializeField] private float baseMoveSpeed = 5f;
|
|||
|
|
[SerializeField] private float baseStrength = 10f;
|
|||
|
|
[SerializeField] private float baseAttackDamage = 10f;
|
|||
|
|
|
|||
|
|
/* =========================
|
|||
|
|
* 보너스 능력치 (카드 / 레벨업)
|
|||
|
|
* ========================= */
|
|||
|
|
[Header("--- 보너스 능력치 ---")]
|
|||
|
|
public float bonusMaxHealth;
|
|||
|
|
public float bonusMoveSpeed;
|
|||
|
|
public float bonusStrength;
|
|||
|
|
public float bonusAttackDamage;
|
|||
|
|
|
|||
|
|
/* =========================
|
|||
|
|
* 밸런스 설정
|
|||
|
|
* ========================= */
|
|||
|
|
[Header("--- 밸런스 설정 (인스펙터) ---")]
|
|||
|
|
[Tooltip("무게 1당 줄어드는 이동 속도")]
|
|||
|
|
[SerializeField] private float weightToSpeedPenalty = 0.1f;
|
|||
|
|
[SerializeField] private float runSpeedMultiplier = 1.5f;
|
|||
|
|
|
|||
|
|
private float _weightPenalty = 0f;
|
|||
|
|
|
|||
|
|
/* =========================
|
|||
|
|
* 최종 능력치 (읽기 전용 / 인스펙터 표시용)
|
|||
|
|
* ========================= */
|
|||
|
|
[Header("--- 최종 능력치 (Read Only) ---")]
|
|||
|
|
[SerializeField] private float finalMaxHealth;
|
|||
|
|
[SerializeField] private float finalMoveSpeed;
|
|||
|
|
[SerializeField] private float finalStrength;
|
|||
|
|
[SerializeField] private float finalAttackDamage;
|
|||
|
|
|
|||
|
|
private void Update()
|
|||
|
|
{
|
|||
|
|
// ⭐ 인스펙터 표시용 계산
|
|||
|
|
finalMaxHealth = MaxHealth;
|
|||
|
|
finalMoveSpeed = CurrentMoveSpeed;
|
|||
|
|
finalStrength = Strength;
|
|||
|
|
finalAttackDamage = BaseAttackDamage;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* =========================
|
|||
|
|
* 실제 게임 로직용 프로퍼티
|
|||
|
|
* ========================= */
|
|||
|
|
public float MaxHealth => baseMaxHealth + bonusMaxHealth;
|
|||
|
|
public float Strength => baseStrength + bonusStrength;
|
|||
|
|
public float BaseAttackDamage => baseAttackDamage + bonusAttackDamage;
|
|||
|
|
|
|||
|
|
public float CurrentMoveSpeed =>
|
|||
|
|
Mathf.Max(1f, baseMoveSpeed + bonusMoveSpeed - _weightPenalty);
|
|||
|
|
|
|||
|
|
public float CurrentRunSpeed => CurrentMoveSpeed * runSpeedMultiplier;
|
|||
|
|
|
|||
|
|
/* =========================
|
|||
|
|
* 외부에서 호출
|
|||
|
|
* ========================= */
|
|||
|
|
public void AddMaxHealth(float value) => bonusMaxHealth += value;
|
|||
|
|
public void AddMoveSpeed(float value) => bonusMoveSpeed += value;
|
|||
|
|
public void AddStrength(float value) => bonusStrength += value;
|
|||
|
|
public void AddAttackDamage(float value) => bonusAttackDamage += value;
|
|||
|
|
|
|||
|
|
public void UpdateWeaponWeight(float requiredStrength)
|
|||
|
|
=> _weightPenalty = requiredStrength * weightToSpeedPenalty;
|
|||
|
|
|
|||
|
|
public void ResetWeight() => _weightPenalty = 0f;
|
|||
|
|
}
|