Just an idea, I haven’t tried it yet.
You create your ScriptableObject, but you also put a member variable which has the same type as your SO.
On Awake you clone your SO and the resulting instance go to this reference. When you need the “default” values, you use the base scriptable object’s values, when you need a runtime value, then you use this clone.
You can find how to clone a SO runtime here .
Pseudocode:
using UnityEngine;
public class ExampleSO : ScriptableObject
{
public int A;
public int B;
public ExampleSO runtime;
private void Awake()
{
runtime = clone();
}
}