Skip to main content

Value Transformation System

Transform values before sending them to target components using curves, formatting, and boolean operations.

Transformation Types

TypeApplies ToPurpose
NumericFloat, Int, Vector, ColorAnimationCurve-based range mapping
BooleanBoolSimple NOT operation (inversion)
String FormatAll typesC# composite string formatting

Numeric Transformation

Apply AnimationCurve-based transformations with input/output range mapping.

Configuration

public bool useTransformation = false;
public AnimationCurve transformationCurve = AnimationCurve.Linear(0, 0, 1, 1);
public Vector2 inputRange = new Vector2(0, 1); // Source value range
public Vector2 outputRange = new Vector2(0, 1); // Target value range

Processing Pipeline

3-Step Process:

  1. Normalize: Map input from inputRange to [0,1]

    normalized = (input - inputRange.x) / (inputRange.y - inputRange.x)
  2. Evaluate Curve: Apply AnimationCurve

    curveValue = transformationCurve.Evaluate(normalized)
  3. Scale Output: Map to outputRange

    output = outputRange.x + (curveValue * (outputRange.y - outputRange.x))

Practical Examples

Health Bar (Linear)

// Map health (0-100) to fillAmount (0-1)
Input: IntVariable playerHealth = 75
Config: inputRange = (0, 100), outputRange = (0, 1), Linear curve

Process:
normalized = (75 - 0) / (100 - 0) = 0.75
curveValue = curve.Evaluate(0.75) = 0.75
output = 0 + (0.75 * (1 - 0)) = 0.75

Result: Image.fillAmount = 0.75 (75% filled)

XP Bar (Exponential)

// Dramatic progression curve
Input: IntVariable level = 50
Config: inputRange = (1, 100), outputRange = (0, 1), EaseOut curve

Process:
normalized = (50 - 1) / (100 - 1) = 0.494
curveValue = curve.Evaluate(0.494) = 0.7 // EaseOut effect
output = 0 + (0.7 * (1 - 0)) = 0.7

Result: Appears 70% full despite level 50/100

Audio Pitch by Speed

// Engine sound pitch
Input: FloatVariable speed = 12.0
Config: inputRange = (0, 20), outputRange = (0.8, 2.0), EaseIn curve

Process:
normalized = (12 - 0) / (20 - 0) = 0.6
curveValue = curve.Evaluate(0.6) = 0.35 // EaseIn curve
output = 0.8 + (0.35 * (2.0 - 0.8)) = 1.22

Result: AudioSource.pitch = 1.22

Inverted Range (Damage Overlay)

// Low health = high opacity
Input: FloatVariable health = 25
Config: inputRange = (0, 100), outputRange = (1, 0), Linear // Inverted!

Process:
normalized = (25 - 0) / (100 - 0) = 0.25
curveValue = curve.Evaluate(0.25) = 0.25
output = 1 + (0.25 * (0 - 1)) = 0.75

Result: Damage overlay alpha = 0.75 (opaque at low health)

Common Configurations

Use CaseInput RangeOutput RangeCurve
Health → Fill Amount(0, 100)(0, 1)Linear
Health → Damage Overlay(0, 100)(1, 0)Linear (inverted)
Distance → Volume(0, 50)(1, 0)EaseOut
Speed → Anim Speed(0, 10)(0.5, 2.0)EaseIn
Level → XP Required(1, 100)(100, 10000)Exponential
Temperature → Color(-20, 40)(0.2, 1.0)Linear

Supported Types

  • FloatVariable - Direct transformation
  • IntVariable - Converted to float, transformed, rounded back
  • Vector2Variable - Per-component (X, Y)
  • Vector3Variable - Per-component (X, Y, Z)
  • ColorVariable - RGB channels (alpha preserved)

Boolean Transformation

Simple NOT operation for BoolVariable.

Configuration

public bool invertBool = false;  // true → false, false → true

Use Cases

// Hide UI when game is ready
BoolVariable isGameReady → GameObject.Active (invertBool = true)
// isGameReady = true → SetActive(false)

// Show death screen when NOT alive
BoolVariable isPlayerAlive → DeathScreen.Active (invertBool = true)
// isPlayerAlive = false → SetActive(true)

// Enable debug mode when NOT in production
BoolVariable isProduction → DebugPanel.Active (invertBool = true)

String Formatting

C# composite formatting for any variable type.

Configuration

public bool useStringFormat = false;
public string stringFormat = "{0}"; // C# format string

Format Examples

Format StringInputOutput
"{0:F2}"3.14159"3.14"
"Score: {0:N0}"1234"Score: 1,234"
"HP: {0:F0}%"87.5"HP: 88%"
"{0:P1}"0.755"75.5%"
"CPS: {0:F2}"3.14159"CPS: 3.14"
"Level {0:D2}"5"Level 05"
"{0:C}"12.50"$12.50"

Quick Reference

FormatDescriptionExample
F22 decimal places3.14
N0Thousands separator1,234
P1Percentage (1 decimal)75.5%
D3Padded integer005
CCurrency (locale)$12.50

Practical Examples

// Health percentage
IntVariable health = 87
Format: "HP: {0:F0}%"
Output: "HP: 87%"

// Score with thousands
IntVariable score = 1250000
Format: "Score: {0:N0} pts"
Output: "Score: 1,250,000 pts"

// CPS display
FloatVariable clicksPerSec = 3.14159
Format: "CPS: {0:F2}"
Output: "CPS: 3.14"

// Currency display
FloatVariable money = 1234.56
Format: "Gold: {0:C}"
Output: "Gold: $1,234.56"

Transformation Pipeline

Values flow through transformations in this order:

Source Value (SOAP Variable)

Boolean Inversion (if BoolVariable + invertBool)

Numeric Transformation (if enabled + numeric type)
1. Normalize to inputRange
2. Evaluate AnimationCurve
3. Scale to outputRange

String Formatting (if enabled)

Target Property (Unity Component)

Type Support Matrix

Variable TypeNumeric TransformBoolean InvertString Format
BoolVariable
FloatVariable
IntVariable
StringVariable
Vector2Variable✅ (per-component)
Vector3Variable✅ (per-component)
ColorVariable✅ (RGB only)
GameObjectVariable
TransformVariable

Performance Impact

TransformationOverheadNotes
NoneMinimalDirect value assignment
Boolean InvertNegligibleSingle NOT operation
Numeric TransformLowCached curve evaluation
String FormatLow-MediumString allocation per update
CombinedMediumAll transformations applied

Optimization Tips:

  • Use InitialSync mode for static formatted text
  • Avoid string formatting on high-frequency bindings (>30 FPS)
  • Prefer simple linear curves over complex multi-keyframe curves

Next Steps