Search Issue Tracker
By Design
Votes
0
Found in
2019.4
2020.3
2021.1
2021.1.3f1
2021.2
Issue ID
1329806
Regression
No
SerializeReference fields do not serialize any value when set with an integer instead of an instance of a serializable class.
Reproduction steps:
1. Open the attached project ("1329806R.zip")
2. Open the "SampleScene" scene
3. Add "BugScript" script to any Scene Game object
4. Open the Console and observe the Value
Expected result: Value persists
Actual result: Value is set to 0 (see "2p6VXycdC3.mp4" video)
Reproducible with: 2019.4.27f1, 2020.3.12f1, 2021.1.10f1, 2021.2.0a18
Not reproducible with: 2018.4.35f1 (The type or namespace name 'SerializeReferenceAttribute' could not be found (are you missing a using directive or an assembly reference?))
Note:
- Type of SerializeReference persists
Add comment
All about bugs
View bugs we have successfully reproduced, and vote for the bugs you want to see fixed most urgently.
Latest issues
- "Shader warning in 'Hidden/Light2D': implicit truncation of vector type" is thrown when building Universal 2D template
- AI Assistant breaks compilation of packages using System.Runtime.CompilerServices.Unsafe via auto-referencing
- Unity Hub checks the "Documentation" module by default on the 6.4 and 6.5 streams despite that it was unchecked with the previous installs
- Shortcut that toggles between Dopesheet and Curves Views in the Animation Window's Timeline is mislabed
- Property List Items Overlap onto the Property List's top edge when scrolling through a long Property List
Resolution Note (2021.2.X):
SerializeReference is intended for serializing classes and it applies the Unity serialization rules to that class.
In the case of an "int" this gets boxed into a object and Unity records the type as Int32, this is visible in the YAML if you save the scene. However there are no public fields in the Int32 class, so unity does not actually save the value of the int. The same would be observed with putting a raw string into an [SerializeReference]. So the behaviour is actually expected because there is nothing to serialize based on Unity rules.
To serialize an "int," technically a little wrapper class could be used instead of the system Int32 class that was automatically instantiated. However SerializeReference implies a significant overhead in both in memory and in serialized data which is disproportionate to the size of an integer. So for serializing individual small values like this best to try to serialize it as a regular field.
We've revised the reference for SerializeReference in recent release and hope it is a bit more clear now that it is intended for classes, not basic types, structs, but based on this ticket may spell it out more clearly in a future revision.