Skip to main content

Custom Variables

Learn how to create your own custom variable types in SoapKit.

Creating Custom Variable Types

SoapKit's architecture allows you to extend the system with your own custom variable types. This is useful when you need to work with data types not covered by the built-in variables.

Basic Custom Variable

To create a custom variable type, inherit from BaseVariable<T>:

using FarmGrowthToolkit.Soap;
using UnityEngine;

[CreateAssetMenu(menuName = "SoapKit/Variables/Custom/MyData Variable")]
public class MyDataVariable : BaseVariable<MyData>
{
// Your custom implementation here
}

Custom Operations

Add specialized operations for your data type:

[CreateAssetMenu(menuName = "SoapKit/Variables/Custom/MyData Variable")]
public class MyDataVariable : BaseVariable<MyData>
{
[ContextMenu("Reset Data")]
public void ResetData()
{
SetValue(new MyData());
}

public void ModifyProperty(float newValue)
{
MyData current = Value;
current.someProperty = newValue;
SetValue(current);
}
}

Validation and Constraints

Implement custom validation logic:

public class MyDataVariable : BaseVariable<MyData>
{
[SerializeField] private float minValue;
[SerializeField] private float maxValue;

public override void SetValue(MyData newValue)
{
if (newValue.someProperty < minValue || newValue.someProperty > maxValue)
{
Debug.LogWarning($"Value {newValue.someProperty} is outside valid range [{minValue}, {maxValue}]");
return;
}

base.SetValue(newValue);
}
}

Advanced Features

Custom Equality Comparison

Override equality comparison for complex types:

public class MyDataVariable : BaseVariable<MyData>
{
protected override bool AreValuesEqual(MyData a, MyData b)
{
if (a == null && b == null) return true;
if (a == null || b == null) return false;

return Mathf.Approximately(a.someProperty, b.someProperty);
}
}

Editor Integration

Create custom property drawers for enhanced editor experience:

#if UNITY_EDITOR
using UnityEditor;

[CustomPropertyDrawer(typeof(MyDataVariable))]
public class MyDataVariableDrawer : BaseVariablePropertyDrawer
{
// Custom inspector implementation
}
#endif

Best Practices

  1. Consistent Naming: Follow the pattern [TypeName]Variable
  2. Menu Organization: Use descriptive menu paths in CreateAssetMenu
  3. Validation: Always validate input values
  4. Documentation: Add tooltips and help text
  5. Testing: Create test cases for your custom variables

Next Steps