📖 Scenario: You are making a simple Unity game where you want to control a character's speed. You want to learn how to make variables visible and editable in the Unity Inspector while keeping your code clean and safe.
🎯 Goal: Learn the difference between public and [SerializeField] in Unity by creating a speed variable that you can edit in the Inspector but keep private in code.
📋 What You'll Learn
Create a private float variable called speed with the value 5.0f.
Add the [SerializeField] attribute to the speed variable.
Create a public float variable called jumpHeight with the value 2.0f.
Print both speed and jumpHeight values in the Start() method.
💡 Why This Matters
🌍 Real World
Game developers often need to adjust variables like speed or jump height in the Unity Editor without changing code. Using <code>public</code> or <code>[SerializeField]</code> helps with this.
💼 Career
Understanding how to control variable visibility and editing in Unity is essential for game programming jobs, enabling collaboration between programmers and designers.
Progress0 / 4 steps
1
Create private speed variable with SerializeField
Create a private float variable called speed and set it to 5.0f. Add the [SerializeField] attribute above it.
Unity
Hint
Use [SerializeField] just above the private variable declaration.
2
Add public jumpHeight variable
Add a public float variable called jumpHeight and set it to 2.0f inside the PlayerController class.
Unity
Hint
Declare the variable with the public keyword and assign 2.0f.
3
Print speed and jumpHeight in Start method
Create a Start() method and inside it, use Debug.Log to print the values of speed and jumpHeight.
Unity
Hint
Use void Start() and inside it call Debug.Log twice.
4
Run and observe output
Run the Unity game and observe the Console output showing the values of speed and jumpHeight. Write a Debug.Log statement that prints "Speed: 5" and "Jump Height: 2".
Unity
Hint
Look at the Unity Console window after running the game to see the printed values.
Practice
(1/5)
1. What is the main difference between a public variable and a [SerializeField] private variable in Unity?
easy
A. public variables are accessible by other scripts and visible in the Inspector, while [SerializeField] private variables are only visible in the Inspector but not accessible by other scripts.
B. public variables are hidden in the Inspector, but [SerializeField] private variables are accessible by all scripts.
C. public variables cannot be edited in the Inspector, but [SerializeField] private variables can be edited by other scripts.
D. public variables are only accessible inside the class, while [SerializeField] private variables are accessible everywhere.
Solution
Step 1: Understand public variable behavior
A public variable is accessible by all scripts and also visible in the Unity Inspector for editing.
Step 2: Understand [SerializeField] with private
A [SerializeField] private variable is hidden from other scripts but still visible and editable in the Inspector.
Final Answer:
public variables are accessible by other scripts and visible in the Inspector, while [SerializeField] private variables are only visible in the Inspector but not accessible by other scripts. -> Option A
Quick Check:
Access and visibility differ between public and [SerializeField] private [OK]
Hint: Public = accessible everywhere; SerializeField private = Inspector only [OK]
Common Mistakes:
Thinking SerializeField makes variable public
Assuming public variables are hidden in Inspector
Confusing private and public accessibility
2. Which of the following is the correct way to make a private variable visible in the Unity Inspector?
easy
A. private int score; [SerializeField]
B. [SerializeField] private int score;
C. public [SerializeField] int score;
D. int [SerializeField] private score;
Solution
Step 1: Recall correct attribute placement
The [SerializeField] attribute must be placed before the variable declaration.
Step 2: Check variable declaration syntax
The correct syntax is [SerializeField] private int score; to make a private variable visible in Inspector.
Final Answer:
[SerializeField] private int score; -> Option B
Quick Check:
Attribute before private variable declaration [OK]
Hint: Put [SerializeField] before private variable declaration [OK]
Common Mistakes:
Placing [SerializeField] after variable
Mixing public and [SerializeField] incorrectly
Wrong order of keywords
3. Consider this Unity C# script snippet:
public class Player : MonoBehaviour {
[SerializeField] private int health = 100;
public int score = 0;
void Start() {
Debug.Log(health);
Debug.Log(score);
}
}
What will be printed in the Unity Console when the game starts?
medium
A. Error: health is private and cannot be accessed
B. 0 and 100
C. 100 and 0
D. Nothing will print
Solution
Step 1: Understand variable values and accessibility
The private variable health is serialized and initialized to 100, so it is accessible inside the class and prints 100. The public variable score is initialized to 0 and prints 0.
Step 2: Check Debug.Log outputs
Both Debug.Log(health) and Debug.Log(score) print their current values: 100 and 0 respectively.
Final Answer:
100 and 0 -> Option C
Quick Check:
Private serialized variables accessible inside class [OK]
Hint: Private serialized variables print normally inside class [OK]
Common Mistakes:
Thinking private variables can't be accessed inside class
Confusing initialization values
Assuming serialization affects runtime access
4. You have this code in Unity:
public class Enemy : MonoBehaviour {
[SerializeField] private int damage = 10;
}
But in the Inspector, the damage value stays at 0 even after you press Play. What is the likely problem?
medium
A. The damage variable is private and cannot be changed at runtime.
B. The [SerializeField] attribute is only for public variables.
C. You forgot to make damage public to change it in code.
D. The Inspector value overrides the code assignment, so damage stays at 0.
Solution
Step 1: Understand Inspector and code value interaction
If a serialized field has a value set in the Inspector, Unity uses that value at runtime, overriding the code default initialization.
Step 2: Explain why damage stays 0
The Inspector value for damage is 0, so even though code initializes it to 10, the Inspector value overrides it.
Final Answer:
The Inspector value overrides the code assignment, so damage stays at 0. -> Option D
Quick Check:
Inspector values override code assignments at runtime [OK]
Hint: Inspector values override code assignments on serialized fields [OK]
Common Mistakes:
Assuming private variables can't be changed in code
Thinking [SerializeField] only works on public variables
Ignoring Inspector value overrides
5. You want to keep a variable speed editable in the Unity Inspector but prevent other scripts from modifying it directly. Which is the best way to declare it?
hard
A. [SerializeField] private float speed;
B. private float speed; // no attribute
C. public float speed;
D. public float speed { get; private set; }
Solution
Step 1: Identify requirement for Inspector editing and script protection
The variable must be editable in Inspector but not accessible publicly by other scripts.
Step 2: Evaluate options
public float speed; makes it public, so other scripts can modify it. private float speed; // no attribute hides it from Inspector. [SerializeField] private float speed; uses [SerializeField] with private, making it editable in Inspector but hidden from other scripts. public float speed { get; private set; } uses a public property with private setter, which is not visible in Inspector by default.