인프런 커뮤니티 질문&답변
Stat vs StatScaleFloat
해결된 질문
작성
·
38
0
제가 StatScaleFloat에 대해 제대로 이해하고 있는 것인지 헷갈려 질문드립니다!
StatScaleFloat은 percent type의 스탯에 의해 default value를 조절하고 싶은 스탯을 의미하는 것으로 이해를 하였습니다.
그렇다면 예를 들어 "공격력"이라는 스탯이 있다고 할 때, 해당 스탯을 percent type의 스탯만을 통해 조절하고 싶을 때는 StatScaleFloat를 써도 되지만 그와 동시에 그냥 Bonus Value를 부여하고 싶을 때는 어떻게 해야 할지 헷갈리고 있는 듯 합니다. 아마 제가 이해를 잘 못하고 있는 건가 싶기는 한데 코드를 반복해서 검토해도 감을 잡기가 힘들어 질문드려봅니다.
그리고 좋은 강의 감사드립니다~
답변 4
0
질문 내용을 정정해주셔서 감사합니다. 이제 정확히 어떤 부분을 고민하시는지 알겠습니다.
현재 강의에서 다룬 Stat 클래스는 BonusValue(덧셈)만 처리하도록 되어 있어서, 질문하신 것처럼 "최종 수치를 퍼센트로 뻥튀기"하는 기능은 추가적인 구현이 필요합니다. 핵심은 BonusScale(배율) 개념을 도입하는 것입니다.
기존 Stat 클래스에 BonusValue처럼 배율을 관리하는 변수(BonusScale)를 추가하고, 최종 값을 계산하는 공식을 수정해야 합니다.
public class Stat : IdentifiedObject
{
// [추가] 배율 보너스의 총합 (예: 10% 증가면 0.1)
private float bonusScale;
// [추가] 배율 보너스를 저장할 딕셔너리 (키 관리용)
private Dictionary<string, float> bonusScalesByKey = new Dictionary<string, float>();
// [중요] 최종 값 계산 공식 수정
// 기존: (기본값 + 보너스값)
// 수정: (기본값 + 보너스값) * (1 + 배율보너스)
public float Value
{
get
{
float totalValue = (defaultValue + bonusValue) * (1f + bonusScale);
return Mathf.Clamp(totalValue, minValue, maxValue);
}
}
// [추가] 배율을 설정하는 함수 (SetBonusValue와 비슷한 구조)
public void SetBonusScale(string key, float scale)
{
// 기존에 등록된 키라면 먼저 뺍니다 (갱신 로직)
if (bonusScalesByKey.ContainsKey(key))
bonusScale -= bonusScalesByKey[key];
bonusScalesByKey[key] = scale;
bonusScale += scale;
// (값이 변했으니 이벤트 호출하는 로직 등은 기존과 동일하게 처리)
}
}
이제 SetBonusScale이라는 무기가 생겼으니, 라바돈의 죽음모자는 이렇게 구현하면 됩니다.
public void EquipRabadon(Entity player)
{
Stat apStat = player.Stats.GetStat("AbilityPower");
// 1. 주문력 +120 (깡수치 증가) -> 기존 기능
apStat.SetBonusValue("Rabadon_Flat", 120f);
// 2. 주문력 35% 증가 (퍼센트 증가) -> 추가한 기능
// 35% 증가는 0.35를 더해주는 것과 같습니다.
// 공식: (기본 + 120) * (1 + 0.35) = 1.35배 뻥튀기
apStat.SetBonusScale("Rabadon_Scale", 0.35f);
}
만약 캐릭터의 기본 주문력이 100이라고 가정해 봅시다.
SetBonusValue로 120이 더해집니다. -> 합계 220SetBonusScale로 0.35(35%)가 적용됩니다. -> 배율 1.35최종 계산:
220 * 1.35= 297
이렇게 BonusScale 변수를 하나 추가하고 Value 계산 식에 곱하기 연산을 추가해 주시면, 롤이나 다른 RPG 게임에 나오는 다양한 퍼센트 증가 옵션을 아주 쉽게 구현하실 수 있습니다. 해당 내용은 혹시 ItemSystem 강의를 구매하셨다면 해당 강의에 더 자세히 나와있습니다.
감사합니다.
0
앗 질문을 좀 정정하겠습니다.예시로 말씀드리자면 공격력/주문력 이라는 스탯에 단순 수치를 더하는 형태(BonusValue)를 줄 수 있으면서 % 계산에 의한 증가 효과도 동시에 부여할 수 있게 하려면 어떻게 해야 할지에 대한 질문이었습니다.

이미지를 보시면 주문력을 깡으로 120을 올리면서 추가로 35%를 증가시킨다고 되어 있습니다.
이 때 Stat 클래스만 보면 깡으로 오르는 120의 수치를 SetBonusValue를 통해 반영할 수 있지만
35% 증가시키는 기능은 있어 보이지는 않아서 이런 % 계산까지 하려면 어떻게 해야할지가 질문의 본질입니다.
이 부분을 개인적으로 따로 BonusValue 라는 개념과 같이 따로 구현할 수 있는 여지의 부분인 것일까요? 아니면 현재 강의로 제공해주신 코드 구조에서 가능한 부분인 것일까요?
부족하고 어렵게 질문드려 죄송합니다.
0
수강해주셔서 감사합니다.
정확히 질문이 무엇인지 파악하지 못하여 여러 답변을 드립니다.
질문하신 "Bonus Value를 부여하고 싶을 때"는 StatScaleFloat을 건드리는 게 아니라, 원본 Stat 자체에 값을 더해주시면 됩니다.
// 1. 게임 로직에서 원본 Stat에 보너스를 부여합니다.
// (예: 버프를 받아서 공격력이 50 증가함)
attackStat.SetBonusValue("Buff_PowerUp", 50f);
// 2. StatScaleFloat을 사용하는 스킬 데미지 계산 부분
// 수강생분께서 별도로 코드를 수정하지 않아도,
// scaleStat이 참조하는 attackStat의 값이 이미 50 늘어났기 때문에
// 최종 데미지는 자동으로 증가해서 계산됩니다.
float finalDamage = skillDamageStatScale.Value;
StatScaleFloat은 Inspector에서 미리 세팅해두는 '공식'이라면, Bonus Value는 게임 도중에 수시로 변하는 값을 처리하기 위해 존재합니다. 저 같은 경우 보통 아이템 장착이나 버프 스킬을 구현할 때 다음과 같이 코드를 작성합니다.
public class EquipmentItem : MonoBehaviour
{
[SerializeField] private float bonusAttack = 10f;
// 아이템을 장착했을 때 호출
public void Equip(Entity owner)
{
// 1. 플레이어의 스탯 중 '공격력'을 찾아옵니다.
var attackStat = owner.GetStat("Attack");
// 2. 원본 스탯에 Bonus Value를 부여합니다.
// "Sword"라는 키값을 줘서 나중에 이 값만 뺄 수 있게 합니다.
if (attackStat != null)
attackStat.SetBonusValue("Sword", bonusAttack);
}
// 아이템을 해제했을 때 호출
public void Unequip(Entity owner)
{
var attackStat = owner.GetStat("Attack");
// 3. 부여했던 보너스 수치를 제거합니다.
if (attackStat != null)
attackStat.RemoveBonusValue("Sword");
}
}
Scale처럼 Inspector에서 BonusValue를 주고 싶으신거라면 StatScaleFloat을 확장해서 [Calculation Mode] 같은 옵션을 추가해 사용하면 됩니다.
public enum CalculationMode
{
Fixed, // 고정값 (Bonus Value 개념)
Scaled // 스탯 비례 (기본값 + 스탯 보정)
}
[Serializable]
public struct AdaptiveFloat
{
public CalculationMode mode;
// 1. 기본값 (고정 데미지 or 기본 수치)
// Fixed 모드일 때는 이 값 자체가 최종값이 됨
public float defaultValue;
// 2. 비례할 스탯 (Scaled 모드용)
public Stat scaleStat;
// 3. 비례 계수 (Scaled 모드용)
// 예: 0.5f면 스탯의 50%만큼 추가, 1.0f면 100% 추가
public float scaleRatio;
public float Value
{
get
{
float statValue = scaleStat != null ? scaleStat.Value : 0f;
// [Fixed 모드] : 계수 없이 정직하게 합산
// 공식: 기본데미지 + 힘
if (mode == CalculationMode.Fixed)
return defaultValue + statValue;
// [Scaled 모드] : 계수(Ratio)를 곱해서 합산
// 공식: 기본데미지 + (힘 * 0.5)
return defaultValue + (statValue * scaleRatio);
}
}
}
혹시나 질문하신게 다른 것이였다면 다시 질문해주시면 대답 드리겠습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 남경태님.
Stat과 StatScaleFloat에 대한 혼동은 처음 접하는 많은 분들이 공감하는 부분입니다. 이를 해결하기 위해 간단히 설명드리겠습니다.
StatScaleFloat의 역할
- StatScaleFloat은 기본적으로 어떤 스탯을 특정 퍼센트 타입의 스탯으로 조정하고 싶을 때 사용합니다. 특정 퍼센트 타입 스탯이 적용되어야 하는 값에 대해, 주어진 퍼센트에 맞추어 기본 값을 수정하는 역할을 하죠.
예를 들어 공격력 스탯이 있다고 할 때, 이 공격력이 특정 보너스를 통해 증가해야 하는 상황을 고려한다면 StatScaleFloat는 퍼센트 기반의 조정을 함으로써 자동으로 조정된 비율을 제공하는데 유용합니다.
보너스 값 적용
- 만약 기본 값을 퍼센트가 아닌 고정적이고 직접적인 방법으로 조정하고 싶으실 경우, Stat의 값을 직접 조정하거나 스크립트 상에서 사칙연산 등을 통해 보너스 값을 더할 수 있습니다.
고정된 보너스 값 추가 방법
- 게임 로직 내에서 직접적으로 스탯의 값을 변경하여 해당 효과를 구현할 수 있습니다.
- 게임 로직 내에서 직접적으로 스탯의 값을 변경하여 해당 효과를 구현할 수 있습니다.
퍼센트를 적용하면서 보너스 값 추가
StatScaleFloat를 사용하여 비율에 맞춰 기본 값을 조정하고, 그 계산된 값에 추가 보너스 값을 더하는 식으로 구현할 수 있습니다.
문헌의 예시를 직접 분석하는 것이 도움이 되실 수도 있습니다. 관련된 내용을 다루는 강좌나 포스트가 Inflearn 커뮤니티에 존재할 수도 있으니 참고해보세요. 아래의 코드는 StatScaleFloat와 함께 Additional Value를 더하는 방식의 예시입니다:
public float CalculateAdjustedStat(float baseValue, float percentBonus, float additionalBonus)
{
float adjustedValue = baseValue * (1 + percentBonus / 100);
adjustedValue += additionalBonus;
return adjustedValue;
}
또한 유사한 질문과 답변을 참고하시면 더 도움이 되실 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






구현 예시까지 들어주시다니 감사합니다. 해당 부분에 있어 어떤 설계가 필요한 지 앞으로 어떤게 필요할 지 감이 좀 잡혔습니다. 좋은 강의 내주셔서 감사합니다~