Bird
Raised Fist0
Unityframework~5 mins

Variables and serialization in Unity

Choose your learning style10 modes available
Introduction

Variables store information your game needs. Serialization saves this information so it can be used later or shared.

You want to remember a player's score between game sessions.
You need to save the position of objects in your game world.
You want to send game data over the internet to another player.
You want to load settings or preferences when the game starts.
Syntax
Unity
public class PlayerData {
    public int score;
    public string playerName;
}

// To save data
PlayerData data = new PlayerData();
data.score = 100;
data.playerName = "Alex";

// To serialize (convert to JSON string)
string json = JsonUtility.ToJson(data);

// To deserialize (convert back to object)
PlayerData loadedData = JsonUtility.FromJson<PlayerData>(json);

Use public variables or [SerializeField] to make variables visible to Unity's serialization.

Unity's JsonUtility helps convert objects to and from JSON format easily.

Examples
This class holds game settings that can be saved and loaded.
Unity
public class GameSettings {
    public float volume = 0.5f;
    public bool isFullScreen = true;
}
This converts the settings object into a JSON string and prints it.
Unity
GameSettings settings = new GameSettings();
string json = JsonUtility.ToJson(settings);
Debug.Log(json);
This loads settings from a JSON string and prints the volume value.
Unity
string json = "{\"volume\":0.8,\"isFullScreen\":false}";
GameSettings loadedSettings = JsonUtility.FromJson<GameSettings>(json);
Debug.Log(loadedSettings.volume);
Sample Program

This Unity script creates a player data object, saves it as JSON, then loads it back and prints both steps.

Unity
using UnityEngine;

public class SerializationExample : MonoBehaviour {
    [System.Serializable]
    public class PlayerData {
        public int score;
        public string playerName;
    }

    void Start() {
        PlayerData player = new PlayerData();
        player.score = 250;
        player.playerName = "Sam";

        // Serialize to JSON
        string json = JsonUtility.ToJson(player);
        Debug.Log("Serialized JSON: " + json);

        // Deserialize back to object
        PlayerData loadedPlayer = JsonUtility.FromJson<PlayerData>(json);
        Debug.Log($"Loaded Player Name: {loadedPlayer.playerName}, Score: {loadedPlayer.score}");
    }
}
OutputSuccess
Important Notes

Mark classes with [System.Serializable] so Unity knows to serialize them.

Only public fields or fields marked with [SerializeField] are saved by Unity.

Serialization helps keep your game data safe between sessions or share it easily.

Summary

Variables hold data your game uses.

Serialization turns data into a format that can be saved or sent.

Unity's JsonUtility makes serialization simple and fast.

Practice

(1/5)
1. What is the main purpose of serialization in Unity?
easy
A. To convert data into a format that can be saved or sent
B. To create new game objects during runtime
C. To increase the speed of the game
D. To change the color of game objects

Solution

  1. Step 1: Recall the definition of serialization

    Serialization means converting data into a format that can be saved or sent.
  2. Step 2: Match Unity's use of serialization

    Unity uses serialization to save game data or send it over networks.
  3. Final Answer:

    To convert data into a format that can be saved or sent -> Option A
  4. Quick Check:

    Serialization = convert data for saving/sending [OK]
Hint: Serialization means saving or sending data format [OK]
Common Mistakes:
  • Confusing serialization with creating objects
  • Thinking serialization changes game speed
  • Mixing serialization with visual changes
2. Which of the following is the correct way to declare a public integer variable in a Unity C# script?
easy
A. int score public;
B. int public score;
C. public int score;
D. public integer score;

Solution

  1. Step 1: Recall C# variable declaration syntax

    In C#, access modifier comes first, then type, then variable name.
  2. Step 2: Check each option

    public int score; ('public int score;') follows correct order. Options A, B, C have wrong order or wrong type keyword.
  3. Final Answer:

    public int score; -> Option C
  4. Quick Check:

    Access modifier + type + name = correct declaration [OK]
Hint: Access modifier before type before name in C# [OK]
Common Mistakes:
  • Putting 'public' after variable name
  • Using 'integer' instead of 'int'
  • Incorrect order of keywords
3. What will be the output of this Unity C# code?
using UnityEngine;

public class PlayerData {
    public string playerName = "Alex";
    public int level = 5;
}

public class Test : MonoBehaviour {
    void Start() {
        PlayerData data = new PlayerData();
        string json = JsonUtility.ToJson(data);
        Debug.Log(json);
    }
}
medium
A. Error: JsonUtility.ToJson requires MonoBehaviour
B. {"playerName":Alex,"level":5}
C. {"playerName":"Alex",level:5}
D. {"playerName":"Alex","level":5}

Solution

  1. Step 1: Understand JsonUtility.ToJson output format

    JsonUtility converts object fields to JSON string with keys and values in quotes where needed.
  2. Step 2: Check the JSON string format

    Strings have quotes, numbers do not. {"playerName":"Alex","level":5} matches correct JSON format with quotes around "Alex" and keys.
  3. Final Answer:

    {"playerName":"Alex","level":5} -> Option D
  4. Quick Check:

    JsonUtility outputs valid JSON string [OK]
Hint: JsonUtility outputs JSON with quotes around strings [OK]
Common Mistakes:
  • Missing quotes around string values
  • Using invalid JSON syntax
  • Thinking JsonUtility needs MonoBehaviour object
4. Identify the error in this Unity C# code snippet:
using UnityEngine;

public class Player {
    public int score;
}

public class Game : MonoBehaviour {
    void Start() {
        Player player = new Player();
        string json = JsonUtility.ToJson(player);
        Debug.Log(json);
    }
}
medium
A. No error; code will output {"score":0}
B. Player class must inherit from MonoBehaviour to serialize
C. JsonUtility.ToJson requires static method call
D. score variable must be private to serialize

Solution

  1. Step 1: Check if Player class can be serialized

    JsonUtility can serialize plain classes with public fields, no need to inherit MonoBehaviour.
  2. Step 2: Check output of JsonUtility.ToJson

    Player's score defaults to 0, so JSON string will be {"score":0}.
  3. Final Answer:

    No error; code will output {"score":0} -> Option A
  4. Quick Check:

    Plain class with public fields serializes fine [OK]
Hint: Public fields in plain classes serialize without MonoBehaviour [OK]
Common Mistakes:
  • Thinking class must inherit MonoBehaviour to serialize
  • Assuming private fields serialize by default
  • Believing JsonUtility requires static context
5. You want to save player settings including volume (float), username (string), and isFullScreen (bool) using Unity's JsonUtility. Which class definition correctly supports serialization of these variables?
hard
A. public class Settings { private float volume; private string username; private bool isFullScreen; }
B. public class Settings { [SerializeField] private float volume; [SerializeField] private string username; [SerializeField] private bool isFullScreen; }
C. public class Settings { protected float volume; protected string username; protected bool isFullScreen; }
D. public class Settings { public float volume { get; set; } public string username { get; set; } public bool isFullScreen { get; set; } }

Solution

  1. Step 1: Understand JsonUtility serialization rules

    JsonUtility serializes public fields or private fields marked with [SerializeField] attribute.
  2. Step 2: Evaluate each class definition

    public class Settings { protected float volume; protected string username; protected bool isFullScreen; } uses protected fields, which do not serialize. public class Settings { private float volume; private string username; private bool isFullScreen; } uses private fields without [SerializeField], so no serialization. public class Settings { [SerializeField] private float volume; [SerializeField] private string username; [SerializeField] private bool isFullScreen; } uses private fields with [SerializeField], which works. public class Settings { public float volume { get; set; } public string username { get; set; } public bool isFullScreen { get; set; } } uses properties, which JsonUtility does not serialize.
  3. Step 3: Choose best practice

    Using private fields with [SerializeField] is recommended for encapsulation and serialization.
  4. Final Answer:

    public class Settings { [SerializeField] private float volume; [SerializeField] private string username; [SerializeField] private bool isFullScreen; } -> Option B
  5. Quick Check:

    Private fields + [SerializeField] serialize correctly [OK]
Hint: Use [SerializeField] for private variables to serialize [OK]
Common Mistakes:
  • Assuming private fields serialize without attribute
  • Using properties instead of fields for serialization
  • Ignoring encapsulation best practices
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard