Search Issue Tracker
Fixed in 2021.1.X
Fixed in 2018.4.X, 2019.4.X, 2020.1.X, 2020.2.X
Votes
216
Found in
2018.3.0a1
2018.3.0b1
Issue ID
1080427
Regression
Yes
[SerializedField] fields produce "Field is never assigned to..." warning
1. Open the attached project (warning.zip)
2. Observe the warning in the console
Expected: field with SerializeField attribute do not produce the warning
Reproduced in 2018.3.0a1, 2018.3.0b1, 2018.3.0b2, 2019.1.0a1
Did not reproduce in 2018.2.8f1
Regression introduced in 2018.3.0a1
-
Resolution Note (fix version 2021.1):
A list where you can pass additional compiler arguments as well as a toggle to suppress common warnings is added in the Player Settings
Fixed in 2021.1.0a2 -
Resolution Note (fix version 2020.2):
Fixed in 2020.2.0b9
-
Resolution Note (fix version 2020.1):
Fixed in 2020.1.11f1
-
Resolution Note (fix version 2019.4):
Fixed in 2019.4.15f1
-
Resolution Note (fix version 2018.4):
Fixed in 2018.4.29f1
-
potato_based_username
Jan 25, 2019 23:30
If this is by design, then your design is terrible and you should be ashamed of it.
-
AlanMattano
Jan 24, 2019 17:01
I wish to vote for this issue or at least a C# video tutorial in the learning section explaining how to declare my variables now!
-
Node
Jan 19, 2019 11:00
i agree. if this is by design, then the design should be fixed. because the current design either forces you to make everything public which violates the most basic OOP principles, or just live with warnings and hope that you don't miss any actual useful warning within the spam of useless ones. disabling them in every file that has serialized fields is ridiculous.
this is definitely a design flaw and should be fixed. i just hope someone notices this within a resolved issue...
-
mikedg1
Jan 01, 2019 12:42
If this is by design, then the design has a bug, where do we submit reports for that?
-
MechEthan
Dec 19, 2018 17:41
Update: after further research, it looks like a fix is in the works: https://forum.unity.com/threads/warning-cs0649-not-suppressed-properly-when-field-is-marked-as-serializefield.556009/#post-3954073
https://github.com/dotnet/roslyn/issues/30172
It'll just take time.
-
MechEthan
Dec 19, 2018 17:19
I wonder if fixing this would require a modification to the Rosyln compiler to allow Attributes to flag a field as used? This IS actually possible because Rosyln is open source, and Unity has a seat at the .NET Foundation table.
Alternately, they could inject the pragma statements at build time for all [SerializeField] entries.
Regardless, "By Design" is kind of a lie. More like "ignoring this regression because fixing it is hard."
-
OndraPaska
Dec 17, 2018 21:51
This should be fixed, using [SerializeField] is the preferred method so it should be made easy, having everything public is bad practice.
-
ModLunar
Dec 15, 2018 16:31
Ahh no! I didn't read that someone already said what I said with the #pragma warning disable option.. sorry in advance! Lol :(
-
ModLunar
Dec 15, 2018 16:30
You can put a preprocessor directive at the beginning of your script to take the warnings away:
#pragma warning disable 0649
I too, love using [SerializeField] private in my scripts to keep encapsulation but also make use of the inspector, so I put this preprocessor directive in each script when I need it. 0649 comes from the warning code, written in the warning messages in the console. For example, it'll say something similar to this:
"Assets\Scripts\YourScript.cs(22, 38): warning CS0649: Field '...' is never assigned to, and will always..."
The CS0649 part gives you the warning number, and you can ignore other warnings with this too! ;)
-
svendkiloo
Dec 12, 2018 14:28
This can't possibly correct behaviour. Like many have mentioned [SerializeField] is used to specify that the editor WILL (and always will) assign a value to the variable, so it IS assigned to, and doesn't have its default value (unless Unity assigns the default value to it). This _has_ to be fixed. The only working alternatives would be to completely disable ALL WARNINGS about unassigned variables, and that would be quite bad, or having to add a [UsedImplicitly] to all [SerializeField] variables, which seems completely pointless, since it's already implied by the [SerializeField] that it WILL be used implicitly.
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
- The type selector in the UI Builder does not display primitive types when trying to select one in the "Select Type…" window
- Inspector's custom tooltip is displayed incorrectly when the name is truncated in UI toolkit
- Crash on ScriptableRenderLoopDraw when rendering a specific VFX in Play Mode
- The script is not renamed in the Project window when renaming and a compilation Error is present
- Average FPS in Play Mode degradation on a newly created BiRP project when it's upgraded from 2020.3.48f1 to a newer Editor version
lukaszunity
Nov 06, 2019
#pragma warning disable 0649
// your code
#pragma warning restore 0649
Or disable it globally by adding a file named csc.rsp to the root of you Assets folder, e.g. Assets/csc.rsp, with the following contents without quotes.
/nowarn:0649
This will tell the C# compiler to not emit a warning for CS0649 / unused fields.
If you have .asmdefs with csc.rsp in your project, then you also need to add the "/nowarn:0649" line to those csc.rsp files.