Curve Data System
Use AnimationCurve assets to define level-based values, experience tables, stat growth, rewards, and other balance data. Designers can adjust the curve in the inspector without code changes.
Structure
CurveDataAsset (ScriptableObject)
Curve : AnimationCurve - Normalized 0..1 -> 0..1 curve
MinInput : float - Input range start
MaxInput : float - Input range end
MinOutput : float - Output range start
MaxOutput : float - Output range end
CurveDataTable (ScriptableObject)
List<Entry { Key, CurveDataAsset }>
Quick Start
1. Create a CurveDataAsset
Create -> AchUtils/Curve/Curve Data Asset
Curve : Edit in the curve editor
MinInput : 1 MaxInput : 100
MinOutput: 100 MaxOutput: 50000
2. Use It in Code
using AchUtils.Curve;
[SerializeField] CurveDataAsset hpCurve;
[SerializeField] CurveDataAsset expCurve;
float hp = hpCurve.Evaluate(player.Level);
float exp = expCurve.Evaluate(10f);
3. Group Curves With CurveDataTable
Create -> AchUtils/Curve/Curve Data Table
[SerializeField] CurveDataTable statTable;
float hp = statTable.Evaluate("HP", level);
float attack = statTable.Evaluate("Attack", level);
float def = statTable.Evaluate("Defense", level);
API
CurveDataAsset
float Evaluate(float input)
float EvaluateNormalized(float t)
Evaluate maps MinInput..MaxInput into normalized curve space, then maps the result into MinOutput..MaxOutput.
CurveDataTable
float Evaluate(string key, float input)
bool TryGetCurve(string key, out CurveDataAsset curve)
Curve Shapes
Linear growth HP scaling
-> AnimationCurve.Linear(0,0,1,1)
Exponential growth EXP requirements
-> Curve rises sharply near the end
Logarithmic growth Early-fast, late-slow attack growth
-> Curve rises sharply near the start
Step curve Grade-based rewards
-> Repeating horizontal and vertical segments
Compared to Hardcoding
// Before: hardcoded, requires a code change
float hp = level * 100 + level * level * 5;
// After: editable in the inspector
float hp = hpCurve.Evaluate(level);
::: tip Editor preview
You can add an editor script that previews evaluated values while editing CurveDataAsset in the inspector.
:::