My structs are acting like classes in scriptable object.

I have made a map editor for one of my projects and all the information for each map is stored in a scriptable object each. The problem I have is that even though all the variables are structs, when I change the local variables in the map editor script the variables change in the scriptable object as well. That should only happen when i click a “Save map”-button. All the variables in the map editor script have a counterpart in the scriptable object, but I do have to use prefixes to differentiate between them so I am pretty sure I am not assigning the values to the wrong variables. I am using a custom interface for the map editor.

This is something I tried:

  • I changed all values to 0 in the scriptable object, aka it is a flat map now.
  • I manually changed one value to something other than 0 in the scriptable object, so I should see a big spike in height somewhere on the map.
  • I clicked play, which will copy all the variables from the scriptable object to the map editor script, and the map will be displayed. I did see the height spike.
  • I changed a bunch of values in the map editor script, not manually, and did not save.
  • I checked the values in the scriptable object, and by now they have all changed to their map editor script conterpart. Why?

I though only classes did that and structs had their own local value. What is going on?

You are correct that structs are stored by value, and not be reference. However you incorrectly assumed that a ScriptableObject was a struct, which it is not.

ScriptableObject inherits from UnityEngine.Object, which makes it a class, and will always be by reference. You need to use ScriptableObject.CreateInstance to create a new copied version of your scriptable object that you can modify without changing the original.